Versleuteling en certificaatvalidatie in Microsoft.Data.SqlClient

ADO.NET downloaden

Gebruik Transport Layer Security (TLS) om het verkeer tussen je applicatie en SQL Server te versleutelen. Houd validatie van servercertificaten ingeschakeld om de identiteit van de server te verifiëren. Versleuteling zonder identiteitsvalidatie beschermt niet tegen een tegenstander in het midden die zich voordoet als de server.

Microsoft. Data.SqlClient is standaard op Encrypt=Mandatory en TrustServerCertificate=false. Encrypt=true is een synoniem voor Mandatory. Voor een externe verbinding vraag expliciet deze instellingen op en stel een servercertificaat in dat de client kan valideren:

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;MultiSubnetFailover=true;

Vervang de tijdelijke aanduidingen en gebruik een authenticatiemethode die wordt ondersteund door je server en applicatieomgeving. Voor Azure SQL of SQL-databases in Microsoft Fabric, zie Microsoft Entra authenticatie.

Kies een encryptiemodus

Encrypt bepaalt of de client encryptie vereist. Een server kan ook encryptie vereisen. Deze tabel beschrijft het huidige gedrag zonder certificaatpinning:

Klantinstelling Serververeiste Certificaatvalidatie Resultaat
Encrypt=Optional of false Dwingt geen encryptie af. Geen, ongeacht TrustServerCertificate. Alleen inlogpakketten zijn versleuteld. Het daaropvolgende verkeer is niet versleuteld.
Encrypt=Optional;TrustServerCertificate=false Dwingt encryptie af. Vertrouwensketen, geldigheid en servernaam. Al het verkeer is versleuteld. Ongeldige certificaten laten de verbinding falen.
Encrypt=Optional;TrustServerCertificate=true Dwingt encryptie af. Omzeild. Al het verkeer is versleuteld, maar de identiteit van de server wordt niet geverifieerd.
Encrypt=Mandatory;TrustServerCertificate=false Beide instellingen. Vertrouwensketen, geldigheid en servernaam. Al het verkeer is versleuteld. Ongeldige certificaten laten de verbinding falen.
Encrypt=Mandatory;TrustServerCertificate=true Beide instellingen. Omzeild. Al het verkeer is versleuteld, maar de identiteit van de server wordt niet geverifieerd.
Encrypt=Strict Ondersteunt Tabular Data Stream (TDS) 8.0. Required. TrustServerCertificate Kan het niet omzeilen. TLS start vóór de TDS-berichten. Een niet-ondersteunde server of een ongeldig certificaat faalt de verbinding.

Mandatory Gebruik voor versleutelde verbindingen met servers die TDS 8.0 niet ondersteunen. Gebruik Strict wanneer je endpoint TDS 8.0 ondersteunt, inclusief SQL Server 2022 (16.x) en latere versies. TDS 8.0 ondersteunt TLS 1.2 en TLS 1.3; het vereist geen TLS 1.3. De onderhandelde TLS-versie hangt ook af van de configuratie van de client, server en besturingssysteem.

Optional is geen oplossing voor certificaatfouten. Het kan applicatiegegevens onversleuteld achterlaten als de server geen encryptie vereist.

Configureer een verifieerbaar servercertificaat

Voor normale certificaatvalidatie:

  1. Een certificaat leveren dat voldoet aan de SQL Server-certificaatvereisten.
  2. Vermeld in de alternatieve subjectnaam (SAN) van het certificaat de naam die cliënten gebruiken om verbinding te maken.
  3. Maak de uitgevende certificaatautoriteit en eventuele benodigde tussenliggende certificaten betrouwbaar op elke clienthost of container.
  4. Configureer SQL Server om het certificaat te gebruiken en behoud TrustServerCertificate=false in clients.
  5. Verlenging van het plancertificaat vóór vervaldatum, inclusief eventuele wijzigingen in namen of uitgevende autoriteiten.

Een certificaat van een openbare of bedrijfscertificeringsinstantie kan aan deze eisen voldoen. Een enterprise-certificaat wordt niet automatisch vertrouwd binnen een Linux-container of op een aparte ontwikkelaarcomputer.

Verbind via een alias

Als de verbinding een Domain Name System (DNS) alias gebruikt die niet in het certificaat staat, overweeg dan eerst een certificaat uit te geven dat de alias bevat. U kunt ook HostNameInCertificate instellen op de naam die in het certificaat wordt verwacht:

Server=tcp:sql-alias.contoso.com,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=sql-server.contoso.com;MultiSubnetFailover=true;

