Go-MSSQLDB-Verschlüsselung und Zertifikate

Der Treiber go-mssqldb unterstützt mehrere Verschlüsselungsmodi und Zertifikatsvalidierungsstrategien für Verbindungen zu SQL Server und Azure SQL. Dieser Artikel erklärt jeden Verschlüsselungsmodus, wie die Zertifikatsvalidierung konfiguriert wird und wann der TDS-8.0-Strengmodus verwendet werden sollte.

Wählen Sie eine TLS-Konfiguration

Verwenden Sie diese Tabelle, um die sicherste Option auszuwählen, die zu Ihrer Umgebung passt, bevor Sie einzelne Parameter anpassen.

Szenario Empfohlene Einstellungen Warum?
Azure SQL oder SQL Server 2022 und neuere Versionen, und du möchtest den stärksten Standardschutz encrypt=strict TDS 8.0 führt den TLS-Handshake vor der TDS-Verhandlung durch und validiert das Zertifikat immer.
Das Serverzertifikat führt zu einer vertrauenswürdigen öffentlichen oder unternehmensinternen CA encrypt=true Die Standard-Zertifikatsvalidierung reicht in der Regel aus, wenn der Hostname und die Vertrauenskette bereits korrekt sind.
Der Server verwendet eine private CA, die nicht im System-Vertrauensspeicher ist encrypt=true&certificate=/path/to/ca-cert.pem Fügt das CA-Zertifikat einem benutzerdefinierten Trust Pool hinzu und behält die normale Kettenvalidierung bei.
Der Server verwendet ein selbstsigniertes Zertifikat und du möchtest ein Zertifikats-Pinning encrypt=true&serverCertificate=/path/to/server.pem Vergleicht das exakte Serverzertifikat Byte für Byte, anstatt sich auf eine CA-Kette zu verlassen.
Nur lokale Entwicklungs- oder temporäre Testumgebungen encrypt=true&TrustServerCertificate=true Bleibt die Verschlüsselung aktiviert, überspringt aber die Validierung der Serveridentität. Verwende diese Einstellung nicht in der Produktion.

Verschlüsselungsmodi

Setze den encrypt Verbindungsparameter auf einen der folgenden Werte:

Wert Behavior
strict TDS 8.0-Verschlüsselung. Der TLS-Handschlag findet vor der TDS-Verbindungsverhandlung statt. Benötigt SQL Server 2022 oder Azure SQL.
true oder mandatory Die Verbindung wird nach dem TDS-Prelogin-Handshake verschlüsselt.
false oder optional Verschlüsselung wird nur verwendet, wenn der Server sie verlangt. Dies ist die Standardeinstellung, wenn encrypt nicht angegeben ist. Azure SQL erfordert immer Server-seitige Verschlüsselung, daher werden Verbindungen zu Azure SQL unabhängig von dieser Einstellung verschlüsselt.
disable Keine Verschlüsselung. Nicht für die Produktion empfohlen.

Example

Aktivieren Sie die Verschlüsselung in der Verbindungszeichenfolge mit dem folgenden encrypt Parameter:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true

Zertifikatüberprüfung

Wenn Sie die Verschlüsselung aktivieren (encrypt=true oder encrypt=strict), validiert der Treiber das Serverzertifikat, es sei denn, Sie setzen TrustServerCertificate=true. Für diese Validierung existieren zwei unabhängige Ansätze.

Kettenvalidierung mittels Verwendung des Parameters certificate

Stellen Sie eine PEM- oder DER-Zertifikatsdatei bereit. Der Treiber fügt das Zertifikat einem benutzerdefinierten Vertrauenspool hinzu und führt eine standardmäßige X.509-Kettenvalidierung gegen diesen Pool durch:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&certificate=/path/to/ca-cert.pem

Byte-Level-Vergleich mit dem Parameter serverCertificate

Note

Der Parameter serverCertificate wurde in Treiberversion 1.9.6 eingeführt.

Stellen Sie eine PEM- oder DER-Datei bereit, die das genaue Serverzertifikat enthält. Der Treiber vergleicht das Zertifikat des Servers Byte für Byte mit der bereitgestellten Datei. Der Treiber führt keine Kettenvalidierung durch. Dieser Ansatz ist nützlich für selbstsignierte Zertifikate:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&serverCertificate=/path/to/server.pem

Hostnamen außer Kraft setzen

Standardmäßig überprüft der Treiber, ob der Common Name (CN) oder Subject Alternative Name (SAN) des Zertifikats mit dem Server-Hostnamen übereinstimmt. Verwenden Sie hostnameincertificate , um den erwarteten Hostnamen zu überschreiben:

sqlserver://<user>:<password>@10.0.0.5:1433?database=AdventureWorks2025&encrypt=true&hostnameincertificate=<server>.domain.com

Zertifikatsvalidierung überspringen

Setze es TrustServerCertificate=true so, dass alle Zertifikatsvalidierungen übersprungen werden. Die Verbindung ist weiterhin verschlüsselt, aber die Serveridentität ist nicht verifiziert:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=true

Achtung

Die Einstellung TrustServerCertificate=true macht die Verbindung anfällig für Adversary-in-the-Middle-Angriffe. Nutze diese Option nur für Entwicklung und Test.

TDS 8.0 Strikter Modus

TDS 8.0 (strenge Verschlüsselung) führt den TLS-Handshake vor jeder TDS-Protokollverhandlung durch. Dieser Ansatz verhindert, dass ein Angreifer die gesamte Verbindung herunterstufen. TDS 8.0 benötigt SQL Server 2022 oder Azure SQL:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=strict

Im strengen Modus wird der Parameter TrustServerCertificate ignoriert. Die Zertifikatsvalidierung erfolgt immer standardmäßig unter Verwendung des System-Vertrauensspeichers. Sie können certificate oder serverCertificate für eine benutzerdefinierte Validierung angeben.

TLS-Mindestversion

Verwenden Sie den Parameter, tlsmin um eine minimale TLS-Version zu erzwingen:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2

Gültige Werte: 1.0, 1.1, 1.2, . 1.3

Zusammenfassung der Verschlüsselungsparameter

Parameter Standard Beschreibung
encrypt false Verschlüsselungsmodus. Azure SQL benötigt immer Server-seitige Verschlüsselung, unabhängig von dieser Einstellung.
TrustServerCertificate Ist abhängig von encrypt Überspringe die Zertifikatsvalidierung, wenn true. Der Standardwert ist false, wenn encrypt angegeben ist, und true, wenn encrypt weggelassen wird.
certificate - PEM/DER-Dateipfad für Kettenvalidierung.
serverCertificate - PEM/DER-Dateipfad für den Byte-Level-Vergleich.
hostnameincertificate - Den im Zertifikat erwarteten Hostnamen ignorieren.
tlsmin - Minimale TLS-Version.