尝试使用cacertinpem.c curl c代码使用ca证书加载https页面时出现NSS -12286错误。 我在使用路径的代码alog中使用cacert.pem文件。但是当我尝试使用curl -v“https://sampleserve.com:443”时,同样的事情是有效的,在这种情况下,ssl将默认的ca路径视为“/etc/tls/certs/ca.budle.crt”
但是这个c代码不适用于ca的默认ca位置和外部路径选择。
此错误的原因是什么(NSS -12286)。
Error:
* About to connect() to fiservices.sterlingbankng.com port 443 (#0)
* Trying 1.1.1.1... * Connection timed out
* Trying 1.1.1.2... * connected
* Connected to fiservices.sterlingbankng.com (1.1.1.2) port 443 (#0)
* Initializing NSS with certpath: /etc/pki/nssdb
* CAfile: ./cacert.pem CApath: ./cacert.pem
* NSS error -12286
* Error in TLS handshake, trying SSLv3...
GET /CanFI/ HTTP/1.1
Host: sampleserver.com
Accept: */*
* Connection died, retrying a fresh connect
* Closing connection #0
* Issue another request to this URL: 'https://sampleserver.com'
* About to connect() to sampleserver.com port 443 (#0)
* Trying 1.1.1.1... * Connection timed out
* Trying 1.1.1.2... * connected
* Connected to sampleserver.com (1.1.1.2) port 443 (#0)
* TLS disabled due to previous handshake failure
* CAfile: ./cacert.pem
CApath: ./cacert.pem
* NSS error -12286
* Closing connection #0
* SSL connect error
示例代码:
size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream)
{
fwrite(ptr,size,nmemb,stream);
return(nmemb*size);
}
static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
{
X509_STORE * store;
X509 * cert=NULL;
BIO * bio;
char * mypem = "-----BEGIN CERTIFICATE-----\n"\ "-----END CERTIFICATE-----\n"; //public certificate
}
int main(void)
{
CURL * ch;
CURLcode rv;
rv=curl_global_init(CURL_GLOBAL_ALL);
ch=curl_easy_init();
rv=curl_easy_setopt(ch,CURLOPT_VERBOSE, 1L);
rv=curl_easy_setopt(ch,CURLOPT_HEADER, 0L);
rv=curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1L);
rv=curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1L);
rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction);
rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout);
rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction);
rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
rv=curl_easy_setopt (ch, CURLOPT_CAPATH, "./cacert.pem" );
rv=curl_easy_setopt (ch, CURLOPT_CAINFO, "./cacert.pem" );
rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1L);
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://");
rv=curl_easy_perform(ch);
if (rv==CURLE_OK)
printf("*** transfer succeeded ***\n");
else
printf("*** transfer failed ***\n");
rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
rv=curl_easy_perform(ch);
if (rv==CURLE_OK)
printf("*** transfer succeeded ***\n");
else
printf("*** transfer failed ***\n");
curl_easy_cleanup(ch);
curl_global_cleanup();
return rv;
}
由于
答案 0 :(得分:1)
在PHP中使用。我用命令行在-v上运行curl,发现NSS -12286错误。
原来,远程服务器和curl没有共同的密码(nss error codes)。 我们像这样在curl对象中添加了一个cypher:
curl_setopt($oCurl, CURLOPT_SSL_CIPHER_LIST, 'rsa_rc4_128_sha');
答案 1 :(得分:0)
我注意到的第一件事就是:
rv=curl_easy_setopt (ch, CURLOPT_CAPATH, "./cacert.pem" );
需要指定“字符串命名目录,该目录包含多个CA证书以验证对等方”。从手册页。你可能想要"/etc/tls/certs/"
此外,它会显示为:
rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
什么都不做。我这样说是因为,再次,从手册页,“此选项仅适用于由OpenSSL提供支持的libcurl”。我这样说是因为你的错误日志有“NSS错误”
我使用ssl的经验仅适用于openssl。我发现命令行函数openssl s_client
很有帮助。话虽这么说,很容易错过配置你的设置。许多函数和命令行选项都会尝试使用最疯狂的输入,从而导致红鲱鱼错误。
修改强> 我对你的计划的尝试成功完成。
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL * ch;
CURLcode rv;
rv=curl_global_init(CURL_GLOBAL_ALL);
ch=curl_easy_init();
rv=curl_easy_setopt(ch, CURLOPT_VERBOSE, 1L);
rv=curl_easy_setopt(ch, CURLOPT_CAPATH, "/etc/ssl/certs");
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://");
rv=curl_easy_perform(ch);
if (rv==CURLE_OK) {
printf("*** transfer succeeded ***\n");
}
else {
printf("*** transfer failed ***\n");
}
curl_easy_cleanup(ch);
curl_global_cleanup();
return rv;
}
答案 2 :(得分:0)
我们遇到了这个问题,将Plesk Centos服务器连接到仅接受符合PCI DSS标准的密码和Binami / DigitalOcean Debian堆栈之间,该堆栈开箱即用,没有重叠密码(如12286所示)。答案是更新DigitalOcean Debian以使用与其他服务器相同的密码套件并重启apache。
你可以在任何一个盒子上或两者上改变密码套件 - 但我们选择全面保留PCI DSS密码套件。