2012-04-11 14 views
1

双方向認証に問題があります。私はサーバーとしてTomcat6を使用し、クライアントとして私はIE、Firefoxと自分のJavaアプリケーションを試してみます。PFXファイルによる双方向認証

問題は、他の人が私に与えたPFX証明書を使用して発生します。私はクライアント証明書としてそれらを使用する必要があるので、私はそれをサーバー上の信頼できる証明書に追加して、ユーザー証明書のブラウザーでそれを使用します。問題は私がbad_certificateアラートを取得することです。

私は、サーバーとクライアントのために自分の証明書を作成し、両方のキーストアなどで信頼できる公開鍵を追加することにより、双方向SSLを行うことに成功しました

が...

私は見wiresharkのログを見て、そのサーバーが送信します証明書の要求は良好ですが、自分で生成した証明書を使用すると、クライアントは空の証明書(長さが11バイトのパケット)を500+バイトの代わりに送信します。

何が問題なのですか?なぜクライアントは良い証明書を送信しないのですか? :

+0

クライアント認証用のサーバーをセットアップ済みですか?コネクタにはどのような種類のキーストアがありますか? – Cratylus

+0

jks、私はそれ自身の生成されたキーで動作し、pfxキーでopenssl s_clientを使って動作するため、問題はないと思います。 firefoxを使ってpfxで作業しています(Windowsストアのキー付き)またはjava-appでp12キーストアを指しています – Deo

+0

pfxを記述する方法が空であるか破損しています。その内容を表示しようとしましたか? – Cratylus

答えて

2

まず、チェックするのは、問題のパスに対してクライアントから証明書を要求するようにTomcatが正しく設定されているかどうかです。Tomcat 6では、conf/serverでコネクタを設定する必要がありますこのような.xmlの何か:

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" 
      maxThreads="150" scheme="https" secure="true" 
      keystoreFile="${user.home}/.keystore" keystorePass="password" 
      truststoreFile="conf/truststore" truststorePass="password" 
      clientAuth="true" sslProtocol="TLS" /> 

truststoreFile & truststorePassが重要である - あなただけのこれら2つのパラメータを含めずに「真CLIENTAUTH =」を追加した場合、あなたは奇妙な行動のすべての種類を見ていない(と警告しますよ何か間違っていました)truststoreFileは、クライアント証明書に署名するために信頼するCAをリストアップした正当なJKSファイルを指していなければなりません。ブラウザーにインポートされたすべての証明書のリストと共に「Webサイトにはクライアント証明書が必要です」という行に沿ってユーザーにダイアログをポップアップ表示します。これが表示されない場合は、Tomcatのセットアップに問題があります。

正しくセットアップされているように聞こえますが、二重チェックの価値があります。また、正しく設定した場合、wiresharkで接続をトレースして、信頼できるCAを識別名でリストすると、「証明書要求」ハンドシェイクメッセージが表示されます。この場合も、Tomcatの設定と最も重要なトラストストアを確認してください。

次は、PKCS12ファイル自体をチェックすることです。あなたがこれを行うことができます。

openssl pkcs12 -in [path-to-pkcs12-file] -nokeys | openssl x509 -noout -subject -issuer 

発行者の識別名はあなたの信頼ストアのtrustedCaCertエントリの1つに一致することを確認してください。これは、Javaのkeytoolを行うには手間の一種ですが、使用して二重にチェックすることができます

keytool -exportcert -keystore conf/truststore -alias [alias of trusted cert] | openssl x509 -noout -subject -inform der 

このすべてがチェックアウトし、それはまだ働いていない場合、それはあなたのために、トラブルシューティングするためのopensslのs_clientを使用して価値があります通常、そこから多くのトラブルシューティング情報を取得します。そのためには、あなたがPKCS12ファイル内の証明書からキーを分離する必要があります:opensslのはスマートであるため、

openssl pkcs12 -in [PKCS12 file] -out [whatever].key 
openssl s_client -tls1 -connect localhost:443 -cert [whatever].key -key [whatever].key 

(あなたは「-cert」と「-key」引数に同じファイルを使用することができますソースファイルの "BEGIN CERTIFICATE"と "BEGIN RSA PRIVATE KEY"区切り文字を十分に探します)。私はs_clientを使用してクライアント証明書が期限切れになったことを知らせるまでログアウトしていなかったり、他の場所に出力したりするまで、クライアント証明書には不満がありました。

また、あなたは強くTomcatの上にApacheを使用するように設定を移行する検討する必要があります - Apacheはたくさんより柔軟性があり、そしてそれはTomcatがあるよりも、SSLのconfifgurationに来るときあなたたくさんより多くのフィードバックを提供します。

+0

に入れてください。私はすべてうまくセットアップしましたが、とにかく正しいコネクタ設定を再度表示してくれてありがとう) 明日の朝にs_clientのことを確認し、フィードバックの準備をします。 – Deo

+0

私はopenssl s_clientとの安全な接続を確立しました。なぜ私はfirefoxでそれをすることができないのですか? (firefoxに証明書を追加するとpfxファイルを指すが、彼はpkcs12ファイルのみを受け入れるようだ) s_clientが示す唯一のエラーは18(自己署名証明書)であり、サーバー証明書は実際に自己署名されている。とにかく彼はGET /に問題がなかったし、wiresharkのログを見るとすべてがうまくいった。 同じpfxファイルでFirefoxとInternet Explorerが問題があるのはなぜですか?私はJavaアプリケーションをオンにしようとしません、それはあまり信頼性の低い原因です。 – Deo

+0

open_sslでのみ動作する証明書は長いです(1800bytes以上) どこでも動作する証明書は短いです(約750bytes) となり、唯一の通信はbad_certificateです(Certificate TLSパケットが空であるため) – Deo

2

クライアント証明書、特にX509v3の拡張機能「キー使用法」と「拡張キー使用法」を詳しく見てください。クライアント認証のために信頼されていないとマークされることがあります。使用

openssl command-line tool

$ openssl pkcs12 -in server-only.pfx -nokeys | openssl x509 -noout -purpose 
Enter Import Password: 
MAC verified OK 
Certificate purposes: 
SSL client : No 
SSL client CA : No 
SSL server : Yes 
SSL server CA : No 

この証明書は、サーバー認証のみ(通常HTTPS)のために署名されています。詳細については、のopensslのx509で-textオプションを使用します。この場合

$ openssl pkcs12 -in server-only.pfx -nokeys | openssl x509 -noout -text 
    [..snip..] 
     X509v3 Key Usage: 
      Digital Signature, Key Encipherment 
     X509v3 Extended Key Usage: 
      TLS Web Server Authentication 
    [..snip..] 

を、あなたは、クライアント認証用にマークされ、新しい署名付き証明書を取得するように依頼する必要があるとしています。