it-swarm.com.de

SQL Server 2016: Aktivieren Sie TLS 1.2 für SQL Server-Verbindung

Ich habe SQL server 2016 auf windows 2012 R2 ausgeführt und den Patch für die TLSv1.2-Unterstützung angewendet und die VM neu gestartet. https://support.Microsoft.com/en-us/help/3135244/tls-1-2-support- Für-Microsoft-SQL-Server TLS 1.2 wird unter Verwendung des Tools IISCrypto auf der SQL Server-VM aktiviert

Wir haben eine Java 8-Webanwendung und haben die Webanwendung gezwungen, nur TLS1.2 mit dem JVM-Argument -Djdk.tls.client.protocols="TLSv1.2" zu verwenden (Wenn ich dieses JVM-Argument entferne, stellt die Anwendung eine Verbindung zum SQL-Server her). Es wird jedoch der folgende Fehler angezeigt, obwohl TLSv1.2 für aktiviert ist SQL Server

org.Apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "Server chose TLSv1, but that protocol version is not enabled or not supported by the client.". ClientConnectionId:7564b6a1-60c0-4a24-8baa-7bd21f9512cf)  

Wir haben auch einen Windows-Dienst .Net 2.0 (in der Registrierung ist nur TLSv1.2 aktiviert), der ebenfalls keine Verbindung zu SQL Server 2016 herstellt.

System.Data.OleDb.OleDbException: [DBNETLIB][ConnectionOpen (SECCreateCredentials()).]SSL Security error.
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()

Wenn ich jedoch SSL3 und TLS1.0 in der Registrierung aktiviere, stellt der Windows-Dienst .Net 2.0 eine Verbindung zu SQL Server 2016 her.

Ich vermute, das Problem ist, dass SQL Server nicht TLSv1.2 verwendet, obwohl TLSv1.2 auf der SQL Server-VM aktiviert ist. Kann mir jemand helfen, wenn weitere Konfigurationen oder Patches erforderlich sind, damit SQL Server TLSv1.2 unterstützt?

7
RanPaul

Microsoft Windows Server speichert Informationen zu verschiedenen Kanälen, die die Sicherheit verbessern, die von Windows Server unterstützt werden. Diese Informationen werden im folgenden Registrierungsschlüssel gespeichert:

HKey_Local_Machine\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

Dieser Schlüssel enthält normalerweise die folgenden Unterschlüssel:

PCT 1.0, SSL 2.0, SSL 3.0, TLS 1.0 ...

Jeder Schlüssel enthält Informationen zum Protokoll für den Schlüssel. Jedes dieser Protokolle kann auf dem Server aktiviert werden. Dazu erstellen Sie einen neuen DWORD-Wert im Server-Unterschlüssel des Protokolls. Sie setzen den DWORD-Wert auf "1".

Wichtig: Sichern Sie die Registrierung, bevor Sie sie ändern. Sie können die Registrierung dann wiederherstellen, wenn ein Problem auftritt. 

Gehen Sie folgendermaßen vor, um das Protokoll TLS 1.x zu aktivieren:

Klicken Sie auf Start, klicken Sie auf Ausführen, geben Sie regedt32 ein oder geben Sie regedit ein und klicken Sie dann auf OK. Suchen Sie im Registrierungseditor den folgenden Registrierungsschlüssel:

HKey_Local_Machine\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.x\Server

Klicken Sie im Menü Bearbeiten auf Wert hinzufügen. Klicken Sie in der Liste Datentyp auf DWORD. Geben Sie in das Feld Wertname die Option Aktiviert ein, und klicken Sie dann auf OK.

Hinweis Wenn dieser Wert vorhanden ist, doppelklicken Sie auf den Wert, um den aktuellen Wert zu bearbeiten.

Geben Sie im Binär-Editor 11111111 ein, um den Wert des neuen Schlüssels auf "1" zu setzen . Klicken Sie auf OK. Starte den Computer neu.

Hoffe das hilft...

4
Murat Yıldız

Überprüfen Sie die beteiligten Zertifikate. Einer kann ungültig sein.

Wenn die Maschinen ihre Zertifikate validieren, versuchen Sie Folgendes:

Registrierungsskript zum Deaktivieren dummer Verschlüsselungen: Speichern Sie dies als .reg

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

Sie müssen Ihr .NET Framework anpassen. Wenn Sie .Net 2.0 (alt!) Tatsächlich verwenden, sollten die letzten beiden Schlüssel sein

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001 

Hier ist eine .ps1 von Chris Duck, um aktivierte Verschlüsselungen zu überprüfen

    <#
 .DESCRIPTION
   Outputs the SSL protocols that the client is able to successfully use to connect to a server.

 .NOTES

   Copyright 2014 Chris Duck
   http://blog.whatsupduck.net

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

     http://www.Apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 .PARAMETER ComputerName
   The name of the remote computer to connect to.

 .PARAMETER Port
   The remote port to connect to. The default is 443.

 .EXAMPLE
   Test-SslProtocols -ComputerName "www.google.com"

   ComputerName       : www.google.com
   Port               : 443
   KeyLength          : 2048
   SignatureAlgorithm : rsa-sha1
   Ssl2               : False
   Ssl3               : True
   Tls                : True
   Tls11              : True
   Tls12              : True
 #>
 function Test-SslProtocols {
   param(
     [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true)]
     $ComputerName,

     [Parameter(ValueFromPipelineByPropertyName=$true)]
     [int]$Port = 443
   )
   begin {
     $ProtocolNames = [System.Security.Authentication.SslProtocols] | gm -static -MemberType Property | ?{$_.Name -notin @("Default","None")} | %{$_.Name}
   }
   process {
     $ProtocolStatus = [Ordered]@{}
     $ProtocolStatus.Add("ComputerName", $ComputerName)
     $ProtocolStatus.Add("Port", $Port)
     $ProtocolStatus.Add("KeyLength", $null)
     $ProtocolStatus.Add("SignatureAlgorithm", $null)

     $ProtocolNames | %{
       $ProtocolName = $_
       $Socket = New-Object System.Net.Sockets.Socket([System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp)
       $Socket.Connect($ComputerName, $Port)
       try {
         $NetStream = New-Object System.Net.Sockets.NetworkStream($Socket, $true)
         $SslStream = New-Object System.Net.Security.SslStream($NetStream, $true)
         $SslStream.AuthenticateAsClient($ComputerName,  $null, $ProtocolName, $false )
         $RemoteCertificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]$SslStream.RemoteCertificate
         $ProtocolStatus["KeyLength"] = $RemoteCertificate.PublicKey.Key.KeySize
         $ProtocolStatus["SignatureAlgorithm"] = $RemoteCertificate.SignatureAlgorithm.FriendlyName
         $ProtocolStatus["Certificate"] = $RemoteCertificate
         $ProtocolStatus.Add($ProtocolName, $true)
       } catch  {
         $ProtocolStatus.Add($ProtocolName, $false)
       } finally {
         $SslStream.Close()
       }
     }
     [PSCustomObject]$ProtocolStatus
   }
 }
1
toornt