PHP cURL 调用返回错误 56 和 NSS 错误 -12195

标签 php ssl curl openssl client-certificates

我有一个内部服务器(在我的网络内部),我从我的外部服务器对其进行REST API调用。

我不知道它是否有帮助,但外部服务器正在运行 php 5.3.6cURL 7.19.7。 p>

为了让它更安全(除了防火墙框将可以调用我的内部服务器的外部IP地址限制为我的外部服务器的静态IP地址之外) ,我为我的内部服务器生成了一个自签名 SSL 服务器证书

我还生成了一个客户端证书,供我的外部服务器在调用时使用。

调用是使用PHP 的cURL 库 进行的。进行调用的页面如下所示(此页面是作为“概念证明”创建的,以查看是否可以实际进行调用):

<?php 

$mycurl = curl_init();    
$verbose = fopen('curl_error_log','a');    
$url_site = 'https://internal.server.com/api_test.php';

$options = array(
     CURLOPT_HEADER => false                                                
    ,CURLOPT_RETURNTRANSFER => true                                         
    ,CURLOPT_VERBOSE => true                                                
    ,CURLOPT_STDERR => $verbose                                             
    ,CURLOPT_HTTPHEADER => array('Accept: application/json')                
    ,CURLOPT_CAINFO => realpath('/certs/server/certs.pem')  
    ,CURLOPT_CAPATH => realpath('/certs/server')
    ,CURLOPT_SSL_VERIFYPEER => true                                         
    ,CURLOPT_SSL_VERIFYHOST => 2                                            
    ,CURLOPT_SSLCERT => realpath('/certs/client.crt.pem')
    ,CURLOPT_SSLKEY => realpath('/certs/client.key.pem')
    ,CURLOPT_SSLCERTTYPE => 'PEM'
    ,CURLOPT_URL => $url_site
);

curl_setopt_array($mycurl, $options);    
$webResponse =  curl_exec($mycurl);    
fclose($verbose);

?>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <p>Error: <?php echo curl_error($mycurl); ?></p>
        <p>Error no.: <?php echo curl_errno($mycurl); ?></p>
        <p>Result: <?php echo $webResponse; ?></p>
    </body>
</html>

注意:此“概念证明”的前一次迭代在未使用客户端证书 的情况下运行良好。在那个版本中,CURLOPT_VERIFYPEERCURLOPT_VERIFYHOST 被设置为 FALSE 并且所有的 SSL...CA ... 缺少选项。

返回页面如下所示:

Error: SSL read: errno -12195

Error no.: 56

Result:

详细文件 (curl_error_log) 有这个:

* About to connect() to internal.server.com port 443 (#0)
*   Trying 111.222.333.444... * connected
* Connected to internal.server.com (111.222.333.444) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /certs/server/certs.pem
  CApath: /certs/server
* SSL connection using TLS_DHE_RSA_WITH_AES_128_CBC_SHA
* Server certificate:
*   subject: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
*   start date: Apr 13 15:15:38 2015 GMT
*   expire date: Apr 12 15:15:38 2016 GMT
*   common name: internal.server.com
*   issuer: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
> GET /api_test.php HTTP/1.1
Host: internal.server.com
Accept: application/json

* NSS: client certificate from file
*   subject: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
*   start date: Apr 13 15:26:48 2015 GMT
*   expire date: Apr 12 15:26:48 2016 GMT
*   common name: internal.server.com
*   issuer: CN=internal.server.com,OU=BI,O=ABC Corp,L=City,ST=State,C=CO
* SSL read: errno -12195
* Closing connection #0

关于我做错了什么或缺少什么的任何想法?为什么会出现此错误?

编辑:我尝试使用 CURLOPT_SSLVERSION =>。首先我将它设置为 3 并且错误发生了轻微的变化。我仍然得到完全相同的详细输出,但在底部,它显示为“SSL read: errno -12195”,它变成了“SSL read: errno -12271” .

然后我将版本更改为 2,它早些时候崩溃了,在详细输出的第 6 行附近给我“NSS 错误 -12268”。

最后,当我尝试45 时,详细文件与上面完全相同。

谢谢。

最佳答案

在 cURL 网站上发布相同的问题后,我得到了一些答案,这些答案给了我尝试并解决问题的新想法,所以我决定将它们发布在这里,以防其他人遇到类似问题:

第一个线索是错误代码本身(-12195、-12271、-12268)。有人给了我一个解释所有这些的 URL:

http://www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/sslerr.html

我还返回并重新生成了我所有的证书,遵循不同的配方并使用更具体的参数。我不能肯定地说它有所作为(错误不断发生),但如果不这样做,我很确定下一步(使错误消失的最后一步)将无法工作...

最后一步(虽然很愚蠢)是为 CA 证书文件使用不同的文件格式。我使用 CRT 而不是 PEM。一旦我更改了它(没有任何其他更改),错误就消失了,我的电话开始工作了。

我希望它能帮助那里的人......

关于PHP cURL 调用返回错误 56 和 NSS 错误 -12195,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632205/

相关文章:

sharepoint - 如何使用curl自动上传并 checkin 文件到共享点?

macos - 由于 "unknown message digest algorithm",curl 无法访问 github.com

php - 使用 ajax 加载迷你界面

php - 将 NOW() 和 csv 文件名添加到同一 mysql 列中

go - 如何使用 golang 库 net/http 从 https ://www. * 重定向到 https://*

java - 在识别和修复 SSLPeerUnverifiedException 方面需要帮助

java - 无法通过 SSL 使用 Amazon S3 API?

python 请求 POST 基本身份验证返回 200,正文为空

javascript - HTML 必需标签不适用于公司和名称

php - 使用 PHP 获取用户的真实 IP 地址