web-dev-qa-db-ja.com

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.

このエラーの意味は何ですか?どうすれば修正できますか?

前もって感謝します、

18
eballo

この問題はすでに修正したので、解決策を投稿します。多分誰かを助けることができます。

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が付属しています。

6
eballo

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データベースにインポートする

次に、選択したディレクトリに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に証明書の場所を知らせる必要があります。 curlマニュアルで指定されているように、SSL_DIR環境変数を作成します。

export SSL_DIR=/home/user/nss

最後に、curlコマンド:

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

注:サーバーが自己署名証明書を使用しているため、ここでは-kオプションが指定されています。 cacertの指定方法については、curlのマニュアルを参照してください。

必要に応じて、クライアント証明書をサーバーのトラストストアに追加してください。

参照

18
bparry