Egy on-line fizetéses alkalmazás fejlesztése közben futottam bele abba a problémába, hogy https protokollon keresztül kell kapcsolódni a banki rendszerhez. Első hallásra nem is tűnik olyan bonyolultnak a dolog, azonban a megvalósítás közben belefutottam egy igen kellemetlen körülménybe. A teszt rendszer tanusítványa lejárt. Az ügyeletes rendszer-gazdával konzultálva megnyugtatott, hogy az éles rendszerben nem lesz probléma,... egy darabig,... még jó, hogy szóltam! Álmomban sem gondoltam volna, hogy ilyen előfordulhat egy banknál, mégha tesztrendszerről is van szó.
HttpClient httpclient = new HttpClient(); Protocol myhttps = new Protocol("https", new SSLProtocolSocketFactory(), 443); httpclient.getHostConfiguration().setHost("somehost.tld", 443, myhttps); GetMethod method = new GetMethod("/some_uri"); //PostMethod to post data try { httpclient.executeMethod(method); String response = new String(method.getResponseBody()); } finally { method.releaseConnection(); }
A kódot futtatva az alábbi Exception-t kaptam:
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
Első teendőnk ebben az esetben, hogy megszerezzük a tanusítvány publikus részét, majd letöltve hozzáadjuk egy kulcs-tartóhoz, az alábbi paranccsal:
keytool -importcert -trustcacerts -alias untrustedCert -file somecert.crt -keystore /usr/lib/jvm/java/jre/lib/security/cacerts
Mivel én fejlesztői környezetben szeretnék kapcsolódni, a Java alapértelmezett kulcs-tartójához adtam hozzá a tanusítványt, az alapértelmezett "changeit" jelszó segítségével. Ezek után nincs más dolgunk, mint a JVM-nek átadni paraméterként, hogy a kiszemelt kulcs-tartót fogadja el mindenképpen hitelesnek.
-Djavax.net.ssl.trustStore=/usr/lib/jvm/java/jre/lib/security/cacerts
Arra még érdemes figyelni, ha webes alkalmazásból hívsz meg HTTPS-es dolgot, akkor a webkonténer truststore-jába kell betenni a certet a megfelelő formában.
VálaszTörlésNo meg, ha a cert Root CA-ja nincsen beimportálva a truststore-ba, akkor az is okozhat még problémákat. ;)
Van egy másik lehetőség is: futása közben csinálni egy saját truststore-t, amibe azonnal beleimportálja az ember a szükséges kulcsokat. Mindezt úgy, hogy a user semmit sem lát belőle, semmit sem kell beállítania.
VálaszTörlés