我正在尝试使用curl命令通过代理连接到安全的Web服务,但是我收到以下错误:
无法加载客户端证书-8018.
完整日志:
[e-ballo@myserver]# curl -v -x proxy01.net:8080 https://endPointURL.com/SOAP --key ./cert.crt --cert ./cert.crt -capath=/etc/pki/tls/certs
* About to connect() to proxy proxy01.net port 8080 (#0)
* Trying 10.0.3.64... connected
* Connected to proxy01.net (10.0.3.64) port 8080 (#0)
* Establish HTTP proxy tunnel to endPointURL.com:443
> CONNECT endPointURL.com:443 HTTP/1.1
> Host: endPointURL.com:443
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.3.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Proxy-Connection: Keep-Alive
>
< HTTP/1.0 200 Connection established
<
* Proxy replied OK to CONNECT request
* Initializing NSS with …Run Code Online (Sandbox Code Playgroud) 我正在使用下面的snipped来设置证书和密钥以进行客户端身份验证.
curl_easy_setopt(curl,CURLOPT_SSLCERT,"clientCert.pem");
curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit");
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
curl_easy_setopt(curl,CURLOPT_SSLKEY,"privateKey.pem");
curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"changeit");
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");
Run Code Online (Sandbox Code Playgroud)
证书没有密码,我不知道为什么选择SSLCERTPASSWD存在,我只提供了一个虚拟值.当我在Linux上运行程序时,我得到错误代码58和错误消息无法设置私钥文件:'privateKey.pem'类型PEM
但是在Windows上,我无法使用客户端证书(找不到密钥或错误的密码?)
它似乎暗示证书和密钥不匹配但我不知道如何.我使用openssl命令从p12文件中提取了证书和密钥.我用来提取密钥的命令是
openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem
Run Code Online (Sandbox Code Playgroud)
用于提取证书的命令是
openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem
Run Code Online (Sandbox Code Playgroud)
p12文件已成功用于浏览器以访问客户端身份验证URL.在我开枪之前请帮忙.
编辑:以下是私钥和证书相互对应的证明:
[debugbld@nagara ~/curlm]$ openssl x509 -noout -modulus -in clientCert.pem | openssl md5
d7207cf82b771251471672dd54c59927
[debugbld@nagara ~/curlm]$ openssl rsa -noout -modulus -in privateKey.pem | openssl md5
Enter pass phrase for privateKey.pem:
d7207cf82b771251471672dd54c59927
Run Code Online (Sandbox Code Playgroud)
那么为什么它不能工作呢?
当我运行此代码时,我得到了错误信息:
CURL *卷曲;CURLcode资源;
//static const char *pClientCert = "/home/wh/work/sslkey/user1.pem";
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, "https://10.12.190.155/");
curl_easy_setopt(curl, CURLOPT_CAINFO, "/home/wh/work/sslkey/ca.crt");
curl_easy_setopt(curl,CURLOPT_SSLCERT,"/home/wh/work/sslkey/user1.pem");
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
curl_global_cleanup();
Run Code Online (Sandbox Code Playgroud)