wgetでのクライアント証明書の使用


8

wgetでクライアント証明書を使用できません。ドキュメントでは、-certificateフラグの使用について説明しています。

証明書フラグの使用は明らかです。クライアント証明書のPEMバージョンを使用するように設定しました。

しかし、接続すると次のエラーが発生します。

HTTP request sent, awaiting response... Read error (error:14094410:SSL routines:
SSL3_READ_BYTES:sslv3 alert handshake failure; error:140940E5:SSL routines:SSL3_
READ_BYTES:ssl handshake failure) in headers.
Giving up.

sslハンドシェイクの失敗は、クライアントが正しいクライアント証明書を提供しなかったことを意味します。それでも私が使用するクライアント証明書はブラウザで動作します。

注:サーバーでクライアント認証を無効にすると、wgetが接続できます。注:curlの使用をお勧めしますが、切り替えは避けたいです。


回避策を作成しました。Apacheでクライアント証明書認証なしでVirtualHostを定義し、DocRootを同じディレクトリに設定し、Allow fromをローカルホストアドレスに設定しました。

回答:


7

私はこれについて1週間勉強しました。最後に、このページから得た助けを借りて勉強しました。

接続に使用したコマンドは次のとおりです。

wget --ca-cert=/etc/ssl/certs/winhostname.pem --certificate=/etc/ssl/private/linuxhost.pem \
     --private-key=/etc/ssl/private/linuxhost.key https://winhostname.home.net:8443/winhosturl.asmx

あなたは私の日を作りました!
Peter Butkovic

4

SSLクライアント証明書認証がサーバーに対して機能していることを確信していますか?

証明書(PKCS12形式)を取得し、それをPEM形式の証明書とキーファイルに変換して、wgetで問題なく使用できることをテストしました。

私は3つのエラー状態を引き起こすことができますが、どれもあなたが報告しているものと一致しません。

  1. キーファイルの提供に失敗:400 Bad Request
  2. 不正なキーを提供:EVP_DecryptFinal_ex:bad SSLからの不正な復号化
  3. サーバーが好まない有効な証明書を提供:403 forbidden

私はnginxを使用しています。あなたはあなたが何を使っているかについては触れていないので、Apacheが同じ応答を返すかどうかはわかりません。

証明書とキーを取得し、それをPKCS12に組み合わせて(または、ブラウザーがこの形式をサポートしている場合は、PEMとしてインポートして)、すべてがその前面で最初に機能することを確認することをお勧めします。

すでにそれを行っている場合は、別のマシンから試して、使用しているOpenSSLのバージョンに問題がないことを確認してください。

最後に、OpenSSLをs_clientモードで使用してみます。

openssl s_client -cert cert.pem -key req.pem -connect host:port -debug

そして、物事がそのレベルで機能するかどうかを確認します。その場合、wgetで何かがおかしくなり、再構築または再インストールする必要がある場合があります。そうでない場合、デバッグ出力のレベルは、wgetのデバッグ出力よりも問題を特定するのに役立ちます。


私はあなたの提案をすべて試しました:1.証明書はFF 3.5で正常に動作します2.サーバー:Apache 2.2.11、Openssl 0.9.8i、Windows Server 2003クライアント:WGET 1.11.4、OpenSSL 0.9.8k(バイナリ)、Win XP SP3 3 。他のマシンから:同じ結果4. Comodoから証明書を受け取りました。証明書とキーはすべて1つになっています。私は以下を試しました:openssl s_client -cert cert.pem openssl s_client -cert cert.pem -key key.key(certから抽出)openssl s_client -cert cert.pem -key copyofcert.pem(次のコメントに続く)

すべてが同じエラーを出しました:<br>エラー設定の秘密鍵<br> 8584:error:0B080074:x509証明書<br> routines:X509_check_private_key:key values <br>これは、上記の不一致とは異なるエラー:。\ crypto \です。 x509 \ x509_cmp.c:399:

証明書とキーを混乱させています。openssl s_clientで動作するようになるまでは、間違ったファイル(コンテンツ)をwgetに渡していることを確認できます。ファイル内を調べて、タグが付けられているかどうかを確認します(通常は、--- BEGIN PRIVATE KEY ---または--- BEGIN RSA KEY ---または--- BEGIN CERTIFICATE --- ...などのタグが付いています。 。ファイルの内容がわかります)
Ram

2

私はこのようにwgetを正常に使用しました:

"C:\program files\GnuWin32\bin\wget" --no-check-certificate --certificate=C:\Users\Alex\xxx.pem --private-key=C:\Users\Alex\xxx.pem --input-file=retain.url --output-document=retain.xml

に注意してください--private-key option。Retain.urlはhttps://bla.bla.bla

ただし、「PEMパスフレーズを入力してください」というメッセージが表示されます。

パスワードを入力すれば機能します、プロンプトを回避する方法を知っている人はいますか?


4
パスフレーズなしでキーのコピーを作成します。opensslrsa -in key.pem -out keyout.pem
pehrs

0

wgetがポート80に接続している可能性はありますか?そのエラーは、HTTPを誤って80でリッスンしていて、443-wgetがSSLを話そうとして、必要な応答を得られなかったときにテストで受け取るエラーと非常に似ています。


いいえ。URLはスクリプト内にあるため、常に同じです。クライアント認証をオフにしてhttpsをオンにしてテストすると、動作します。

0

ネットワークキャプチャを取得し、Wiresharkにロードします。これにより、SSL / TLSレベルで何が失敗しているのかが明確になります。


0

0.9.8のようなバージョンのSSLv3には問題がありました。

openssl s_clientに-no_ticketを渡してみるか、-ssl2が機能するか

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.