Problémy s certifikáty v Javě

Problémy s certifikáty v Javě

Last modified by Jakub Jirůtka on 2013-11-08, 20:34

Java (resp. JVM) nevyužívá systémové úložiště certifikátů, jako například webové prohlížeče, ale má separátní správu certifikátů. To mimo jiné znamená, že má také vlastní výchozí sadu důvěryhodných kořenových certifikátů.

Certifikáty ukládají do binárního, šifrovaného souboru ve formátu JKS. Pro práci s ním slouží nástroj keytool.

Problémy s nedůvěryhodnými certifikáty

Java vám standardně nedovolí navázat SSL/TLS spojení na server, který nemá platný a _důvěryhodný_ certifikát. Tady je nutné upozornit, že „platný“ a „důvěryhodný“ není totéž, jde o dvě rozdílná kritéria. Jednoduše řečeno, certifikát lze prohlásit za platný, když není expirovaný (tj. v něm uvedená doba platnosti ještě neuplynula) ani revokovaný. Jedná se o objektivní kritérium. Oproti tomu důvěryhodnost certifikátu je relativní a závisí na vašem „nastavení“. To, že certifikát není důvěryhodný, znamená, že není obsažen ve vaší sadě důvěryhodných certifikátů, ani není podepsaný žádnou certifikační autoritou, jejíž certifikát máte ve své sadě důvěryhodných certifikátů.

Na produkčních serverech se zpravidla používají certifikáty podepsané důvěryhodnou certifikační autoritou (CA). Tedy takovou, která je buď sama kořenovou CA, jejíž certifikát je obsažen ve výchozí sadě důvěryhodných certifikátů, nebo je takovou (tranzitivně) podepsaná. V takových případech by tedy mělo vše fungovat automaticky a pokud ne, tak bývá chyba na straně příslušného serveru.

Až na výjimky jsou však důvěryhodné CA komerční a vydávání certifikátů zpoplatňují. Serverové certifikáty také musí být vázané na veřejné doménové jméno nebo IP adresu. Z těchto důvodů se na různé testovací a vývojové servery, na které běžní uživatelé nepřistupují, typicky nedávají certifikáty podepsané CA. A tam právě narazíte na problém. Zatímco webový prohlížeč zobrazí jen upozornění, které můžete ignorovat, tak Java vám připojení odmítne.

Problém lze řešit dvěma způsoby – obejitím kontroly certifikátů, nebo přidáním dotyčných certifikátů mezi důvěryhodné. První způsob velmi nedoporučuji, neb tím podkopete bezpečnostní princip TLS/SSL certifikátů. Druhý způsob popíší na následujících řádcích.

Přidání certifikátu do existujícího úložiště (TrustStore)

V typickém případě, kdy potřebujete pouze zprovoznit HTTPS spojení na server, který nemá důvěryhodný certifikát, je nejlepší převzít výchozí úložiště certifikátů (TrustStore) a jen do něj doplnit potřebné certifikáty navíc.

Výchozí úložiště dodávané společně s JRE (Java Runtime Environment), resp. JDK, se nachází v ${JRE_HOME}/lib/security/cacerts. Konkrétní umístění adresáře JRE_HOME závisí na platformě:

  • OS X: /Library/Java/JavaVirtualMachines/<verze>.jdk/Contents/Home/
  • Windows: \Program Files\Java\jre<verze>\
  • Ubuntu/Debian: /usr/lib/jvm/<verze>/jre/

Nedoporučuji však přidávat certifikáty přímo sem, neboť provedené změny se po aktualizaci JRE/JDK přepíší. Místo toho si vytvořte kopii a tu dále upravujte.

  1. Připravte si certifikát ve formátu PEM, který chcete importovat do úložiště.

  2. Zkopírujte výchozí truststore z adresáře JRE např. do svého domovského adresáře:

    cp ${JRE_HOME}/lib/security/cacerts ~/.truststore
  3. Následně do něj importujte připravený certifikát example.org.pem:

    keytool -import -keystore ~/.cacerts -storepass changeit -alias example.org -file example.org.pem

    Argument alias může obsahovat libovolný název, doporučuji odpovídající doméně. Heslo changeit je všude stejné.

  4. Nakonec je potřeba JVM nastavit, aby použila vaše úložiště namísto výchozího (viz dále).

Použití vlastního úložiště certifikátů

Úložiště certifikátů se nastavuje při spuštění java procesu pomocí atributu javax.net.ssl.trustStore, který obsahuje cestu k JKS souboru (např. java -Djavax.net.ssl.trustStore=/path/to/truststore).

Tomcat na Linuxu

  1. Otevřete soubor /etc/default/tomcat7 (Ubuntu/Debian) nebo /etc/conf.d/tomcat-7 (Gentoo) v textovém editoru.

  2. Do proměnné JAVA_OPTS přidejte -Djavax.net.ssl.trustStore=/path/to/truststore.

  3. Změny uložte a restartujte Tomcat.

Tomcat na OS X

Spouštíte-li Tomcat přímo, pomocí skriptu startup.sh, proveďte následující kroky. Postup předpokládá, že máte Tomcat nainstalovaný přes homebrew.

  1. Přejděte do adresáře Tomcatu v /usr/local/Cellar/tomcat/<version>/libexec/bin/.

  2. Vytvořte zde soubor setenv.sh s následujícím obsahem:

    JAVA_OPTS=${JAVA_OPTS} -Djavax.net.ssl.trustStore=/path/to/truststore
  3. Změny uložte a restartujte Tomcat.

Tomcat na Windows

Spouštíte-li Tomcat přímo, pomocí skriptu startup.bat, proveďte následující kroky.

  1. Přejděte do domovského adresáře vaší instalace Tomcatu.

  2. Otevřete soubor bin/setenv.bat v textovém editoru.

  3. Na konec výčtu argumentů za příkazem set přidejte -Djavax.net.ssl.trustStore=/path/to/truststore a změny uložte. Příslušná řádka vypadá např. takto:

    set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF8 -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false -XX:MaxPermSize=256m -Djavax.net.ssl.trustStore=/path/to/truststore"

Tomcat přes IntelliJ IDEA

Spouštíte-li Tomcat přes IntelliJ IDEA, proveďte následující kroky.

  1. Otevřete z hlavního menu Run → Edit Configurations… a následně pod Tomcat Server vyberte konkrétní instanci.
  2. Do pole VM options přidejte: -Djavax.net.ssl.trustStore=/path/to/truststore a potvrďte změny.
  3. Máte-li Tomcat přes IDEA zrovna spuštěný, zastavte ho a znovu spusťte.

Vývojové servery Rozvoje

Všechny vývojové/testovací instance aplikací provozovaných Oddělením pro rozvoj mají certifikáty podepsané kořenovým certifikátem „Valkyrie CA“ (PEM). Jedná se o naši self-signed CA, není tedy podepsaná žádnou důvěryhodnou CA. Pracujete-li s vývojovými/testovacími instancemi, tak stačí, když si mezi důvěryhodné certifikáty přidáte pouze tento kořenový (pro Javu viz postup výše).

Tags: Java návod
Created by Jakub Jirůtka on 2013-11-07, 20:01

My Recent Modifications


This wiki is licensed under a Creative Commons BY-SA 3.0 license
XWiki Enterprise 5.4.1 - Documentation