我花了几个小时试图让cURL (在PHP中)使用瑞典BankID服务,并遇到以下两个证书错误:
CURL ERROR 60: SSL certificate problem: unable to get local issuer certificate
CURL ERROR 77: error setting certificate verify locations:
CAfile: C:\test\bankid\bankid_test_server.pem
CApath: C:\test\bankid\bankid_test_server.pem我用来初始化cURL的代码如下:
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd().DIRECTORY_SEPARATOR.$bankidServerCertFile);
curl_setopt($ch, CURLOPT_CAPATH, getcwd().DIRECTORY_SEPARATOR.$bankidServerCertFile);
curl_setopt($ch, CURLOPT_SSLCERT, $clientCertFile);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $clientCertPass);
curl_setopt($ch, CURLOPT_SSLKEY, $clientCertKeyFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $clientCertKeyPass);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));我尝试过各种不同的CURLOPT_CAINFO和CURLOPT_CAPATH选项,但是我仍然得到了这两个错误中的任何一个(当我尝试一些选项的变化时,我得到了一个选项,当我尝试其他一些变化时,我得到了另一个错误)。
我按照建议使用Firefox导出服务器证书,如这个问题所述。证书文件位于正确的位置并可读。
发布于 2022-03-31 09:49:02
结果发现问题是证书文件本身的内容。
首先,使用Firefox导出它并不能给出正确的证书。它应该从BankID集成指南下载。在Production environment或Test environment部分中的展开头Test environment下面查看,然后复制实际的证书字符串
-----BEGIN CERTIFICATE-----
并以
-----END CERTIFICATE-----
(包括起始行和结束行)。
第二,如果您只将cURL粘贴到文本文件中,那么它仍然不能正常工作。它似乎需要以某种方式格式化,更精确地细分为64个字符的长行。
您可以使用在线工具(如samltool.com -格式化X.509证书 )来执行此操作。将复制的文本粘贴到字段X.509 cert中,按Format X.509 certificate,然后从字段X.509 cert with header复制文本。将其粘贴到服务器上的证书文件中(在我的例子中是C:\test\bankid\bankid_test_server.pem)。该文件现在应该从
-----BEGIN CERTIFICATE-----
后面跟着一串64个字符的长行,最后以
-----END CERTIFICATE-----
如果它仍然不起作用,请确保证书文件的路径是正确的,它是PHP可读的,并且根据您是否调用测试或产品URL复制了正确的(生产/测试)证书。
https://stackoverflow.com/questions/71690412
复制相似问题