SSLクライアント証明書を使用して、tomcat6/7に接続しているユーザーを認証したいと思います。Tomcatが正しく構成されており、Tomcatに提供したトラストストアの証明書で署名した証明書は、IEとFirefoxの両方から正常に認証されています。
また、顧客が自分のユーザーを管理できるようにしたいので、クライアント証明書をチェーンしたいと思います。これは、追加のユーザー証明書に署名するために使用する中間管理CA証明書を顧客に発行することで実現できます。認証のために管理CA(ルート証明書によって署名された)とチェーンされたユーザー証明書を送信するには、ユーザーのブラウザーが必要になります。
私はopensslを使用しており、ルートCAと中間CAを作成し、中間CAを使用してリーフ証明書に署名しました。3つの証明書すべてをpkcs12とpemに変換し、keytoolを使用してルート証明書をtomcatのトラストストアにインポートしました。openssl –verifyは、リーフpkcs12を中間証明書に対して検証します(中間はルートに対して検証します)。しかし、ルート証明書(pkcs12)に対して検証するリーフ証明書(pkcs12)を取得できません。また、リーフ証明書を使用して認証するためにIEまたはFirefoxを取得することもできません。IEは証明書の入力を求めますが、認証に失敗します(Tomcatのログに接続または失敗についての記述はありません)。Firefoxはリーフ証明書の入力を求めません。単に認証に失敗します。
これが、opensslを使用してルートに対してリーフを検証する方法です。
openssl verify -CAfile ..\root\Root.pem Leaf.pem
3つの証明書を生成するために使用しているスクリプトは次の
とおりです。root.bat:
set name=Root
set keyPassword=dummypassword
set trustPassword=dummypassword
openssl genrsa -des3 -passout pass:%keyPassword% -out %name%.key 4096
openssl req -new -key %name%.key -passin pass:%keyPassword% -out %name%.csr -subj "/C=US/ST=Chaos/L=TimeNSpace/O=None/CN=%name%"
openssl x509 -req -days 3650 -in %name%.csr -signkey %name%.key -passin pass:%keyPassword% -extfile GenerateCertificate.cfg -extensions v3_ca -out %name%.crt
openssl pkcs12 -export -in %name%.crt -inkey %name%.key -passin pass:%keyPassword% -passout pass:%keyPassword% -out %name%.pkcs12
keytool -noprompt -import -file %name%.crt -alias %name% -keystore %name%.truststore -deststorepass %trustPassword%
keytool -list -v -keystore %name%.truststore -storepass %trustPassword% > %name%.truststore.dump.txt
keytool -exportcert -alias %name% -keystore %name%.truststore -storetype jks -storepass %trustPassword% -rfc -file %name%.truststore.pem
openssl pkcs12 -in %name%.pkcs12 -out %name%.pem -nodes -passin pass:%keyPassword%
中間.bat:
set name=Intermediate
set password=dummypassword
set caDir=../root
set caName=Root
set caPassword=dummypassword
openssl genrsa -des3 -passout pass:%password% -out %name%.key 2048
openssl req -new -key %name%.key -passin pass:%password% -out %name%.csr -subj "/C=US/ST=Chaos/L=TimeNSpace/O=None/CN=%name%"
openssl x509 -req -days 3650 -in %name%.csr -CA %caDir%/%caName%.crt -CAkey %caDir%/%caName%.key -passin pass:%caPassword% -set_serial 1 -extfile GenerateCertificate.cfg -extensions v3_ca -out %name%.crt
openssl pkcs12 -export -in %name%.crt -inkey %name%.key -passin pass:%password% -passout pass:%password% -chain -CAfile %caDir%/%caName%.crt -out %name%.pkcs12
openssl pkcs12 -in %name%.pkcs12 -out %name%.pem -nodes -passin pass:%password%
leaf.bat:
set name=Leaf
set password=dummypassword
set caDir=../intermediate
set caName=Intermediate
set caPassword=dummypassword
openssl genrsa -des3 -passout pass:%password% -out %name%.key 2048
openssl req -new -key %name%.key -passin pass:%password% -out %name%.csr -subj "/C=US/ST=Chaos/L=TimeNSpace/O=None/CN=%name%"
openssl x509 -req -days 3650 -in %name%.csr -CA %caDir%/%caName%.crt -CAkey %caDir%/%caName%.key -passin pass:%caPassword% -set_serial 1 -out %name%.crt
openssl pkcs12 -export -in %name%.crt -inkey %name%.key -passin pass:%password% -passout pass:%password% -chain -CAfile %caDir%/%caName%.pem -out %name%.pkcs12
openssl pkcs12 -in %name%.pkcs12 -out %name%.pem -nodes -passin pass:%password%
GenerateCertificate.cfg:
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true,pathlen:3