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.
このエラーの意味は何ですか?どうすれば修正できますか?
前もって感謝します、
この問題はすでに修正したので、解決策を投稿します。多分誰かを助けることができます。
Curlの私のバージョンは、openSSLライブラリーの代わりにNetscape Security System(NSS)ライブラリーでコンパイルされました。これら2つのライブラリでコンパイルされたcurlのバージョンは、異なる証明書アクセス方法を使用します。 openSSLメソッドであるフラットファイルを呼び出していました。別の解決策は、NSSをインストールし(ほとんどのRed Hat派生物にすでに存在)、cert9.dbファイルを作成し、証明書とキーをインポートします(opensslでP12に変換した後、「freindlyName」を追加することを忘れないでください。ニックネーム)pk12utilを使用してそのdbに挿入します。次に、ニックネームで証明書を呼び出し、dbのパスワードを指定します。
他のオプションは、opensslライブラリを使用してcurlのバージョンを取得またはコンパイルすることです。 RedHat 5、ubuntu、またはcurlのWindowsバージョンは、すでにそのようにコンパイルされていることがよくあります。 Red Hat 6には、NSS用にコンパイルされたcurlが付属しています。
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
解決策は、使用するクライアント証明書を格納するNSSデータベースへの参照をcurlに提供することです。
私は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コマンドは、cert8.dbを含む3つの.dbファイルを作成します。これは「古い」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のマニュアルを参照してください。
必要に応じて、クライアント証明書をサーバーのトラストストアに追加してください。