5 Stimmen

Wie verwendet man den Windows Keystore (MCS) mit JDBC?

Ich versuche, eine Java-Anwendung zu erstellen, die Folgendes verwendet PKI zur Authentifizierung. Ich muss in der Lage sein, ein Zertifikat aus dem Microsoft Certificate Store (MCS) abzurufen und es an eine Oracle-Datenbank (11.2) weiterzugeben.

Ich stelle die Verbindung über die jdbc:oracle:thin Fahrer. Nachdem ich einige Zeit auf Google verbracht habe, bin ich leer ausgegangen. Ich habe verschiedene Eigenschaften zu ändern (je nach Artikel) gefunden:

  • die Eigenschaft javax.net.ssl.keyStoreType = "Windows-MY"
  • setzen die javax.net.ssl.keyStore = "Windows-MY"
  • javax.net.ssl.keyStore should be set to "None" (wenn Sie einen benutzerdefinierten KeyManager verwenden, was meiner Meinung nach nicht funktionieren wird, da ich zu dem Zeitpunkt, zu dem es in meinen benutzerdefinierten KeyManager gelangt, bereits die Zertifikate aus einem in den Verbindungseigenschaften angegebenen Schlüsselspeicher erhalten werde).

Natürlich behaupten alle diese Leute, erfolgreich zu sein, aber bei mir hat nichts funktioniert. Ich habe jedes Beispiel ausprobiert, das ich finden konnte, ohne Erfolg. Ich konnte mich erfolgreich authentifizieren, als ich Oracle-Wallets verwendet habe, also weiß ich, dass meine Zertifikate in Ordnung sind. Wenn jemand dies bereits getan hat und bereit ist, einen Code zu posten, wäre das großartig.

Ich weiß, dass die meisten Leute den Windows-Keystore mit einer Website verwenden und daher ihren eigenen SSLContext erstellen, aber ich kann mir nicht vorstellen, dass ich der Einzige bin, der dies mit JDBC tun wollte (was meines Wissens nach nicht erlaubt, einen SSLContext bereitzustellen).

Dies ist der Code, der meiner Meinung nach funktionieren sollte, es aber nicht tut.

DriverManager.registerDriver)new OracleDriver());
String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=host)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=someName))(SECURITY= (SSL_SERVER_CERT_DN=\"CN=TESTSERVER\")))";

java.util.Properties props = new java.util.Properties();
props.setProperty("javax.net.ssl.keyStoreType", "Windows-MY");
props.setProperty("javax.net.ssl.keyStore", "NONE");
props.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");
props.setProperty("javax.net.ssl.trustStore", "NONE");

props.setProperty("oracle.net.ssl_server_dn_match", "true");
props.setProperty("oracle.net.authentication_services", "(TCPS)");
Connection conn = DriverManager.getConnection(url, props);

Dieser Code schlägt mit der Ausnahme fehl:

java.sql.SQLRecoverableException: IOException: The Network Adapter could not establish the connection

3voto

Bruno Punkte 114719

Dieser Artikel sollte Ihnen weitere Einzelheiten liefern. Obwohl es nicht die Systemeigenschaften verwendet, Windows-MY ist eindeutig ein Speichertyp und nicht dateibasiert. Deshalb, javax.net.ssl.keyStoreType sollte sein Windows-MY y javax.net.ssl.keyStore sollte eingestellt werden auf NONE (Großschreibung kann wichtig sein), siehe die JSSE Ref Guide (Anpassung) :

javax.net.ssl.keyStore Systemeigenschaft

Beachten Sie, dass der Wert NONE angegeben werden kann. Diese Einstellung ist geeignet, wenn der Schlüsselspeicher nicht dateibasiert ist (er befindet sich beispielsweise in einem Hardware-Token).

Möglicherweise müssen Sie auch Ihren Vertrauensspeicher auf ähnliche Weise konfigurieren, wenn Ihr Serverzertifikat von Ihrem Standard-Java-Vertrauensspeicher nicht als vertrauenswürdig eingestuft wird.

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