为 http 请求准备好 ssl 证书
Getting a ssl certificate ready for http request
我会说明情况。
简而言之,我已经收到一个ssl证书,我需要在一些HTTP请求中包含它。而且我还没有设法正确地做到这一点。
我正在使用 Guzzle 发出请求。
我收到了以
开头的字符串形式的证书
-----BEGIN CERTIFICATE-----
并以
结尾
-----END CERTIFICATE-----
.
首先,我不是 100% 确定,我必须如何处理它才能使其准备好包含在请求中。我将其保存为 mycert.crt
文件。正如 Guzzle 文档提到的,他们需要一个 .pem 文件,我研究了将 .crt 文件转换为 .pem 文件。找到 this Whosebug 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)
我读到这是一些标准错误,当您在使用证书发出请求的整个过程中搞砸了一些东西。
我还有 private.key 文件和 request.csr 用于创建 SSL 密钥。不确定我现在是否必须对这些做任何事情。
我没有在网上找到太多有用的信息。我找到的线程或文章并没有解释从头到尾的整个过程,所以我对我尝试过的任何方法都没有信心。
编辑:
我发现我可能应该使用
$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' 执行此操作,则表示它无法加载证书及其私钥。我怀疑使用 'cert' 是否可行。
好的,我现在明白了。我以前没有任何证书方面的经验。我在 OS X 上完成了这一切,但你应该得到照片。将私钥添加到您的钥匙串等一些事情可能有所不同。
- 生成 PKCS#12 证书文件
为此,您需要证书本身和私钥。在终端中,您可以使用 openssl
命令来完成。完整的命令是
openssl pkcs12 -export -clcerts -inkey ~/private.key -in ~/certificate.crt -out MyCertPKCS12.p12 -name "Full Name"
现在您已经创建了一个文件 MyCertPKCS12.p12,您必须将其添加到您的钥匙串并包含在 http 请求中。该文件带有密码,一旦您执行 运行 此命令,系统将要求您输入密码。
- 将 PKCS#12 文件添加到您的钥匙串
打开 Keychain Access 并导入 .p12 文件。起初有一些信任问题,必须手动设置哪些组件信任证书。为此,请打开钥匙串访问。左上角是钥匙串列表,select 系统,您会在那里看到新添加的证书。双击它打开,您可以从那里设置信任此证书的内容。
- 使用证书发出 http 请求
首先,如果您必须执行一个简单的 GET 请求,您可以在浏览器中输入 url,系统会询问您是否允许使用证书。允许它和 select 证书。现在一切都应该工作了。如果不是,google 错误信息。
使用证书执行 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'
]])
现在您已使用证书向 url https://muchsecure.wow/getinfo 提出请求。
如果您还有任何问题,我很乐意为大家提供帮助。
我会说明情况。
简而言之,我已经收到一个ssl证书,我需要在一些HTTP请求中包含它。而且我还没有设法正确地做到这一点。
我正在使用 Guzzle 发出请求。
我收到了以
开头的字符串形式的证书-----BEGIN CERTIFICATE-----
并以
结尾-----END CERTIFICATE-----
.
首先,我不是 100% 确定,我必须如何处理它才能使其准备好包含在请求中。我将其保存为 mycert.crt
文件。正如 Guzzle 文档提到的,他们需要一个 .pem 文件,我研究了将 .crt 文件转换为 .pem 文件。找到 this Whosebug 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)
我读到这是一些标准错误,当您在使用证书发出请求的整个过程中搞砸了一些东西。
我还有 private.key 文件和 request.csr 用于创建 SSL 密钥。不确定我现在是否必须对这些做任何事情。
我没有在网上找到太多有用的信息。我找到的线程或文章并没有解释从头到尾的整个过程,所以我对我尝试过的任何方法都没有信心。
编辑:
我发现我可能应该使用
$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' 执行此操作,则表示它无法加载证书及其私钥。我怀疑使用 'cert' 是否可行。
好的,我现在明白了。我以前没有任何证书方面的经验。我在 OS X 上完成了这一切,但你应该得到照片。将私钥添加到您的钥匙串等一些事情可能有所不同。
- 生成 PKCS#12 证书文件
为此,您需要证书本身和私钥。在终端中,您可以使用 openssl
命令来完成。完整的命令是
openssl pkcs12 -export -clcerts -inkey ~/private.key -in ~/certificate.crt -out MyCertPKCS12.p12 -name "Full Name"
现在您已经创建了一个文件 MyCertPKCS12.p12,您必须将其添加到您的钥匙串并包含在 http 请求中。该文件带有密码,一旦您执行 运行 此命令,系统将要求您输入密码。
- 将 PKCS#12 文件添加到您的钥匙串
打开 Keychain Access 并导入 .p12 文件。起初有一些信任问题,必须手动设置哪些组件信任证书。为此,请打开钥匙串访问。左上角是钥匙串列表,select 系统,您会在那里看到新添加的证书。双击它打开,您可以从那里设置信任此证书的内容。
- 使用证书发出 http 请求
首先,如果您必须执行一个简单的 GET 请求,您可以在浏览器中输入 url,系统会询问您是否允许使用证书。允许它和 select 证书。现在一切都应该工作了。如果不是,google 错误信息。
使用证书执行 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'
]])
现在您已使用证书向 url https://muchsecure.wow/getinfo 提出请求。
如果您还有任何问题,我很乐意为大家提供帮助。