【问题标题】:Getting a ssl certificate ready for http request为 http 请求准备好 ssl 证书
【发布时间】: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


【解决方案1】:

好的,我现在知道了。我以前没有任何证书方面的经验。我在 OS X 上完成了这一切,但你应该得到图片。向钥匙串添加私钥之类的某些事情可能会有所不同。

  1. 生成 PKCS#12 证书文件

为此,您需要证书本身和与之配套的私钥。在终端中,您可以使用 openssl 命令来完成。完整的命令是

openssl pkcs12 -export -clcerts -inkey ~/private.key -in ~/certificate.crt -out MyCertPKCS12.p12 -name "Full Name"

现在您已经创建了一个文件 MyCertPKCS12.p12,您必须将其添加到您的钥匙串并包含在 http 请求中。该文件带有密码,运行此命令后将要求您输入密码。

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

打开 Keychain Access 并导入 .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'
]])

现在您已使用证书向 url https://muchsecure.wow/getinfo 发出请求。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2023-01-28
    • 2013-10-26
    • 2018-05-14
    相关资源
    最近更新 更多