2 Stimmen

Java-Webservice-Client, Zertifikat des Clients dynamisch ändern

Ich habe das folgende Problem. Ich habe einen Webservice, der Endpunkte hat, die über SSL aufgerufen werden können, und einige, die nur aufgerufen werden können, wenn auch ein Clientzertifikat verwendet wird, um den Client zu authentifizieren. Das Problem ist, dass ich das Client-Seiten-Zertifikat dynamisch ändern möchte. Mein Code lautet:

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//...
// erster Webservice-Aufruf, ohne Client-Zertifikat -> OK
//...
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStore", "keystore1.jks");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
//...
// zweiter Webservice-Aufruf

Mein Problem tritt beim zweiten Aufruf auf. Hier erhalte ich eine Ausnahme:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

Wenn ich nur den zweiten Teil des Codes ausführe, funktioniert alles einwandfrei, es funktioniert perfekt (also habe ich das keystore.jks mit dem Client-Zertifikat, und der Server authentifiziert meine Anfrage korrekt). Was mache ich falsch? Wie kann ich das Client-Seiten-Zertifikat dynamisch ändern, wenn ich Webservices aufrufe?

3voto

Alex Punkte 13651

Was meiner Vermutung nach passiert, ist, dass Sie eine Methode verwenden, die den Standard-JSSE SSLContext für ihre SSL-Socketfactory verwendet. Aus der Dokumentation geht hervor, dass der SSL-Kontext nur einmal konfiguriert wird, wenn er zum ersten Mal erstellt wird, und das Setzen der Systemeigenschaften nach seiner ersten Verwendung keine Auswirkungen hat.

Ich empfehle die Verwendung von Apache HttpClient. Ihre SSLSocketFactory -Implementierung ermöglicht eine programmatische Anpassung des Keystore und Truststore, die für Verbindungen verwendet werden, die mit dieser Factory hergestellt wurden. Darüber hinaus bietet Ihnen HttpClient eine ganze Reihe von Funktionen und Konfigurationsoptionen, die Sie mit der Standard-JDK nicht erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X