【发布时间】:2016-09-17 12:11:19
【问题描述】:
我会解释一下情况。
短版本是我收到了一个 ssl 证书,我需要将它包含在一些 HTTP 请求中。而且我还没有正确地做到这一点。
我正在使用Guzzle 提出请求。
我收到了以
开头的字符串形式的证书-----BEGIN CERTIFICATE-----
并以
结尾-----END CERTIFICATE-----.
首先,我不能 100% 确定,我要如何处理它才能准备好包含在请求中。我将它保存为mycert.crt 文件。正如 Guzzle 文档提到的他们需要一个 .pem 文件,我考虑将 .crt 文件转换为 .pem 文件。找到this stackoverflow thread,都试过了,但都没有用(顺便说一句,.crt 和 .pem 的内容是相同的)。让我解释一下,什么不起作用。
我做了一个
$client = new GuzzleHttp\Client(['base_uri' => 'https://theuri.com']);
$client->request('GET', 'getit', ['cert' => 'path/to/mycert.pem' ]);
结果是
[GuzzleHttp\Exception\ConnectException]
cURL error 35: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
我读到这是一些标准错误,当您在使用证书提出请求的整个过程中搞砸了一些事情时。
我还有用于创建 SSL 密钥的 private.key 文件和 request.csr。不知道我现在是否需要对这些做任何事情。
我没有在网上找到太多有用的信息。我发现的线程或文章没有从头到尾解释整个过程,所以我对我尝试过的任何方法都没有信心。
编辑:
我发现我可能应该使用
$client->request('GET', '/getit', ['verify' => 'path/to/mycert.pem'])
它给了我例外
GuzzleHttp\Exception\ConnectException with message 'cURL error 35: SSL peer handshake failed, the server most likely requires a client certificate to connect (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)'
如果我使用 'cert' 执行此操作,则表示它无法加载证书及其私钥。我怀疑使用“证书”是要走的路。
【问题讨论】:
-
我对系统完全不熟悉,但是根据这个文件docs.guzzlephp.org/en/latest/request-options.html#verify-option你的
getit应该是一个斜线。不确定getit代表什么,但可能需要是/getit或/getit/。对不起,如果没有意义。 -
感谢您查看它,但 url 是正确的,好像我根本没有包含任何“证书”,它返回需要证书的错误。 :)
标签: php ssl httprequest guzzle