Monday, September 6, 2010

Java i HTTPS

Cada vegada que haig d'accedir a una URL per HTTPS des de Java tinc els mateixos maldecaps. I per connectar-me a HTTPS vull dir una cosa tan senzilla com fer:
URL url = new URL("https://servidor.com/");

Si la URL a la que vols accedir és d'un servidor ben conegut, segur que els seus certificats han estat emesos per una Autoritat Certificadora coneguda per Sun (ara Oracle) i tot anirà a la primera. Si no és el cas i es tracta d'un certificat emès per una entitat relativament petita, o fins i tot un certificat autosignat, comencen els problemes.

Cal saber que els certificats arrel que manega la màquina virtual java (si no s'especifica el contrari amb -Djavax.net.ssl.trustStore), es troben a un fitxer anomenat cacerts que es troba a java.home/lib/security. Si tens més d'un Java instal·lat el primer que has de saber és quin estàs fent servir. I que el PATH i el JAVA_HOME siguin correctes.

L'eina per explorar i modificar aquest repositori de claus és el keytool que ve amb el Java. Per llistar els valors de cacaerts, per exemple, cal llençar la següent comanda des del directori correcte (noteu que el password per defecte és changeit):
keytool -list -v -keystore cacerts -storepass changeit -storetype jks

Si l'emisor dels certificats no és dels "coneguts", no hi serà al cacerts. Així que si és alguna cosa com la Fábrica Nacional de Moneda y Timbre o l'Agència Catalana de Certificació et toca obtenir els certificats i instal·lar-los amb el keytool. Hi ha molts tutorials de com obtenir i instal·lar certificats.

Si el que tens és un certificat autosignat, el que necessites és que Java no el validi. No és molt segur, però de vegades no tens més remei. Aquesta pàgina d'exemple mostra com desactivar la validació de certificats en Java.

Finalment anoto uns enllaços que he trobat interessants:

3 comments:

Miquel Angel said...

Sembla q tu tb t'has hagut de barallar amb els certificats...

David said...

"Per llistar els valors de cacaerts...". T'ha traït el subconscient? :)

Cardi said...

Qué recuerdos, qué recuerdos... ;-)