Klientautentisering med digitalt certifikat
Nyligen skulle jag implementera ett anrop mot en extern webbtjänst som förutom att vi körde över SSL även krävde att klienten (jag) skulle identifiera sig med ett digitalt certifikat utfärdat av Verisign.
Verktyget keytool som kommer med JDK:en kan skapa ett certifikat åt dej, man kan även skapa en CSR (Certificate Signing Request) som man kan skicka till en CA (Certificate Authority) för att få sitt certifikat signerat. Går man den här vägen så tar det förmodligen någon dag innan man får sitt certifikat signerat, en annan väg att gå är att via Verisign’s hemsida skaffa sig ett 60-dagars test certifikat.
Jag valde den senare vägen. Men när man skaffar sig sitt testcertifikat via Versigns hemsida så blir det installerat i den browser som man avänder vid förfrågan. Frågan som uppstod för mej då var; ”hur gör jag för att använda certifikatet som har blivit installerat i min browser för att identifiera mej själv vid anropet av den externa webbtjänsten”? Jag Googlade runt för att hitta några exempel utan någon större framgång. Så efter endel ”trial and error” så kom jag underfunn med en relativt enkel procedur som jag här nedan tänkte presentera för framtida referens.
- Gå in på Versign’s sajt och följ instruktionerna för att skaffa ett test certifikat
- Öppna Internet-alternativ(jag använde IE när jag skaffade testcertifikatet), välj fliken ‘Innehåll’, klicka på knappen ‘Certifikat’
- Välj fliken ‘Privat’, markera ditt nya certifikat ock klicka på knappen ‘Exportera’
- Klicka på ‘Nästa’, välj ‘Ja, exportera den privata nyckeln’ och klicka på ‘Nästa’
- Markera ‘Inkludera om möjligt alla certifikat i certifieringssökvägen’
- Kolla så att ‘Aktivera starkt skydd’ och ‘Ta bort den private nyckeln om exporten lyckas’ ej är markerade. 7. Klicka på ‘Nästa’ och fyll i ditt lösenord som du valde när du skaffade dej certifikatet på Verisign’s sajt.
- Klicka på ‘Nästa’, välj filnamn och klicka på ‘Nästa’
- Klicka på ‘Slutför’
- Nu skall det ha skapats en fil med namnet du valde och filändelsen .pfx (PKCS12 format)
Nu kan du skicka in följande VM argument när du kör din applikation:
java -Djavax.net.ssl.keyStore=<sökvägen till din fil>/<ditt namn>.pfx -Djavax.net.ssl.keyStorePassword=<ditt lösenord> -Djavax.net.ssl.keyStoreType=pkcs12 MyApp
Eller så kan du sätta egenskaperna direkt i din kod:
System.setProperty("javax.net.ssl.keyStore","<sökvägen till din fil>/<ditt namn>.pfx"); System.setProperty("javax.net.ssl.keyStorePassword","<ditt lösenord>"); System.setProperty("javax.net.ssl.keyStoreType","pkcs12");
En bra egenskap att ha lite koll på när man håller på med SSL är** -Djavax.net.debug=all**, sätter man den så genereras en massa debuginfo som förstås är rätt kryptisk att tolka, men som tur är finns det en bra länk:
http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/ReadDebug.html
Andra bra länkar för referensläsning:
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Security5.html#wp483568
http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html
Ett bra verktyg när man stökar omkring med certifikat:
http://www.alphaworks.ibm.com/tech/keyman