Opis obsługi szyfrowania

pobierz sterownik JDBC

Jeśli podczas nawiązywania połączenia z programem SQL Server aplikacja żąda szyfrowania, a wystąpienie programu SQL Server jest skonfigurowane do obsługi szyfrowania TLS, sterownik JDBC firmy Microsoft dla programu SQL Server inicjuje uzgadnianie protokołu TLS. Uzgadnianie połączenia umożliwia serwerowi i klientowi negocjowanie algorytmów szyfrowania i algorytmów kryptograficznych, które mają być użyte do ochrony danych. Po zakończeniu uzgadniania protokołu TLS klient i serwer mogą bezpiecznie wysyłać zaszyfrowane dane. Podczas uzgadniania połączenia TLS serwer wysyła do klienta swój certyfikat z kluczem publicznym. Wystawca certyfikatu klucza publicznego jest znany jako urząd certyfikacji. Klient odpowiada za sprawdzenie, czy urząd certyfikacji jest zaufany przez klienta.

Jeśli aplikacja nie zażąda szyfrowania, sterownik JDBC firmy Microsoft dla programu SQL Server nie wymusi obsługi szyfrowania TLS przez program SQL Server. Jeśli wystąpienie SQL Server nie jest skonfigurowane do wymuszania szyfrowania TLS, połączenie jest nawiązywane bez szyfrowania. Jeśli instancja programu SQL Server jest skonfigurowana tak, aby wymuszać szyfrowanie TLS, sterownik automatycznie włączy szyfrowanie TLS podczas działania w prawidłowo skonfigurowanej maszynie wirtualnej Java (JVM); w przeciwnym razie połączenie zostanie przerwane, a sterownik zgłosi błąd.

Uwaga / Notatka

Upewnij się, że wartość przekazana do serverName dokładnie odpowiada nazwie pospolitej (CN) lub nazwie DNS w alternatywnej nazwie podmiotu (SAN) w certyfikacie serwera, aby połączenie TLS powiodło się.

Aby uzyskać więcej informacji na temat konfigurowania protokołu TLS dla programu SQL Server, zobacz Włączanie szyfrowanych połączeń z aparatem bazy danych.

Uwagi

Aby umożliwić aplikacjom korzystanie z szyfrowania TLS, sterownik JDBC firmy Microsoft dla programu SQL Server wprowadził następujące właściwości połączenia począwszy od wersji 1.2: encrypt, trustServerCertificate, trustStore, trustStorePassword i hostNameInCertificate. Aby umożliwić sterownikowi korzystanie z protokołu TDS 8.0 z szyfrowaniem TLS, począwszy od wersji 11.2 wprowadzono właściwość połączenia serverCertificate. Aby uzyskać więcej informacji, zobacz Ustawianie właściwości połączenia.

W poniższej tabeli przedstawiono podsumowanie sposobu działania sterownika JDBC firmy Microsoft dla wersji programu SQL Server w przypadku możliwych scenariuszy połączeń TLS. W każdym scenariuszu jest używany inny zestaw właściwości połączenia TLS. Tabela zawiera następujące elementy:

  • blank: "Właściwość nie istnieje w parametrach połączenia"
  • value: "Właściwość istnieje w parametrach połączenia, a jego wartość jest prawidłowa"
  • any: "Nie ma znaczenia, czy właściwość istnieje w parametrach połączenia, czy jej wartość jest prawidłowa"

Uwaga / Notatka

To samo zachowanie dotyczy uwierzytelniania użytkowników programu SQL Server i zintegrowanego uwierzytelniania systemu Windows.

Ustawienia właściwości Zachowanie
szyfruj = fałsz lub puste
trustServerCertificate = dowolny
hostNameInCertificate = dowolny
trustStore = dowolny
trustStorePassword = dowolna wartość
Sterownik nie wymusi na serwerze obsługi szyfrowania TLS. Jeśli serwer ma certyfikat z podpisem własnym, sterownik inicjuje wymianę certyfikatów TLS. Certyfikat TLS nie zostanie zweryfikowany, a tylko poświadczenia (w pakiecie logowania) są szyfrowane.

Jeśli serwer wymaga od klienta obsługi szyfrowania TLS, sterownik zainicjuje wymianę certyfikatów TLS. Certyfikat TLS nie zostanie zweryfikowany, ale cała komunikacja zostanie zaszyfrowana.
encrypt = true
trustServerCertificate = true
hostNameInCertificate = dowolna
trustStore = dowolny
trustStorePassword = dowolna wartość
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS. Jeśli właściwość trustServerCertificate ma wartość "true", sterownik nie zweryfikuje certyfikatu TLS.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = puste
trustStore = puste
trustStorePassword = puste
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje właściwości serverName określonej w adresie URL połączenia do zweryfikowania certyfikatu TLS serwera i oprze się na regułach wyszukiwania fabryki menedżerów zaufania, aby określić, którego magazynu certyfikatów użyć.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = wartość
trustStore = puste
trustStorePassword = puste
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik zweryfikuje wartość podmiotu certyfikatu TLS przy użyciu wartości określonej dla właściwości hostNameInCertificate .

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = puste
trustStore = wartość
trustStorePassword = wartość
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje wartości właściwości trustStore , aby znaleźć plik trustStore certyfikatu i wartość właściwości trustStorePassword w celu sprawdzenia integralności pliku trustStore.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = puste
trustStore = puste
trustStorePassword = wartość
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje wartości właściwości trustStorePassword , aby sprawdzić integralność domyślnego pliku trustStore.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = brak
trustStore = wartość
trustStorePassword = puste
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje wartości właściwości trustStore , aby wyszukać lokalizację pliku trustStore.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = wartość
trustStore = puste
trustStorePassword = wartość
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje wartości właściwości trustStorePassword , aby sprawdzić integralność domyślnego pliku trustStore. Ponadto sterownik użyje wartości właściwości hostNameInCertificate w celu zweryfikowania certyfikatu TLS.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = wartość
trustStore = wartość
trustStorePassword = puste
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje wartości właściwości trustStore , aby wyszukać lokalizację pliku trustStore. Ponadto sterownik użyje wartości właściwości hostNameInCertificate w celu zweryfikowania certyfikatu TLS.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = true
trustServerCertificate = false lub blank
hostNameInCertificate = wartość
trustStore = wartość
trustStorePassword = wartość
Sterownik żąda użycia szyfrowania TLS z serwerem.

