web-dev-qa-db-ja.com

tomcatは中間証明書(https)を配信しません

Openssl実行可能ファイルを使用して、コンソールでキーとcsrを作成しました。次に、CSRをCAに送信し、証明書を取り戻しました。これをTomcatにインポートします。

そこで、キーと証明書からPKCS#12ファイルを作成しました。

openssl pkcs12 -export -in mycert.cert -inkey mykey.pem -out key_and_cert.p12

そしてそれを含むキーストアを作成しました:

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]

次に、中間証明書チェーンをインポートします。crt:

keytool -import -trustcacerts -alias root -file chain.crt -keystore keystore.jks

ここで「keytool -keystore keystore.jks -list」の出力:

Keystore-Typ: JKS
Keystore-Provider: Sun

Ihr Keystore enthält 2 Einträge.

root, 14.11.2011, trustedCertEntry,
Zertifikatsfingerabdruck (MD5): [fingerprint]
1, 14.11.2011, PrivateKeyEntry, 
Zertifikatsfingerabdruck (MD5): [fingerprint]

Tomcat server.xmlには以下が含まれます。

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" URIEncoding="UTF-8" compression="on"
           sslProtocol="TLS"
           keystoreFile="/[absolute-path]/keystore.jks"
           keystorePass="[password]" />

Tomcatを再起動すると、catalina.outにエラーが記録されず、すべて問題ないようです。しかし、Firefoxを実行すると、

[domain] uses an invalid security certificate.
The certificate is not trusted because no issuer chain was provided.
(Error code: sec_error_unknown_issuer)

「openssl s_client -connect [domain]:443 -showcerts」を実行すると、

CONNECTED(00000003)
depth=0 C = DE, OU = Domain Control Validated, CN = [domain]
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = DE, OU = Domain Control Validated, CN = [domain]
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = DE, OU = Domain Control Validated, CN = [domain]
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/C=DE/OU=Domain Control Validated/CN=[domain]
   i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2
-----BEGIN CERTIFICATE-----
[certificate from mycert.cert]
-----END CERTIFICATE-----
---
Server certificate
subject=/C=DE/OU=Domain Control Validated/CN=[domain]
issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 289 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : SSLv3
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: [session-id]
    Session-ID-ctx: 
    Master-Key: [master-key]
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1321268519
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

Tomcatは中間証明書を知っていますが、提供していません。 Tomcatに配信させるにはどうすればよいですか?

追加情報:pkcs12証明書をインポートする場合、-importkeystoreコマンドはチェーンをチェックしないため、証明書チェーンエラーはありません。最初に中間証明書をインポートしてから、-importkeystoreを呼び出してみました。私は同じ結果を得ました。

編集:チェーンをPKCS#12証明書に直接挿入して別の方法を試したところ、次のエラーが発生しました。

$ openssl pkcs12 -export -CAfile chain.pem -in mycert.cert -inkey mykey.pem -out key_and_cert.p12 -name Tomcat -chain
Error unable to get issuer certificate getting chain.

しかし、チェーン証明書は大丈夫です:

$ openssl verify chain.pem
chain.pem: OK
25
Heinzi

最後に私はそれを働かせました。クリーンなソリューションではありませんが、機能します。中間証明書をローカルの/ etc/ssl/certsに追加して呼び出しました

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain

結果のpkcs12証明書は、私がjksに変換しました

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]

この結果のファイルは正常に機能しているようです。Tomcatは、/ etc/ssl/certsディレクトリに中間証明書がないクライアントにも証明書チェーンを配信します。しかし、/ etc/ssl/certsを変更しない方法も必要だと思います。

6
Heinzi

発行者のルート証明書を見つけてCAファイルを作成し、中間ファイルをその上に同じファイルで配置する必要がありました。それから私は走った:

 openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "Tomcat" -CAfile中間_plus_root.crt -out key_and_cert.p12 
13
juanenrique

いくつかのコメントで求められているように、さらに簡単な解決策があります(ルート証明書と中間証明書を/ etc/ssl/certsに保存しないで)

最初に、必要なすべてのルート証明書と中間証明書をフォルダーにコピーします(この例では、フォルダーは '〜/ certs'で、2つの証明書の名前は 'PrimaryCA.pem'と 'SecondaryCA.pem'です)。

mkdir ~/certs
mv PrimaryCA.pem ~/certs/PrimaryCA.pem
mv SecondaryCA.pem ~/certs/SecondaryCA.pem

次に、フォルダを「c_rehash」します。

c_rehash ~/certs

これで、certsフォルダーには、次のスキーム「{hash-value}。{n}」に関して名前が付けられた2つの新しいシンボリックリンクが含まれます。ここで、{hash-value}は8シンボルのハッシュ値で、{n}は整数です。その場合は、次のコマンドに進み、証明書を/ etc/ssl/certsにコピーするのではなく、「-CApath」を使用して.p12を作成します。

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs

最後に、それを Heinzi としてjksに変換します。

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
8

これは、APRを使用する私にとっては機能します。 http://Tomcat.Apache.org/Tomcat-7.0-doc/config/http.html#SSL_Support_-_APR/Native を参照してください

  <Connector port="3573" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               SSLCertificateFile="/my/pem/encoded/certificate/file"
               SSLCertificateKeyFile="/my/pem/encoded/certificate/private_key"
               SSLPassword="yourKeyFilePassword"
               SSLCertificateChainFile="/my/pem/encoded/certificate/authorities/file"
               />
6
Gaucho

openssl caファイルを中間ファイルにコピーしてください。

rHELで次のファイルを発行者のcaファイルに連結します。

/etc/pki/tls/certs/ca-bundle.crt
0
kavehmb