我正在尝试使用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.
知道这个错误意味着什么吗?我该如何解决?
提前致谢,
答案 0 :(得分:17)
我也在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数据库:
mkdir /home/user/nss
certutil -N -d /home/user/nss
此certutil命令创建3个.db文件,包括cert8.db。这是&#34; old&#34; 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手册中所述,创建一个SSL_DIR环境变量:
export SSL_DIR=/home/user/nss
最后,curl命令:
curl -vk --cert myclient https://localhost:8443/my/url
注意:此处指定了-k选项,因为服务器使用的是自签名证书。有关如何指定cacert的信息,请参阅curl手册。
如果需要,请记住将客户端证书添加到服务器的信任库。
答案 1 :(得分:6)
我已经解决了这个问题,所以我会发布解决方案。也许对某人有帮助。
我的curl版本是使用Netscape Security System(NSS)库而不是openSSL库编译的。使用这两个库编译的curl版本使用不同的证书访问方法。我正在调用一个平面文件,这是openSSL方法。 另一个解决方案是安装NSS,(已经有大多数Red Hat衍生产品)并创建一个cert9.db文件,导入你的证书和密钥(用openssl转换为P12后 - 别忘了添加“freindlyName”或昵称)使用pk12util进入该数据库。然后用它的昵称调用cert并给出db的密码。
另一个选项是使用openssl库获取或编译curl版本。 RedHat 5,ubuntu或windows版本的curl经常以这种方式编译。 Red Hat 6附带为NSS编译的卷曲。