为http请求准备ssl证书

时间:2016-05-20 09:34:32

标签: php ssl httprequest guzzle

我将解释这种情况。

简短版本是我收到了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)

当您在使用证书发出请求的整个过程中搞砸了某些内容时,我认为这是一个标准错误。

我还有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'是要走的路。

1 个答案:

答案 0 :(得分:2)

好的,我现在已经弄明白了。我以前没有任何证书经验。我在 OS X 上做了所有这些,但是你应该得到它。像钥匙串添加私钥这样的事情可能有所不同。

  1. 生成PKCS#12证书文件
  2. 要做到这一点,您需要证书本身和私有密钥。在终端中,您可以使用openssl命令执行此操作。完整的命令是

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

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

    1. 将PKCS#12文件添加到您的钥匙串
    2. 打开Keychain Access并导入.p12文件。起初有一些信任问题,不得不手动设置哪些组件信任证书。为此,请打开Keychain Access。左上角是一个Keychains列表,选择System,您将在那里看到新添加的证书。双击它打开,您可以设置从那里信任该证书的内容。

      1. 使用证书发出http请求
      2. 首先,如果您需要执行简单的GET请求,您可以在浏览器中输入网址,然后系统会询问您是否允许使用证书。允许它并选择证书。现在一切都应该有效。如果没有,请输入错误消息。

        使用证书执行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'
        ]])
        

        现在,您已向网址https://muchsecure.wow/getinfo提出了证书请求。

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