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