Share via


Verstehen der Verschlüsselungsunterstützung

JDBC-Treiber herunterladen

Wenn die Anwendung beim Herstellen einer Verbindung mit SQL Server eine Verschlüsselung anfordert und die Instanz SQL Server für die Unterstützung von TLS-Verschlüsselung konfiguriert ist, initialisiert Microsoft JDBC-Treiber für SQL Server den TSL-Handshake. Mithilfe des Handshakes können der Server und der Client die Verschlüsselungs- und Kryptografiealgorithmen aushandeln, mit denen Daten geschützt werden sollen. Nach Abschluss des TLS-Handshakes können der Client und der Server die verschlüsselten Daten sicher senden. Während des TLS-Handshakes sendet der Server sein Zertifikat für öffentliche Schlüssel an den Client. Der Aussteller eines Zertifikats für öffentliche Schlüssel wird als Zertifizierungsstelle bezeichnet. Der Client ist dafür verantwortlich zu überprüfen, ob er der Zertifizierungsstelle vertrauen kann.

Wenn die Anwendung keine Verschlüsselung anfordert, erzwingt Microsoft JDBC-Treiber für SQL Server nicht die Unterstützung von TLS-Verschlüsselung durch SQL Server. Wenn die Instanz SQL Server nicht für das Erzwingen der TSL-Verschlüsselung konfiguriert wurde, wird eine Verbindung ohne Verschlüsselung hergestellt. Falls die Instanz SQL Server für das Erzwingen der TSL-Verschlüsselung konfiguriert ist, aktiviert der Treiber automatisch die TSL-Verschlüsselung, wenn er auf einer ordnungsgemäß konfigurierten Java Virtual Machine-Instanz (JVM) ausgeführt wird. Andernfalls wird die Verbindung getrennt, und der Treiber löst einen Fehler aus.

Hinweis

Stellen Sie sicher, dass der an serverName übergebene Name für eine erfolgreiche TSL-Verbindung exakt dem CN (Common Name, allgemeiner Name) oder dem DNS-Namen im SAN (Subject Alternate Name, alternativer Antragstellername) im Serverzertifikat entspricht.

Weitere Informationen zum Konfigurieren von TLS für SQL Server finden Sie unter Aktivieren von verschlüsselten Verbindungen zur Datenbank-Engine.

Bemerkungen

Damit TSL-Verschlüsselung von Anwendungen verwendet werden kann, hat Microsoft JDBC-Treiber für SQL Server ab Version 1.2 die folgenden Verbindungseigenschaften eingeführt: encrypt, trustServerCertificate, trustStore, trustStorePassword und hostNameInCertificate. Damit der Treiber TDS 8.0 mit TLS-Verschlüsselung verwenden kann, wurde ab Version 11.2 die Verbindungseigenschaft serverCertificate eingeführt. Weitere Informationen zum Festlegen der Verbindungseigenschaften finden Sie unter Festlegen von Verbindungseigenschaften.

In der folgenden Tabelle wird das Verhalten der Version Microsoft JDBC-Treiber für SQL Server in möglichen TSL-Verbindungsszenarios zusammengefasst. In jedem Szenario werden andere TSL-Verbindungseigenschaften verwendet. Die Tabelle schließt Folgendes ein:

  • blank: „Die Eigenschaft ist in der Verbindungszeichenfolge nicht vorhanden.“
  • value: „Die Eigenschaft ist in der Verbindungszeichenfolge vorhanden und ihr Wert ist gültig.“
  • any: „Es spielt keine Rolle, ob die Eigenschaft in der Verbindungszeichenfolge vorhanden oder ihr Wert gültig ist.“

Hinweis

Das gleiche Verhalten trifft auf die SQL Server-Benutzerauthentifizierung und die integrierte Windows-Authentifizierung zu.

Eigenschafteneinstellungen Verhalten
encrypt = false or blank
trustServerCertificate = any
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
Der Treiber erzwingt nicht die Unterstützung von TLS-Verschlüsselung durch den Server. Wenn der Server ein selbst signiertes Zertifikat aufweist, initiiert der Treiber den TSL-Zertifikataustausch. Das TSL-Zertifikat wird nicht überprüft, und nur die Anmeldeinformationen (im Anmeldepaket) werden verschlüsselt.

Wenn der Server erfordert, dass der Client TSL-Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch. Das TSL-Zertifikat wird nicht überprüft, aber die gesamte Kommunikation wird verschlüsselt.
encrypt = true
trustServerCertificate = true
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch. Wenn die Eigenschaft trustServerCertificate auf „true“ festgelegt wurde, überprüft der Treiber das TLS-Zertifikat nicht.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = blank
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet die in der Verbindungs-URL angegebene Eigenschaft serverName, um das TLS-Zertifikat des Servers zu überprüfen. Außerdem werden die Suchregeln der Trust-Manager-Factory verwendet, um den zu verwendenden Zertifikatspeicher zu ermitteln.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber überprüft den subject-Wert des TLS-Zertifikats mithilfe des für die Eigenschaft hostNameInCertificate angegebenen Werts.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = value
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet den trustStore-Eigenschaftswert zum Ermitteln der trustStore-Zertifikatdatei und den trustStorePassword-Eigenschaftswert zum Überprüfen der Integrität der trustStore-Datei.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = value
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet den trustStorePassword-Eigenschaftswert zum Überprüfen der Integrität der trustStore-Standarddatei.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = blank
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet den trustStore-Eigenschaftswert, um den Speicherort der trustStore-Datei zu ermitteln.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = value
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet den trustStorePassword-Eigenschaftswert zum Überprüfen der Integrität der trustStore-Standarddatei. Außerdem verwendet der Treiber den Eigenschaftswert hostNameInCertificate zum Überprüfen des TLS-Zertifikats.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = blank
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet den trustStore-Eigenschaftswert, um den Speicherort der trustStore-Datei zu ermitteln. Außerdem verwendet der Treiber den Eigenschaftswert hostNameInCertificate zum Überprüfen des TLS-Zertifikats.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = true
trustServerCertificate = false oder blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = value
Der Treiber fordert die Verwendung von TLS-Verschlüsselung beim Server an.

