最初に確認することは、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 を使用するように構成を変更することを強く検討することをお勧めします。