it-swarm.com.de

tomcat liefert kein Zwischenzertifikat (https)

Ich habe einen Schlüssel und ein CSR auf der Konsole erstellt und dabei die ausführbare Datei openssl verwendet. Dann schickte ich das CSR an eine Zertifizierungsstelle und erhielt das Zertifikat zurück. Jetzt möchte ich es in Tomcat importieren.

Also habe ich aus meinem Schlüssel und meinem Zertifikat eine PKCS # 12-Datei erstellt:

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

und erstellte dann einen Schlüsselspeicher mit diesem:

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

Dann importiere ich das Zwischenzertifikat chain.crt:

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

Hier die Ausgabe von "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]

Die Tomcat server.xml enthält:

<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]" />

Wenn ich Tomcat neu starte, werden keine Fehler in catalina.out protokolliert. Alles scheint in Ordnung zu sein. Aber wenn ich Firefox starte, meldet es

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

Das Ausführen von "openssl s_client -connect [Domäne]: 443 -showcerts" wird zurückgegeben

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)
---

Ich denke, Tomcat liefert das Zwischenzertifikat nicht aus, obwohl es es weiß. Was kann ich tun, damit Tomcat es liefert?

Zusätzliche Informationen: Beim Importieren des Zertifikats pkcs12 liegt kein Fehler in der Zertifikatskette vor, da der Befehl -importkeystore die Kette nicht überprüft. Ich habe auch versucht, das Zwischenzertifikat zuerst zu importieren und dann -importkeystore aufzurufen. Ich habe die gleichen Ergebnisse erhalten.

edit: Ich habe gerade eine andere Möglichkeit ausprobiert, indem ich die Kette direkt in das PKCS # 12-Zertifikat eingefügt habe und die folgende Fehlermeldung erhalten:

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

Aber das Kettenzertifikat ist in Ordnung:

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

Endlich habe ich es geschafft. Es ist keine saubere Lösung, aber es funktioniert. Ich habe das Zwischenzertifikat zu meinem lokalen/etc/ssl/certs hinzugefügt und dann aufgerufen

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

Das resultierende pkcs12-Zertifikat habe ich über in jks konvertiert

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

Diese resultierende Datei scheint jetzt zu funktionieren, Tomcat liefert die Zertifikatskette auch an Clients, die das Zwischenzertifikat nicht im Verzeichnis/etc/ssl/certs haben. Aber ich denke, es muss auch einen Weg geben, ohne sich zu ändern/etc/ssl/certs.

6
Heinzi

Ich musste eine CA-Datei erstellen, indem ich das Stammzertifikat für meinen Aussteller ausfindig machte und das Zwischenzertifikat darüber in derselben Datei ablegte. Dann lief ich:

 openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "Tomcat" -CAfile intermediary_plus_root.crt -out key_and_cert.p12 
12
juanenrique

Es gibt sogar eine einfachere Lösung, wie in einigen Kommentaren verlangt (ohne das Speichern von Root- und Zwischencerts in/etc/ssl/certs).

Kopieren Sie zuerst alle erforderlichen Stamm- und Zwischenzertifikate in einen Ordner (in unserem Beispiel lautet der Ordner '~/certs' und unsere beiden Zertifikate heißen 'PrimaryCA.pem' und 'SecondaryCA.pem'):

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

Dann 'c_rehash' den Ordner:

c_rehash ~/certs

Nun enthält der certs-Ordner zwei neue symbolische Links, die das folgende Schema '{Hashwert}. {N}' tragen, wobei {Hashwert} ein 8-Symbol-Hashwert und {n} eine Ganzzahl sind. Wenn dies der Fall ist, fahren Sie mit dem folgenden Befehl fort, der Ihre .p12 mit '-CApath' erstellt, anstatt die Zertifikate nach/etc/ssl/certs zu kopieren:

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

Konvertieren Sie es schließlich in jks als Heinzi , das in seiner Antwort bereits perfekt beschrieben wurde:

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

Es funktioniert für mich mit APR. Siehe 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

stellen Sie sicher, dass Sie die Dateien openssl ca in die Zwischendateien kopieren.

auf RHEL concat folgende Datei zu Ihrer Aussteller-CA-Datei.

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