0

Rootというルート認証局がIntermediateという中間認証局によって作成された証明書署名要求に署名し、さらに Subjectというサブジェクトによって作成された証明書署名要求に署名するテスト シナリオがあります。

Tomcat を Web サーバーとして使用し、サブジェクトキー ストア (ルート証明書、中間証明書、サブジェクト証明書チェーン、およびサブジェクト秘密鍵を含む) を使用するように構成し、ポート 80 でリッスンするように起動します。 (HTTP) および 443 (HTTPS)。

ルート証明書を (信頼できる証明書として) Firefoxにインストールし、自分のドメインにアクセスすると、次のようになります。

subject.usip.me uses an invalid security certificate.
The certificate is not trusted because no issuer chain was provided.
(Error code: sec_error_unknown_issuer)

明らかに、Firefox はチェーンの信頼性などを検証できませんでした。ここで、構成と実行した手順について詳しく説明する前に、Tomcat の構成を変更して、サブジェクトキー ストアを使用する代わりに中間キー ストアを使用するようにしました (中間キー ストアにはルート証明書が含まれています。中間証明書チェーンと中間秘密鍵)。この構成を使用すると、すべて正常に動作します。

次のツールを使用します。

  • Java: 1.7.0_05
  • トムキャット: 7.0.29
  • ファイアフォックス: 14.0.1

ここに貼り付けた次のスクリプトを使用して、問題のキー ストアを作成します(かなり長いです)。Java キーツールがあれば誰でも実行できます (4096 の RSA キー サイズのため、おそらくそれほど高速な操作ではないでしょう)。

スクリプトの実行後、サブジェクトキー ストアに完全な信頼チェーンが含まれていることを確認できます (私が見たとおり)。

c:\>keytool -list -keystore c:\subject.jks -storepass changeit -rfc

ここに貼り付けられた次の(これも非常に長い)出力が出力されます。私には問題ないように思えます (少なくとも、何時間も格闘した後では、何も問題がないように見えます)

このようにserver.xmlを介して(このハウツーに従って) Tomcatをセットアップしました(デフォルトでコメントアウトされているこの単一のタグ以外は何も変更しません)。

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           keystoreFile="c:/subject.jks"
           keystorePass="changeit"
           keystoreType="jks"
           keyAlias="subject"
           keyPass="changeit" />

(Tomcat を起動した後、Tomcat に接続します。サブジェクトまたは中間キー ストアを使用している間は、ログにエラーは記録されません。)

解決策を探しているときに、opensslを使用して自分のサービスを確認できることがわかりました。このツールの初心者ユーザーとして、自分のドメインに対して (Cygwin を使用して) 次のコマンドを実行しました。

$ openssl s_client -connect subject.usip.me:443 -CAfile /cygdrive/c/root.pem -showcerts &> /cygdrive/c/openssl.log

繰り返しになりますが、ここに長い出力を貼り付けました

それは、ルート証明書Verify return code: 24 (invalid CA certificate)を参照しているため(私が見るように)奇妙です。ここで、以前に中間キー ストアを使用するように Tomcat を再構成したと述べたときに、同じコマンドを実行してから、 でチェックアウトしました。したがって、ルート証明書は問題ありません。Verify return code: 0 (ok)

投稿と貼り付けで言及したドメインとサブドメイン名は、http://freedns.afraid.org/に登録されている無料のドメインであり、それぞれが私の現在のアドレスを指しています (言及したいと思いました。それは重要です)。

私が間違っていることはありますか?

4

1 に答える 1

1

わかりました、私はそれを理解することができました。証明書署名要求に対する応答を生成したときに、いくつかの重要な X.509 証明書拡張を指定しませんでした。

これに関する情報は、Java のkeytool documentationにあります。( を検索し-extます。)

重要なポイントは、中間証明書の適切な生成と署名 です

keytool -gencert^
 -alias root^
 -ext BasicConstraints:critical=ca:true,pathlen:0^
 -ext KeyUsage:critical=keyCertSign,cRLSign^
 -infile intermediate.csr^
 -keypass changeit^
 -keystore root.jks^
 -outfile intermediate.pem^
 -rfc^
 -sigalg sha512withrsa^
 -storepass changeit^
 -storetype jks^
 -v

サブジェクト証明書

keytool -gencert^
 -alias intermediate^
 -ext BasicConstraints:critical=ca:false^
 -ext ExtendedkeyUsage:critical=serverAuth,clientAuth^
 -ext KeyUsage:critical=digitalSignature,keyEncipherment^
 -infile subject.csr^
 -keypass changeit^
 -keystore intermediate.jks^
 -outfile subject.pem^
 -rfc^
 -sigalg sha512withrsa^
 -storepass changeit^
 -storetype jks^
 -v

時間があれば回答を更新し、完全なソリューションを投稿します。

アップデート

必要なキー ストア ファイル、証明書などを生成するために作成したスクリプトを含む、 GitHub に小さなサンプル リポジトリをセットアップしました。スクリプトを Bash で書き直して、多くの構成パラメータを追加しました。何も設定せずに実行できます。この場合、root.lvh.meintermediate.lvh.me、およびsubject.lvh.meドメインの証明書を作成します (第 2 レベルのlvh.meドメインはデフォルトで127.0.0.1を指します)。Tomcat でサブジェクトキー ストアを使用し、ルート証明書を Firefox にインストールすると、 https://subject.lvh.meへの検証済みの安全な接続が確立されます。(そして他にはどこにもないので、https://intermediate.lvh.meは検証しません)。

于 2012-08-19T21:33:59.377 に答える