老王今天发现部署在服务器上的一个 PHP 脚本不工作了,运行了下发现是 file_get_contents() 函数报错:SSL operation failed with code 1. OpenSSL Error,本文记录下解决方法。
一、问题描述
写了个测试脚本,用到 file_get_contents() 的代码如下:
$response = file_get_contents("https://exeample.com")
不工作的原因是 file_get_contents() 函数报错,错误编号是 SSL operation failed with code 1. OpenSSL Error,如下:
PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in test.php on line 40 PHP Warning: file_get_contents(): Failed to enable crypto in test.php on line 40 PHP Warning: file_get_contents(https://exeample.com): failed to open stream: operation failed in test.php on line 40
截图如下:
二、问题原因与解决方法
老王后来在网上找到了这个问题的原因:在 PHP 5.6 中对 OpenSSL 进行了更改,有一个设置为 false 的参数:”verify_peer_name”=>false,详见官方文档:http://php.net/manual/en/migration56.openssl.php
因此,这个问题的解决方法就是增加这个 false 的参数,上面的代码变成了这样:
$arrContextOptions=array( "ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $response = file_get_contents("https://exeample.com", false, stream_context_create($arrContextOptions));
之后再跑就正常了。