为 http 请求准备 ssl 证书

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”是可行的方法。

Mih*_*org 5

好吧,我现在已经弄清楚了。我之前没有任何证书方面的经验。我在OS X上完成了这一切,但你应该明白了。有些事情(例如将私钥添加到钥匙串中)可能会有所不同。

  1. 生成 PKCS#12 证书文件

为此,您需要证书本身和随附的私钥。在终端中,您可以使用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 请求中。该文件带有密码,运行此命令后将要求您输入密码。

  1. 将 PKCS#12 文件添加到您的钥匙串

打开钥匙串访问并导入 .p12 文件。起初遇到了一些信任问题,必须手动设置哪些组件信任该证书。为此,请打开“钥匙串访问”。左上角是钥匙串列表,选择系统,您将在那里看到新添加的证书。双击它打开,您可以从那里设置信任该证书的内容。

  1. 使用证书发出 http 请求

首先,如果您必须执行简单的 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的请求。

如果您还有其他问题,我很乐意为大家提供帮助。