我有一个内部服务器(在我的networking内部),我从外部服务器进行REST API调用。
我不知道是否有帮助,但外部服务器运行php 5.3.6与cURL 7.19.7 。
为了使安全(除了一个防火墙框,限制了外部IP地址,可以呼叫我的内部服务器只有我的外部服务器的静态IP地址),我为我的内部服务器生成一个自签名的SSL服务器证书 。
我还生成了一个客户端证书 ,在拨打电话时由我的外部服务器使用。
调用正在使用PHP的cURL库 。 进行调用的页面如下所示(此页面是作为“概念certificate”创build的,以查看调用实际可以进行):
<?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>
注意:这个“概念validation”的前一次迭代,没有使用客户端证书,效果很好。 在该版本中, CURLOPT_VERIFYPEER和CURLOPT_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
任何想法我做错了什么或缺less什么? 为什么我得到这个错误?
编辑:我试着玩CURLOPT_SSLVERSION => 。 首先我将它设置为3 ,错误稍微改变。 我仍然得到了完全相同的详细输出,但是在底部,它读取“ SSL read:errno -12195 ”,它变成了“ SSL read:errno -12271 ”。
然后我把版本更改为2 ,并且它早先崩溃,给我在详细输出的第6行周围的“ NSS错误-12268 ”。
最后,当我尝试4或5时 ,详细文件与上面完全一样。
谢谢。
在cURL网站发布相同的问题后,我得到了一些答案,给了我一些新的想法,我尝试并解决了这个问题,所以我决定把它们发布到这里,以防别人遇到类似的问题:
第一个线索是错误代码本身(-12195,-12271,-12268)。 有人给了我一个解释所有这些的url:
http://www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/sslerr.html
我也回去重新生成所有的证书,遵循不同的配方,并使用更具体的参数。 我不能肯定地说,它有所作为(错误不断发生),但没有这样做,我很确定下一步(最后一个使错误消失),不会工作…
最后一步(很愚蠢)是为CA证书文件使用不同的文件格式。 我使用CRT而不是PEM。 一旦我改变了(没有任何其他改变),错误消失,我的电话开始工作。
我希望这会帮助那里的人