Mih*_*org 4 php ssl httprequest guzzle
我会解释一下情况。
简而言之,我已经收到了 ssl 证书,我需要将其包含在一些 HTTP 请求中。而且我还没有成功地做到这一点。
我正在使用Guzzle来提出请求。
我已收到以字符串形式开头的证书
-----BEGIN CERTIFICATE-----
并以
-----END CERTIFICATE-----。
首先,我不是 100% 确定,我必须如何处理它才能使其准备好包含在请求中。我将其保存为mycert.crt文件。正如 Guzzle 文档提到的,他们需要一个 .pem 文件,我研究了将 .crt 文件转换为 .pem 文件。找到了这个 stackoverflow 线程,尝试了它们,但它不起作用(顺便说一句,.crt 和 .pem 内容是相同的)。让我解释一下,什么不起作用。
我制造了一个
$client = new GuzzleHttp\Client(['base_uri' => 'https://theuri.com']);
$client->request('GET', 'getit', ['cert' => 'path/to/mycert.pem' ]);
Run Code Online (Sandbox Code Playgroud)
结果是
[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)
Run Code Online (Sandbox Code Playgroud)
我读到,当您在使用证书发出请求的整个过程中搞砸了某些事情时,这是一些标准错误。
我还有 private.key 文件和 request.csr,它们用于创建 SSL 密钥。不确定我现在是否需要对这些做任何事情。
我在网上没有找到太多有用的信息。我发现的线程或文章没有从头到尾解释整个过程,所以我对我尝试过的任何方法都没有信心。
编辑:
我发现我可能应该使用
$client->request('GET', '/getit', ['verify' => 'path/to/mycert.pem'])
Run Code Online (Sandbox Code Playgroud)
它给了我例外
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)'
Run Code Online (Sandbox Code Playgroud)
如果我使用“cert”来执行此操作,则表示无法加载证书及其私钥。我怀疑使用“cert”是可行的方法。
好吧,我现在已经弄清楚了。我之前没有任何证书方面的经验。我在OS X上完成了这一切,但你应该明白了。有些事情(例如将私钥添加到钥匙串中)可能会有所不同。
为此,您需要证书本身和随附的私钥。在终端中,您可以使用openssl命令来完成此操作。完整的命令是
openssl pkcs12 -export -clcerts -inkey ~/private.key -in ~/certificate.crt -out MyCertPKCS12.p12 -name "Full Name"
Run Code Online (Sandbox Code Playgroud)
现在您已经创建了一个文件 MyCertPKCS12.p12,您必须将其添加到您的钥匙串并包含在 http 请求中。该文件带有密码,运行此命令后将要求您输入密码。
打开钥匙串访问并导入 .p12 文件。起初遇到了一些信任问题,必须手动设置哪些组件信任该证书。为此,请打开“钥匙串访问”。左上角是钥匙串列表,选择系统,您将在那里看到新添加的证书。双击它打开,您可以从那里设置信任该证书的内容。
首先,如果您必须执行简单的 GET 请求,您可以在浏览器中输入 URL,系统会询问您是否允许使用证书。允许它并选择证书。现在一切都应该正常了。如果没有,请谷歌搜索错误消息。
使用证书执行 GuzzleHttp 请求的过程如下:
$client = new GuzzleHttp\Client(['base_uri' => 'https://muchsecure.wow']);
$cert = "/path/to/MyCertPKCS12.p12";
$method = "GET"; //or whatever the method is
$response = $client->request($method, '/getinfo', ['cert' => [
$cert, 'epicpasswordISetForTheP12File'
]])
Run Code Online (Sandbox Code Playgroud)
现在您已使用证书发出了对 url https://muchsecure.wow/getinfo的请求。
如果您还有其他问题,我很乐意为大家提供帮助。