我一直在与这个问题作斗争,似乎无法做到这一点。作为序言,这是我第一次使用SSL。我正在使用的服务器是使用PHP 5.6.30和Laravel 5.1.46,我试图使用GuzzleHttp 6.2.3将JSON发布给第三方。到目前为止,我通过在客户端中指定'verify' => false
来禁用ssl验证,并且能够获得成功的响应。第三方向我提供了使用证书,并给了我.pem和.cer格式。他们声明证书不受密码保护,因为它是公钥。根据GuzzleHttp的文档,我的请求应如下所示:
$response = $client->request('POST', $endpoint, [
'cert' => /path/to/new/cert.pem,
'headers' => [
'Content-type' => 'application/json'
],
'body' => $request_body,
'connect_timeout' => 5,
]);
我无法使用此方法进行连接,遗憾的是,由于我正在处理的服务器的设计,我无法获得低级错误详细信息(它是一个大型的预先存在的代码库I&# #39;我必须更新,希望最终完全重写。)
为了获得更多细节,我决定使用cURL发送请求。首先,我发送了没有证书的请求:
// REQUEST
curl -v -H "Content-Type: application/json" -X POST -d '{"some_json_request": "value"}' https://sometargeturl.com:8443/dosomething
// OUTPUT
* Trying 204.71.178.10...
* TCP_NODELAY set
* Connected to sometargeturl.com (204.71.178.10) port 8443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* Server certificate:
* subject: CN=sometargeturl.com,OU=OU,O="Some Company Name, Inc",L=Pleasanton,ST=California,C=US
* start date: May 13 00:00:00 2016 GMT
* expire date: May 14 23:59:59 2018 GMT
* common name: sometargeturl.com
* issuer: CN=Symantec Class 3 Secure Server CA - G4,OU=Symantec Trust Network,O=Symantec Corporation,C=US
* NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)
* Peer's Certificate issuer is not recognized.
* Curl_http_done: called premature == 1
* Closing connection 0
curl: (60) Peer's Certificate issuer is not recognized.
然后,凭证书:
// REQUEST
curl -v --cert /path/to/the/cert.pem -H "Content-Type: application/json" -X POST -d '{"some_json_request": "value"}' https://sometargeturl.com:8443/dosomething
// OUTPUT
* Trying 204.71.178.10...
* TCP_NODELAY set
* Connected to sometargeturl.com (204.71.178.10) port 8443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
* NSS error -8178 (SEC_ERROR_BAD_KEY)
* Peer's public key is invalid.
* Curl_http_done: called premature == 0
* Closing connection 0
curl: (58) unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
我做了大量研究,但未能找到解决方案。在这一点上,我真的只是不确定下一步。我最终将需要使用GuzzleHttp发送请求,但我不知道我错过了什么。我已经阅读了有关将新证书添加到现有CA捆绑包的信息,但是我不确定这是否是正确的解决方案/如果是这样我将如何做到这一点。任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
你到底想要做什么?
'verify' => true
话虽如此,你的卷曲是针对NSS而不是openssl编译的。
NSS error -8178 (SEC_ERROR_BAD_KEY)
来自NSS,它不支持将私钥作为文件提供