2010-01-13 21 views
19

Wystąpił inny problem przy użyciu SSL i Tomcat: Skonfigurowałem magazyn kluczy, który zawiera klucz i certyfikat (certyfikat serwera, który chcę przedstawić klientom łączącym się z witryną). Zrobiłem to samo dla magazynu zaufanych certyfikatów (będę potrzebować uwierzytelniania klienta).Tomcat HTTPS certyfikat magazynu kluczy

Problem mam teraz jest to, że po podłączeniu do mojego instancji Tomcat poprzez HTTPS, świadectwo przedstawił mnie (certyfikat serwera) nie jest mój rzeczywisty certyfikat serwera, lecz klucz w magazynie kluczy JKS. Użycie opcji -Djavax.net.debug = ssl ujawnia, że ​​przedstawia prawidłowy urząd certyfikacji w celu uwierzytelnienia klienta, ale nie zawiera poprawnego certyfikatu serwera.

adding as trusted cert: 
    Subject: CN=A 
    Issuer: CN=A 
    Algorithm: RSA; Serial number: - 
    Valid from Tue Nov 10 14:48:31 CET 2009 until Mon Feb 08 14:48:31 CET 2010 

adding as trusted cert: 
    Subject: X 
    Issuer: X 
    Algorithm: RSA; Serial number: - 
    Valid from Wed Jan 19 01:00:00 CET 2005 until Mon Jan 19 00:59:59 CET 2015

Zastąpiłem prawdziwe wartości posiadaczami miejsc. A = nazwa domeny serwera (ale w tym przypadku z jakiegoś powodu jest to klucz, a nie certyfikat). X = VeriSign CA (powinno to być poprawne). Mam istniejący certyfikat, który chciałbym wykorzystać do przedstawienia klientom, który zaimportowałem do magazynu kluczy JKS za pomocą keytool.

Tomcat konfiguracji złącze:

 
Connector port="444" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true" 
clientAuth="false" sslProtocol="TLS"  
keystoreFile="conf/ssl/keystore.jks" 
keystorePass="xx" 
keyAlias="testkey" 
truststoreFile="conf/ssl/truststore.jks" 
truststorePass="xx"

Każdy pomysł, dlaczego moje wystąpienie Tomcat nie prezentuje odpowiedniego certyfikatu?

+0

podać konfigurację złącza ssl (z pliku server.xml) – Bozho

Odpowiedz

15

Problemem jest (podobno - Nie mogę tego potwierdzić), że to niemożliwe, aby prawidłowo zaimportować wcześniej wygenerowany certyfikat (i klucz dopasowujący) do magazynu kluczy JKS i odpowiednio go zaprezentuje Tomcat.

Sytuacja, w której wystąpił mój problem jest następujący:

  1. Mam plik certyfikatu, który ja sam wygenerowany przy użyciu OpenSSL od zera (klucz + CSR -> certyfikat), podpisane przez mojego własnego CA.
  2. Chcę skonfigurować Tomcat tak, aby prezentował ten konkretny certyfikat użytkownikom łączącym się z moją witryną.

Rozwiązanie znalazłem do pracy wynosi:

  1. Konwersja istniejącego certyfikatu i jego klucz prywatny w formacie DER.Na przykład (przy użyciu OpenSSL):

    Dla klucza prywatnego ;

    openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER

    Dla rzeczywistego podpisanego certyfikatu;

    openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER

  2. Importuj oba pliki DER do kluczy (plik JKS) przy użyciu niestandardowej klasy Java.

    java ImportKey my_private_key.der my_certificate.der

    nie wymyślimy sobie (wszystko zasługa oryginalnego twórcy (ów)). Źródłem tej klasy Java, a niektóre więcej szczegółów można znaleźć here i here. Lekko zmodyfikowałem tę klasę, aby pojawił się trzeci (lub czwarty) parametr określający lokalizację wyjściową wynikowego pliku JKS.

Końcowym wynikiem jest magazyn kluczy JKS, który można następnie wykorzystać w konfiguracji oprogramowania Tomcat jako magazyn kluczy. Powyższe narzędzie wygeneruje plik JKS z domyślnymi hasłami dla klucza i JKS złożyć się, można je zmienić później za pomocą keytool -storepasswd i keytool -keypasswd. Mam nadzieję, że pomoże to osobom mającym ten sam problem.

+2

+1. Drugi link (agentbob.info) pracował dla mnie. Wydaje hasło do magazynu kluczy, którego pierwszy link (comu.de) nie zawiera. Keytool Java nie lubi zmieniać hasła magazynu kluczy, który nie ma hasła. Możesz również podać kluczowy alias, którego oczekuje tomcat (to "tomcat"). – Wolfgang

3

Twoja konfiguracja powinna działać poprawnie.

Tomcat's how-to wyjaśnia, jakie kroki należy podjąć, aby uzyskać właściwy JKS.

Upewnij się, że importowany certyfikat do JKS, z odpowiednim alias (testKey)

+0

Po ustawieniu keyAlias ​​na alias certyfikatu w magazynie kluczy, Tomcat nie uruchomi się poprawnie. Zakładam, że parametry keyAlias ​​są używane do określenia klucza, a nie certyfikatu. mam wrażenie, że nigdy nie będzie prawidłowo Tomcat zaprezentować moje świadectwo, ponieważ został stworzony osobno. Teraz spróbuję wygenerować zupełnie nowy certyfikat od podstaw, używając keytool zamiast openssl i zobaczę, czy to ma znaczenie. – tmbrggmn

+1

tak, spróbuj tego. Klucz i certyfikat, jak można zobaczyć w tomcat how-to, mają być pod tym samym aliasem. – Bozho

+0

Moja poprzednia próba nie powiodła się. Robię coś nie tak, ale nie wiem co. Czy możliwe jest nawet przedstawienie istniejącego certyfikatu, czy też trzeba użyć keytool do wygenerowania nowego? To jest mylące. – tmbrggmn

2

Rozszerzając @Bozho komentarza,

To był naprawdę krytyczna. "Klucz i zakupiony certyfikat mają być pod tym samym aliasem".

Certyfikat SSL zakupione od CA (Verisign, DigiCert etc.) powinny być importowane z tego samego pseudonimu jak wygenerowanego klucza prywatnego przed utworzeniem CSR. Po zaimportowaniu zakupionego certyfikatu do magazynu kluczy przy użyciu keja java, pojawi się "Dodano odpowiedź na certyfikat do magazynu kluczy".

Aby sprawdzić łańcuch zaufania, użyj polecenia terminalu: openssl s_client -connect yourdomain.com:443 -showcerts. Zaczyna się od twojego certyfikatu i prowadzi do zaufanego głównego CA.

Powiązane problemy