Jak se dostat na zabezpečené služby státní správy?


Pod mírně bulvárním názvem tohoto blogpostu nehledejte žádný návod na hákování webů státních institucí. Pouze jsem se snažil vytvořit klienta (v Javě) pro komunikaci s webovými službami nalézajícími se na serveru, který je zajištěn certifikátem vydaným certifikační autoritou PostSignum a aby to nebylo tak jednoduché, tak uživatel je autentikován na základě osobního certifikátu.

Každý slušný člověk začne nejprve googlením, kdy najde nejeden příklad navazování spojení pomocí https (řekněme HTTP over TLS), další googlení potom poodkryje další příklady, tentokrát jak použít klientský certifikát. Na tomto základě už je možné začít stavět, nejprve tedy metoda pro získání ssl socket factory, kterou použijeme pro kontrolu identity:

[code lang=“java“]
private SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword) throws…{
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream keyInput = new FileInputStream(pKeyFile);

keyStore.load(keyInput, pKeyPassword.toCharArray());
keyInput.close();
keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

return context.getSocketFactory();
}
[/code]

Tato factory se předá do vytvářeného zabezpečeného spojení, kdy je tímto způsobem poskytnut údaj pro autentikaci uživatele na straně serveru. Tedy metoda vracející toto spojení:

[code lang=“java“]
public HttpsURLConnection getConnection() throws …{
URL url = new URL("https://server:844/");
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

con.setSSLSocketFactory(getFactory(new File("cert_sign.p12"), "heslo"));

return con;
}
[/code]

Teď je možné se pomocí zavolání connect() připojit, ale protože nejsou v úložišti důvěryhodných certifikátů vložené certifikátu serveru, snaha o připojení skončí s výjimkou:

[code]
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[/code]

Nejprve jsem se snažil mezi důvěryhodné certifikáty importovat certifikát kořenové autority PostSignum pomocí nástroje keytool

[code lang=“shell“]
sudo keytool -import -alias gwc.cpost.cz -keystore /etc/java-6-sun/security/cacerts -file root.pem
[/code]

což však nevedlo nikam, potřeboval jsem konkrétní certifikáty konkrétního stroje a s tím mi pomohla utilitka InstallCert (zdrojový kód, takže je to důvěryhodné ;-)). Vytvořený soubor jssecacerts je vlastně původní cacerts s přidanými certifikáty požadovaného serveru, takže je možné jej nakopírovat na odpovídající místo, pomocí keytool -list se podívat, jestli je vše v pořádku a opět vyzkoušet spojení.

Spojuje se, ale to je tak celé, takže se teď zabývám následujícími odkazy:


Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *