我花了幾個小時試圖讓 cURL(在 PHP 中)與瑞典銀行 ID 服務一起作業,并遇到以下兩個證書錯誤:
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,但我仍然得到這兩個錯誤中的任何一個(當我嘗試選項的一些變體時,我得到一個,當我嘗試其他一些變體時,我得到另一個錯誤)。
如此 SO question中所述,我按照使用 Firefox 匯出它的建議獲得了服務器證書。證書檔案位于正確的位置并且可讀。
uj5u.com熱心網友回復:
原來問題出在證書檔案本身的內容上。
首先,使用 Firefox 匯出它不會為您提供正確的證書。它應該從BankID 集成指南下載。查看或部分Issuer of server certificate中的擴展標題下,并復制以開頭的實際證書字串Production environmentTest 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 可以讀取它并且您復制了正確的(生產/測驗)證書,具體取決于您呼叫的是測驗還是生產網址的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455945.html
