2

双方向認証に問題があります。Tomcat6 をサーバーとして使用し、クライアントとして IE、Firefox、および独自の Java アプリケーションを試しています。

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

サーバーとクライアント用に独自の証明書を生成し、両方のキーストアなどで信頼できる公開鍵を追加することで、双方向 ssl の実行に成功しました...

Wireshark ログを見ると、そのサーバーは適切な証明書要求を送信しますが、クライアントは、独自に生成した証明書を使用したときに 500 バイト以上ではなく、空の証明書 (11 バイト長のパケット) を送信します。

何が問題になる可能性がありますか? クライアントが適切な証明書を送信しないのはなぜですか? :(

4

2 に答える 2

3

最初に確認することは、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=true" を追加すると、あらゆる種類の奇妙な動作が表示されます (何か間違ったことをしたという警告は表示されません)。truststoreFile は、クライアント証明書に署名するために信頼する CA をリストする正当な JKS ファイルを指している必要があります。Tomcat が正しく構成されている場合、ブラウザーは、ブラウザーにインポートされたすべての証明書のリストと共に、「Web サイトにはクライアント証明書が必要です」という行に沿ってユーザーにダイアログをポップアップ表示する必要があります。これが表示されない場合は、Tomcat のセットアップに問題があります。

正しく設定されているように見えますが、再確認する価値があります。また、正しく設定されていれば、信頼できる CA を識別名でリストする Wireshark で接続をトレースすると、「証明書要求」ハンドシェイク メッセージが表示されます。繰り返しますが、これが表示されない場合は、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 pkcs12 -in [PKCS12 file] -out [whatever].key
openssl s_client -tls1 -connect localhost:443 -cert [whatever].key -key [whatever].key

(openssl はソース ファイル内の "BEGIN CERTIFICATE" および "BEGIN RSA PRIVATE KEY" 区切り文字を探すのに十分スマートであるため、"-cert" および "-key" 引数に同じファイルを使用できます)。s_client を使用して、クライアント証明書の有効期限が切れているというリマインダーを取得するまで、一度も理解できなかったクライアント証明書に関するイライラする問題がありました (ログに記録されず、他の場所に出力されませんでした)。

また、TomcatよりもApache を使用するように構成を変更することを強く検討することをお勧めます

于 2012-04-11T20:11:24.277 に答える
3

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

openssl コマンドライン ツールの使用:

$ 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..]

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

于 2012-10-29T18:52:54.683 に答える