web-services – curl命令 – 无法加载客户端证书-8018

我正在尝试使用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 certpath: sql:/home/e-ballo/
* Unable to initialize NSS database
* Initializing NSS with certpath: none
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* Unable to load client cert -8018.
* NSS error -8018
* Closing connection #0
curl: (58) Unable to load client cert -8018.

知道这个错误意味着什么吗?我该如何解决?

提前致谢,

我也在RHEL 6上遇到过这个问题.curl是用NSS编译的,你可以通过查看版本看到:

$curl -V
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
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

解决方案是为curl提供对NSS数据库的引用,该数据库存储您要使用的客户端证书.

创建证书

我是从Java密钥库开始的,该密钥库是使用此命令创建的(别名值将用于稍后引用证书):

keytool -genkeypair -alias myclient -keyalg RSA -keystore client_keystore.jks

现在,需要将此JKS密钥库转换为pkcs12格式:

keytool -importkeystore -srckeystore client_keystore.jks \
    -destkeystore client_keystore.p12 -srcstoretype jks \
    -deststoretype pkcs12

将证书导入NSS数据库

接下来,在您选择的目录中创建NSS数据库:

mkdir /home/user/nss
certutil -N -d /home/user/nss

此certutil命令创建3 .db文件,包括cert8.db.这是“旧”数据库格式,但应该仍然有效.如果需要创建cert9.db文件,请查看certutil文档.

使用pk12util将client_keystore.p12导入NSS数据库

pk12util -i client_keystore.p12 -d /home/user/nss

(可选)在数据库中查看存储的证书:

certutil -L -d /home/user/nss -n myclient

使用curl证书

证书现在可以被curl使用了,但是我们需要让curl知道在哪里找到它.如curl手册中所指定,创建一个SSL_DIR环境变量:

export SSL_DIR=/home/user/nss

最后,curl命令:

curl -vk --cert myclient https://localhost:8443/my/url

注意:此处指定了-k选项,因为服务器使用的是自签名证书.有关如何指定cacert的信息,请参阅curl手册.

如果需要,请记住将客户端证书添加到服务器的信任库.

参考

> certutil and pk12util Documentation
> Point curl to Firefox’s NSS database (~/.mozilla/firefox/[profile])

翻译自:https://stackoverflow.com/questions/19265100/curl-command-unable-to-load-client-cert-8018

转载注明原文:web-services – curl命令 – 无法加载客户端证书-8018