Herstellen von Verbindungen mit einer Verschlüsselung

JDBC-Treiber herunterladen

Anhand der Beispiele in diesem Artikel wird veranschaulicht, wie Eigenschaften von Verbindungszeichenfolgen verwendet werden können, die es Anwendungen ermöglichen, TLS-Verschlüsselung (Transport Layer Security) in einer Java-Anwendung zu verwenden. Weitere Informationen zu den neuen Eigenschaften für Verbindungszeichenfolgen (beispielsweise encrypt, trustServerCertificate, trustStore, trustStorePassword und hostNameInCertificate) finden Sie unter Festlegen der Verbindungseigenschaften.

Konfigurieren der Verbindung

Wenn die Eigenschaften encrypt und trustServerCertificate auf TRUE festgelegt sind, wird von Microsoft JDBC-Treiber für SQL Server keine Überprüfung des TLS-Zertifikats für SQL Server ausgeführt. Diese Einstellung wird häufig zum Zulassen von Verbindungen in Testumgebungen verwendet, beispielsweise wenn es für die SQL Server-Instanz nur ein selbst signiertes Zertifikat gibt.

Im folgenden Codebeispiel wird das Festlegen der trustServerCertificate-Eigenschaft in einer Verbindungszeichenfolge veranschaulicht:

String connectionUrl =
    "jdbc:sqlserver://localhost:1433;" +
     "databaseName=AdventureWorks;integratedSecurity=true;" +
     "encrypt=true;trustServerCertificate=true";

Wenn die encrypt-Eigenschaft auf TRUE und die trustServerCertificate-Eigenschaft auf FALSE festgelegt ist, wird von Microsoft JDBC-Treiber für SQL Server eine Überprüfung des TLS-Zertifikats für SQL Server ausgeführt. Das Überprüfen des Serverzertifikats ist Teil des TLS-Handshakes und stellt sicher, dass es sich bei dem Server tatsächlich um den Server handelt, mit dem eine Verbindung hergestellt werden soll. Zum Überprüfen des Serverzertifikats müssen die Vertrauensinformationen zur Verbindungszeit explizit mithilfe der trustStore-Verbindungseigenschaft und der trustStorePassword-Verbindungseigenschaft oder implizit mithilfe des Standardvertrauensspeichers der zugrunde liegenden Java Virtual Machine (JVM) übermittelt werden.

Die trustStore-Eigenschaft gibt den Pfad (einschließlich des Dateinamens) der trustStore-Zertifikatsdatei an. Diese enthält die Liste der Zertifikate, denen der Client vertraut. Die trustStorePassword-Eigenschaft gibt das Kennwort an, das verwendet wird, um die Integrität der trustStore-Daten zu überprüfen. Weitere Informationen zur Verwendung des Standardvertrauensspeichers von JVM finden Sie unter Konfigurieren des Clients für die Verschlüsselung.

Im folgenden Codebeispiel wird das Festlegen der trustStore-Eigenschaft und der trustStorePassword-Eigenschaft in einer Verbindungszeichenfolge veranschaulicht:

String connectionUrl =
    "jdbc:sqlserver://localhost:1433;" +
     "databaseName=AdventureWorks;integratedSecurity=true;" +
     "encrypt=true; trustServerCertificate=false;" +
     "trustStore=storeName;trustStorePassword=storePassword";

Der JDBC-Treiber stellt eine weitere Eigenschaft, hostNameInCertificate, bereit, die den Hostnamen des Servers angibt. Der Wert dieser Eigenschaft muss mit der subject-Eigenschaft des Zertifikats übereinstimmen.

Im folgenden Codebeispiel wird das Verwenden der hostNameInCertificate-Eigenschaft in einer Verbindungszeichenfolge veranschaulicht:

String connectionUrl =
    "jdbc:sqlserver://localhost:1433;" +
     "databaseName=AdventureWorks;integratedSecurity=true;" +
     "encrypt=true; trustServerCertificate=false;" +
     "trustStore=storeName;trustStorePassword=storePassword;" +
     "hostNameInCertificate=hostName";

Hinweis

Sie können den Wert von Verbindungseigenschaften auch mithilfe der entsprechenden Setter-Methoden festlegen, die von der SQLServerDataSource-Klasse bereitgestellt werden.

Wenn die encrypt-Eigenschaft auf TRUE, die trustServerCertificate-Eigenschaft auf FALSE festgelegt wurde und der Servername in der Verbindungszeichenfolge mit dem Servernamen im TLS-Zertifikat nicht übereinstimmt, wird der folgende Fehler ausgegeben: The driver couldn't establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "java.security.cert.CertificateException: Failed to validate the server name in a certificate during Secure Sockets Layer (SSL) initialization.". Ab Version 7.2 unterstützt der Treiber den Musterabgleich mit Platzhalterzeichen in der ganz links stehenden Bezeichnung des Servernamens im TLS-Zertifikat.