Szyfrowanie i certyfikaty Go-MSSQLDB

Sterownik go-mssqldb obsługuje wiele trybów szyfrowania oraz strategii walidacji certyfikatów dla połączeń z SQL Server i Azure SQL. Ten artykuł wyjaśnia każdy tryb szyfrowania, jak skonfigurować walidację certyfikatów oraz kiedy stosować tryb ścisły TDS 8.0.

Wybierz konfigurację TLS

Użyj tej tabeli, aby wybrać najbezpieczniejszą opcję pasującą do Twojego środowiska, zanim dostosujesz poszczególne parametry.

Scenario Zalecane ustawienia Dlaczego
Azure SQL lub SQL Server 2022 i nowsze wersje – chcesz mieć najsilniejszą domyślną ochronę encrypt=strict TDS 8.0 wykonuje handshake TLS przed negocjacjami TDS i zawsze waliduje certyfikat.
Certyfikat serwera łączy się z zaufanym publicznym lub korporacyjnym CA encrypt=true Standardowa walidacja certyfikatów zwykle wystarcza, gdy nazwa hosta i łańcuch zaufania są już poprawne.
Serwer korzysta z prywatnego CA, który nie znajduje się w systemowym magazynie zaufania encrypt=true&certificate=/path/to/ca-cert.pem Dodaje certyfikat CA do niestandardowej puli zaufania i zachowuje normalną walidację łańcuchową.
Serwer używa certyfikatu z podpisem własnym i chcesz stosować pinning certyfikatu encrypt=true&serverCertificate=/path/to/server.pem Porównuje dokładny certyfikat serwera bajt po bajcie, zamiast polegać na łańcuchu CA.
Tylko lokalne środowisko programistyczne lub tymczasowe środowiska testowe encrypt=true&TrustServerCertificate=true Szyfrowanie jest włączone, ale pomija weryfikację tożsamości serwera. Nie używaj tego ustawienia w produkcji.

Tryby szyfrowania

Ustaw encrypt parametr połączenia na jedną z następujących wartości:

Wartość Behavior
strict Szyfrowanie TDS 8.0. Handshake TLS odbywa się przed negocjacjami połączenia TDS. Wymaga SQL Server 2022 lub Azure SQL.
true lub mandatory Połączenie jest szyfrowane po uzgodnieniu wstępnym TDS.
false lub optional Szyfrowanie jest stosowane tylko wtedy, gdy serwer tego wymaga. Jest to wartość domyślna, gdy nie określono encrypt. Azure SQL zawsze wymaga szyfrowania po stronie serwera, więc połączenia z Azure SQL są szyfrowane niezależnie od tego ustawienia.
disable Brak szyfrowania. Niezalecane w środowisku produkcyjnym.

Example

Włącz szyfrowanie w parametry połączenia, używając parametruencrypt:

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

Walidacja certyfikatu

Gdy włączasz szyfrowanie (encrypt=true lub encrypt=strict), sterownik weryfikuje certyfikat serwera, chyba że ustawisz TrustServerCertificate=true. Istnieją dwa niezależne podejścia do tej weryfikacji.

Walidacja łańcuchowa za pomocą parametru certificate

Dostarcz plik certyfikatu PEM lub DER. Sterownik dodaje certyfikat do niestandardowej puli zaufania i wykonuje standardową weryfikację łańcucha X.509 względem tej puli:

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

Porównanie na poziomie bajtów za pomocą parametru serverCertificate

Uwaga / Notatka

Parametr ten został wprowadzony serverCertificate w sterowniku v1.9.6.

Dostarcz plik PEM lub DER zawierający dokładny certyfikat serwera. Sterownik porównuje certyfikat serwera bajt po bajcie z dostarczonym plikiem. Sterownik nie wykonuje walidacji łańcuchowej. To podejście jest przydatne dla certyfikatów podpisanych samodzielnie:

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

Zastąpienie nazwy hosta

Domyślnie sterownik weryfikuje, czy nazwa Common Name (CN) lub Subject Alternative Name (SAN) certyfikatu zgadza się z nazwą hosta serwera. Użyj hostnameincertificate, aby zastąpić oczekiwaną nazwę hosta:

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

Pominięcie walidacji certyfikatów

Ustaw TrustServerCertificate=true tak, aby pomijać wszystkie weryfikacje certyfikatów. Połączenie jest nadal szyfrowane, ale tożsamość serwera nie jest zweryfikowana:

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

Uwaga

Ustawienie TrustServerCertificate=true naraża połączenie na ataki typu adversary-in-the-middle. Używaj tej opcji tylko do rozwoju i testowania.

TDS 8.0 tryb ścisły

TDS 8.0 (ścisłe szyfrowanie) wykonuje handshake TLS przed jakimikolwiek negocjacjami protokołu TDS. Takie podejście zapobiega atakującemu obniżeniu jakości całego połączenia. TDS 8.0 wymaga SQL Server 2022 lub Azure SQL:

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

W trybie ścisłym parametr TrustServerCertificate jest ignorowany. Walidacja certyfikatów jest zawsze wykonywana z użyciem domyślnie systemowego magazynu zaufanych certyfikatów. Możesz podać certificate lub serverCertificate na potrzeby niestandardowej walidacji.

Wersja minimalna protokołu TLS

Użyj parametru tlsmin do wymuszenia minimalnej wersji TLS:

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

Prawidłowe wartości: 1.0, , 1.11.2, 1.3.

Podsumowanie parametrów szyfrowania

Parameter Default Description
encrypt false Tryb szyfrowania. Azure SQL zawsze wymaga szyfrowania po stronie serwera, niezależnie od tego ustawienia.
TrustServerCertificate Zależy od encrypt Pomiń sprawdzanie certyfikatu, gdy true. Domyślnie jest to, false gdy encrypt jest określone, a true gdy encrypt jest pomijane.
certificate - Ścieżka pliku PEM/DER na potrzeby walidacji łańcucha.
serverCertificate - Ścieżka pliku PEM/DER do porównania na poziomie bajtów.
hostnameincertificate - Nadpisz oczekiwaną nazwę hosta w certyfikacie.
tlsmin - Minimalna wersja TLS.