HostNameInCertificate verandert de naam die SqlClient verwacht tijdens certificaatvalidatie. Het verandert de netwerkbestemming niet en omzeilt ook geen trustchain- en vervalcontroles. Laat het niet ingesteld als de servernaam al overeenkomt met het certificaat.

Een specifiek servercertificaat vastzetten

ServerCertificate levert een lokaal certificaatbestand voor exacte vergelijking met het certificaat van de server. Ondersteunde formaten zijn Privacy-Enhanced Mail (PEM) en Distinguished Encoding Rules (DER), inclusief .cer certificaatbestanden. Gebruik het met Encrypt=Mandatory of Encrypt=Strict, en houd TrustServerCertificate=false.

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=Strict;TrustServerCertificate=false;ServerCertificate=C:\certificates\sql-server.cer;MultiSubnetFailover=true;

Verspreid het verwachte certificaat via een vertrouwd kanaal en bescherm het bestand tegen vervanging. Een exacte certificaatmatch is een alternatief voor normale chain- en naamvalidatie, geen extra controle daarbovenop. De certificaatbytes moeten overeenkomen; dezelfde subjectnaam of publieke sleutel alleen is niet voldoende. Een ontbrekend, onleesbaar, ongeldig of niet overeengekomen pin-bestand faalt validatie.

Pinning koppelt de uitrol van clients aan certificaatvernieuwing. Werk de pincode bij wanneer het servercertificaat verandert, inclusief verlenging. Krijg geen pincode door een niet-geverifieerd certificaat van het netwerk te accepteren.

SqlClient biedt geen publieke callback voor willekeurige TLS-servercertificaatvalidatie. AccessTokenCallback controleert de verwerving van authenticatietokens, niet de TLS-validatie.

Ontwikkelingscertificaten en probleemoplossing

Gebruik een vertrouwd ontwikkelcertificaat met de juiste servernaam. Als je tijdelijk TrustServerCertificate=true gebruikt in Encrypt=true een geïsoleerde ontwikkelomgeving, is de verbinding versleuteld maar authenticeert de client het servercertificaat niet.

Waarschuwing

Gebruik TrustServerCertificate=true niet als oplossing voor productieomgevingen bij certificaatfouten. Het schakelt serveridentiteitsvalidatie uit met Mandatory en heeft geen effect met Strict.

Failure Controle
De certificaatketen is niet vertrouwd. Installeer het juiste vertrouwde hoofdcertificaat en de tussenliggende certificaten op de client. Controleer het certificaat dat SQL Server daadwerkelijk presenteert.
De naam van het certificaat komt niet overeen. Vergelijk Server met de SAN van het certificaat. Corrigeer de naam, het certificaat of de opzettelijke HostNameInCertificate override.
Certificaat is verlopen. Verleng het servercertificaat en controleer de clientklok.
Het vastgepinde certificaat komt niet overeen of kan niet worden geladen. Controleer het bestandspad, de rechten, het formaat en het gedeployte certificaat. Werk de pincode bij via je vertrouwde distributieproces.
Strikte encryptie kan niet verbinden. Bevestig dat het eindpunt TDS 8.0 ondersteunt en dat de TLS-configuratie compatibel is met de client.

Voor server-side configuratie, zie Certificaatoverzicht.

Wijzigingen in versleutelings- en certificaatvalidatiegedrag

Deze compatibiliteitsnotities leggen gedragsveranderingen uit bij het upgraden van oudere applicaties. Nieuwe applicaties dienen de huidige instellingen te gebruiken die in dit artikel zijn beschreven.

Stuurprogrammaversie Veranderen
1.0 Encrypt=false is de standaardwaarde. Wanneer de client geen encryptie aanvraagt, activeert server-gedwongen encryptie geen certificaatvalidatie.
2.0 Server-gedwongen encryptie honoreert TrustServerCertificate zelfs wanneer Encrypt=false.
4.0 Encryptie wordt standaard ingeschakeld. Upgrades kunnen eerder onopgemerkte certificaatconfiguratiefouten blootleggen.
5.0 Voegt Optional, Mandatory, Strict, en HostNameInCertificate.
5.1 Voegt toe ServerCertificate voor certificaatpinnen.
7.0.3 Verhelpt de validatie van certificaatpinnen voor beheerde netwerkverbindingen, zodat deze wordt geweigerd bij ontbrekende, ongeldige of niet-overeenkomende bestanden, zelfs wanneer de standaardplatformvalidatie slaagt.