我有一个内部的服务器(我的网络内部),我向其创建REST API来自我的电话外部的服务器。
我不知道这是否有帮助,但外部的服务器正在运行php 5.3.6和cURL 7.19.7。
为了使其更安全(除了防火墙限制可以调用我的内部的服务器仅设置为我的静态 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_VERIFYPEER和CURLOPT_VERIFYHOST被设置为错误的和所有SSL……和加拿...沒有選擇。
返回的页面如下:
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 读取:错误号 -12195”,变成了“SSL 读取:错误号 -12271“。
然后我将版本更改为2,它早些时候崩溃了,给我“NSS 错误 -12268“详细输出的第 6 行左右。
最后,当我尝试4或者5,详细文件与上面的完全相同。
谢谢。
答案1
在 cURL 网站上发布了同样的问题后,我得到了一些答案,这些答案给了我新的想法,我尝试并解决了这个问题,所以我决定把它们发布在这里,以防其他人遇到类似的问题:
第一个线索是错误代码本身(-12195、-12271、-12268)。有人给了我一个 URL,解释了所有这些代码:
http://www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/sslerr.html
我还回去重新生成了所有证书,按照不同的方法并使用了更具体的参数。我不能肯定地说这有什么不同(错误不断发生),但如果不这样做,我很确定下一步(使错误消失的最后一步)不会起作用……
最后一步(虽然很愚蠢)是使用不同的文件格式来存储 CA 证书文件。我使用 CRT 而不是 PEM。一旦我更改了它(没有进行任何其他更改),错误就会消失,我的呼叫就会开始工作。
我希望它能够帮助到别人......