Wenn der Server erfordert, dass der Client TLS-Verschlüsselung unterstützt oder der Server die Verschlüsselung unterstützt, initiiert der Treiber den TLS-Zertifikataustausch.

Der Treiber verwendet den trustStore-Eigenschaftswert zum Ermitteln der trustStore-Zertifikatdatei und den trustStorePassword-Eigenschaftswert zum Überprüfen der Integrität der trustStore-Datei. Außerdem verwendet der Treiber den Eigenschaftswert hostNameInCertificate zum Überprüfen des TLS-Zertifikats.

Wenn der Server nicht für die Unterstützung von Verschlüsselung konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.
encrypt = strict
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
serverCertificate = value
Der Treiber fordert die Verwendung von TLS-Verschlüsselung (TDS 8.0 strict) beim Server an.

Der Treiber initiiert den TLS-Handshake und den Zertifikataustausch mit dem Server als erste Aktion.

Die Einstellung trustServerCertificate wird ignoriert und im Modus strict als „false“ behandelt.

Der Treiber verwendet die optionalen Eigenschaften hostNameInCertificate oder serverCertificate, um das TLS-Serverzertifikat zu überprüfen.

Wenn der Server nicht für die Unterstützung von TDS 8-Verbindungen konfiguriert wurde, löst der Treiber einen Fehler aus und beendet die Verbindung.

Wenn die Eigenschaft „encrypt“ auf TRUE festgelegt ist, verwendet Microsoft JDBC-Treiber für SQL Server den JSSE-Standardsicherheitsanbieter der JVM-Instanz, um die TLS-Verschlüsselung mit SQL Server auszuhandeln. Der Standardsicherheitsanbieter unterstützt möglicherweise nicht alle Features, die zum erfolgreichen Aushandeln der TLS-Verschlüsselung erforderlich sind. So ist es beispielsweise möglich, dass die im TSL-Zertifikat für SQL Server verwendete Größe des öffentlichen RSA-Schlüssels nicht vom Standardsicherheitsanbieter unterstützt wird. In diesem Fall löst der Standardsicherheitsanbieter möglicherweise einen Fehler aus, wodurch der JDBC-Treiber die Verbindung trennt. Zur Lösung dieses Problems kann eine der folgenden Möglichkeiten verwendet werden:

  • Konfigurieren Sie SQL Server mit einem Serverzertifikat mit einem kleineren öffentlichen RSA-Schlüssel
  • Konfigurieren Sie die JVM für die Verwendung eines anderen JSSE-Sicherheitsanbieters in der Sicherheitseigenschaftendatei „<Java-Basisverzeichnis>/lib/security/java.security“.
  • Verwenden Sie eine andere JVM.

Überprüfen des TSL-Serverzertifikats

Während des TLS-Handshakes sendet der Server sein Zertifikat für öffentliche Schlüssel an den Client. Der JDBC-Treiber oder Client muss überprüfen, ob das Serverzertifikat von einer Zertifizierungsstelle ausgegeben wurde, der der Client vertraut. Der Treiber erfordert, dass das Serverzertifikat die folgenden Bedingungen erfüllt:

  • Das Zertifikat wurde von einer vertrauenswürdigen Zertifizierungsstelle ausgegeben.
  • Das Zertifikat muss für die Serverauthentifizierung ausgegeben sein.
  • Das Zertifikat ist nicht abgelaufen.
  • Der CN (Common Name) im Subjekt oder ein DNS-Name im SAN (Subject Alternate Name, Subjektalternativname) des Zertifikats entspricht genau dem serverName-Wert, der in der Verbindungszeichenfolge angegeben ist, oder – falls angegeben – dem Eigenschaftenwert hostNameInCertificate.
  • Ein DNS-Name kann Platzhalterzeichen enthalten. Vor Version 7.2 unterstützt Microsoft JDBC-Treiber für SQL Server keinen Platzhalterabgleich. Das heißt, „abc.com“ entspricht nicht „*.com“, aber „*.com“ entspricht „*.com“. Ab Version 7.2 wird der Platzhalterabgleich für Standardzertifikate unterstützt.

Für die Verwendung von TDS 8.0 mit Verschlüsselung vom Typ strict stellt der Eigenschaftswert serverCertifcate den Pfad zu einem Serverzertifikat bereit, das für die Serverzertifikatüberprüfung verwendet werden soll. Für diese Datei muss das PEM-Dateiformat verwendet werden. Das vom Server empfangene Zertifikat muss genau mit diesem Zertifikat übereinstimmen.

Weitere Informationen

Verwenden von Verschlüsselung
Schützen von JDBC-Treiberanwendungen