SSL证书问题:无法获得颁发者证书

时间:2019-03-14 17:06:44

标签: php ssl openssl php-curl

我目前正在通过在本地Windows机器上的命令行中执行使用curl的php脚本,在带有证书的网站上测试API。但是脚本永远无法到达服务器。我已经找到了针对这个似乎很常见的错误的解决方案,并尝试了以下操作,但均未成功:

  • 确保证书仍然有效。
  • 确保已在php.ini中启用了openssl php扩展名,并且确实存在.dll。
  • 按照https://curl.haxx.se/docs/caextract.html的答案中的说明,从this question下载了最新的证书捆绑包,并将其添加到php.ini中。我还检查了我尝试联系的网站的证书颁发机构确实在该捆绑包中(在我的情况下为Comodo)。
  • 下载了较旧的证书包,该证书包更接近网站证书有效期的开始。
  • 直接通过this link从证书颁发机构下载证书,并将.crt添加到我的php.ini文件中。
  • 使用this tool将上面检索的.crt文件转换为.pem,然后将其添加到php.ini中(替换上面的文件)。

这是我用于测试的脚本(我仅在命令行中使用php执行该脚本):

$data = 'username=myuser&password=mypassword';
$ch = curl_init('https://my.website.com/auth');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
curl_close($ch);

如果我取消注释其中的两行以完全绕过证书验证,它会完美运行,但我想避免这种情况。

在所有情况下,我都尝试过使用正斜杠和反斜杠的路径,我确定使用了正确的php.ini,并且php确实可以访问.pem文件位置。 php脚本的输出确认了这一点(我已经替换了我正在使用的实际网址):

> *   Trying 192.168.200.11...
> * TCP_NODELAY set
> * Connected to my.website.com (192.168.200.11) port 443 (#0)
> * ALPN, offering http/1.1
> * successfully set certificate verify locations:   
> CAfile: C:\Development\examples\COMODORSADomainValidationSecureServerCA.pem  
> CApath: none
> * NPN, negotiated HTTP1.1
> * SSL certificate problem: unable to get issuer certificate
> * stopped the pause stream!
> * Closing connection 0

我目前没有办法检查我做错了什么以及如何解决。

2 个答案:

答案 0 :(得分:0)

您是否可以使用curl从命令行连接到服务器?

curl -vs https://my.website.com/auth --cacert C:\Development\examples\COMODORSADomainValidationSecureServerCA.pem 

服务器证书和您下载的捆绑软件之间可能不匹配,即证书不在捆绑软件中。

如果已安装openssl,则可以使用以下方式从服务器中提取CA证书:

openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

有关类似问题的说明,请参见here

答案 1 :(得分:0)

因此,最后,这就是我最终设法做到的方式:如错误所提示,并且有几个答案也指出,我的配置中缺少证书颁发机构的证书链,并且不在包装中从https://curl.haxx.se/docs/caextract.html下载。

因此,最后,我发现this question为我指明了正确的方向:我去了我尝试使用firefox连接的网站,并将证书导出为“ X.509带链证书的证书” (PEM)”添加到文件C:/Development/examples/mycert.pem。然后,我将php.ini配置更改为

  

curl.cainfo = C:/Development/examples/my.website.com.pem   openssl.cafile = C:/Development/examples/my.website.com.pem

那就成功了!我可以毫无问题地连接到网站。

还可以简单地将my.website.com.pem的内容复制粘贴到从https://curl.haxx.se/docs/caextract.html下载的文件的末尾,它也可以正常工作,如果需要,它的用途可能更广泛。连接到其他使用php curl证书的网站。