Jeśli serwer wymaga, aby klient obsługiwał szyfrowanie TLS lub jeśli serwer obsługuje szyfrowanie, sterownik zainicjuje wymianę certyfikatów TLS.

Sterownik użyje wartości właściwości trustStore , aby znaleźć plik trustStore certyfikatu i wartość właściwości trustStorePassword w celu sprawdzenia integralności pliku trustStore. Ponadto sterownik użyje wartości właściwości hostNameInCertificate w celu zweryfikowania certyfikatu TLS.

Jeśli serwer nie jest skonfigurowany do obsługi szyfrowania, sterownik zgłosi błąd i zakończy połączenie.
encrypt = surowy
hostNameInCertificate = wartość
trustStore = puste
trustStorePassword = puste
serverCertificate = wartość
Sterownik żąda użycia szyfrowania TLS TDS 8.0 strict z serwerem.

Sterownik jako pierwsze działanie zainicjuje negocjację TLS i wymianę certyfikatów z serwerem.

Ustawienie trustServerCertificate jest ignorowane i traktowane jako fałsz w strict trybie.

Sterownik użyje opcjonalnej właściwości hostNameInCertificate lub serverCertificate , aby zweryfikować certyfikat TLS serwera.

Jeśli serwer nie jest skonfigurowany do obsługi połączeń TDS 8.0, sterownik zgłosi błąd i zakończy połączenie.

Jeśli właściwość szyfrowania ma wartość true, sterownik JDBC firmy Microsoft dla programu SQL Server używa domyślnego dostawcy zabezpieczeń JSSE JVM do negocjowania szyfrowania TLS z programem SQL Server. Domyślny dostawca zabezpieczeń może nie obsługiwać wszystkich funkcji wymaganych do pomyślnego negocjowania szyfrowania TLS. Na przykład domyślny dostawca zabezpieczeń może nie obsługiwać rozmiaru klucza publicznego RSA używanego w certyfikacie TLS programu SQL Server. W takim przypadku domyślny dostawca zabezpieczeń może zgłosić błąd, który spowoduje przerwanie połączenia przez sterownik JDBC. Aby rozwiązać ten problem, można użyć jednej z następujących opcji:

  • Konfigurowanie programu SQL Server przy użyciu certyfikatu serwera, który ma mniejszy klucz publiczny RSA
  • Skonfiguruj maszynę wirtualną JVM do używania innego dostawcy zabezpieczeń JSSE w pliku właściwości zabezpieczeń "<java-home>/lib/security/java.security"
  • Używanie innej maszyny wirtualnej JVM

Weryfikowanie certyfikatu TLS serwera

Podczas uzgadniania połączenia TLS serwer wysyła do klienta swój certyfikat z kluczem publicznym. Sterownik JDBC lub klient musi sprawdzić, czy certyfikat serwera jest wystawiony przez urząd certyfikacji, któremu ufa klient. Sterownik wymaga, aby certyfikat serwera spełniał następujące warunki:

  • Certyfikat został wystawiony przez zaufany urząd certyfikacji.
  • Certyfikat musi być wystawiony na potrzeby uwierzytelniania serwera.
  • Certyfikat nie wygasł.
  • Nazwa pospolita (CN) w temacie lub nazwa DNS w alternatywnej nazwie podmiotu (SAN) certyfikatu dokładnie odpowiada wartości serverName określonej w parametrach połączenia lub, jeśli określono, wartość właściwości hostNameInCertificate .
  • Nazwa DNS może zawierać symbole wieloznaczne. Przed wersją 7.2 sterownik Microsoft JDBC dla SQL Server nie obsługuje dopasowywania przy użyciu symboli wieloznacznych. Oznacza to, że abc.com nie będzie zgodna z *.com, ale *.com będzie zgodna z *.com. Od wersji 7.2 obsługiwane jest standardowe dopasowywanie certyfikatów z użyciem symboli wieloznacznych.

W przypadku korzystania z usługi TDS 8.0 z strict szyfrowaniem wartość właściwości serverCertificate udostępnia ścieżkę do certyfikatu serwera, który ma być używany do weryfikacji certyfikatu serwera. Ten plik musi używać formatu pliku PEM. Certyfikat otrzymany z serwera musi dokładnie odpowiadać temu certyfikatowi.