如何使用GuzzleHttp / cURL

时间:2017-10-04 19:50:16

标签: php laravel ssl curl guzzle

我一直在与这个问题作斗争,似乎无法做到这一点。作为序言,这是我第一次使用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捆绑包的信息,但是我不确定这是否是正确的解决方案/如果是这样我将如何做到这一点。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

你到底想要做什么?

  • 使用'verify' => true
  • 验证远程服务器证书
  • 通过将证书提供给远程来验证自己吗?

话虽如此,你的卷曲是针对NSS而不是openssl编译的。 NSS error -8178 (SEC_ERROR_BAD_KEY)来自NSS,它不支持将私钥作为文件提供