Delen via


Certificaatvalidatiefout

Notitie

Dit artikel is bedoeld voor mensen die bekend zijn met het nemen en lezen van netwerktraceringen.

Symptomen

Wanneer de client het servercertificaat niet valideert, ziet u het volgende foutbericht in de clienttoepassing:

System.Data.SqlClient.SqlException:
A connection was successfully established with the server, but then an error occurred during the login process.
(provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.)
---> System.ComponentModel.Win32Exception: The certificate chain was issued by an authority that is not trusted

Voorbeeld van netwerktracering

Frame  Date and Time        Source IP    Dest IP      Description
-----  -------------------  -----------  -----------  -----------------------------------------------------------------------------------
590    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=CE....S., SrcPort=56277, DstPort=1433, PayloadLen=0,
593    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=.E.A..S., SrcPort=1433, DstPort=56277, PayloadLen=0,
596    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=...A...., SrcPort=56277, DstPort=1433, PayloadLen=0,
599    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TDS:Prelogin, Flags=...AP..., SrcPort=56277, DstPort=1433, PayloadLen=104,
602    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TDS:Response
605    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TLS:TLS Rec Layer-1 HandShake: Client Hello.
614    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=...A...., SrcPort=1433, DstPort=56277, PayloadLen=0,
617    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.
686    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=...A...F, SrcPort=56277, DstPort=1433, PayloadLen=0,
710    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=...A...., SrcPort=1433, DstPort=56277, PayloadLen=0,
713    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=...A...F, SrcPort=1433, DstPort=56277, PayloadLen=0,
719    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=...A...., SrcPort=56277, DstPort=1433, PayloadLen=0,

Voorbeeld van netwerktracering met opmerkingen

Frame  Date and Time        Source IP    Dest IP      Description
-----  -------------------  -----------  -----------  -----------------------------------------------------------------------------------
TCP 3-way handshake establishes a basic TCP connection.

590    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=CE....S., SrcPort=56277, DstPort=1433, PayloadLen=0, 
593    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=.E.A..S., SrcPort=1433, DstPort=56277, PayloadLen=0, 
596    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=...A...., SrcPort=56277, DstPort=1433, PayloadLen=0, 

The PreLogin packet from the client indicates data encryption is required. This also implies the client will try to validate the certificate.

599    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TDS:Prelogin, Flags=...AP..., SrcPort=56277, DstPort=1433, PayloadLen=104,

- Tds: Prelogin
  + PacketHeader: SPID = 0, Size = 104, PacketID = 1, Window = 0
  - PreLoginPacketData:
   - PreloginOptions:
    + PreloginOptionTokens:
    - PreloginOptionData:
     + VersionData:
     - EncryptionData:
        Encryption: ENCRYPT_ON 1 (0x1)    <----- Data Encryption is Requested by the client
     + InstOptData:
     + ThreadIDData:
     + MARSData:
     + TRACEIDLengthData:
     + FederatedLengthData:

602    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TDS:Response

The SSL/TLS handshake results in the server sending a certificate to the client.
For data encryption, the client tries to validate the certificate after receiving frame 617 (Server Hello).

605    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TLS:TLS Rec Layer-1 HandShake: Client Hello.
614    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=...A...., SrcPort=1433, DstPort=56277, PayloadLen=0,
617    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.

- TLS: TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.
  - TlsRecordLayer: TLS Rec Layer-1 HandShake:
     ContentType: HandShake:
   + Version: TLS 1.2
     Length: 847 (0x34F)
   - SSLHandshake: SSL HandShake Server Hello Done(0x0E)
      HandShakeType: ServerHello(0x02)
      Length: 81 (0x51)
    + ServerHello: 0x1
      HandShakeType: Certificate(0x0B)
      Length: 517 (0x205)
    - Cert: 0x1
       CertLength: 514 (0x202)
     - Certificates:
        CertificateLength: 511 (0x1FF)
      + X509Cert: Issuer: SSL_Self_Signed_Fallback, Subject: SSL_Self_Signed_Fallback   <---- this is SQL Server's Self-Generated Certificate
      HandShakeType: Server Key Exchange(0x0C)
      Length: 233 (0xE9)
      ServerKeyExchange: Binary Large Object (233 Bytes)
      HandShakeType: Server Hello Done(0x0E)
      Length: 0 (0x0)

The certificate is an SSL_Self_Signed_Fallback certificate, which means that it cannot be validated.
The client terminates the connection.

686    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=...A...F, SrcPort=56277, DstPort=1433, PayloadLen=0,
710    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=...A...., SrcPort=1433, DstPort=56277, PayloadLen=0,
713    8:34:51 AM 3/9/2022  10.10.10.20  10.10.10.10  TCP:Flags=...A...F, SrcPort=1433, DstPort=56277, PayloadLen=0,
719    8:34:51 AM 3/9/2022  10.10.10.10  10.10.10.20  TCP:Flags=...A...., SrcPort=56277, DstPort=1433, PayloadLen=0,

Notitie

In dit voorbeeld ziet u SQL Server met behulp van een zelf gegenereerd certificaat, maar elk certificaat kan zich in het Server Hello-pakket bevinden als het om een of andere reden niet wordt vertrouwd door de client.

Uitleg

Controleer de netwerktracering om inzicht te hebben in de communicatiestroom tussen de client en de server.

  • Frame 590 - 599: TCP-handshake- en PreLogin-pakket dat aangeeft dat gegevensversleuteling vereist is.
  • Frame 605 - 617: TLS-handshake met Server Hello die het servercertificaat verzendt.
  • Frame 686 - 719: Beëindiging van de verbinding vanwege certificaatvalidatiefout.

De client vraagt gegevensversleuteling aan, waardoor de validatie van het servercertificaat wordt geactiveerd. De server reageert echter door een zelfondertekend certificaat (SSL_Self_Signed_Fallback) te verzenden, waardoor de validatie mislukt.

Wanneer de client gegevensversleuteling (Encrypt=yes of Use Encryption for Data=True) aanvraagt of de server gegevensversleuteling vereist (Force Encryption=Yes alleen voor nieuwere stuurprogramma's), probeert het clientstuurprogramma het servercertificaat te valideren.

Notitie

Als versleuteling niet wordt aangevraagd, wordt het PreLogin-pakket nog steeds versleuteld, maar wordt het certificaat niet gevalideerd.

Als u het servercertificaat wilt valideren, moet het certificaatarchief van de client een kopie van het servercertificaat, een vertrouwd basiscertificaat of een vertrouwd tussencertificaat bevatten.

Wanneer u een certificaat van een externe certificeringsinstantie (CA) koopt, wordt Windows meestal vooraf geïnstalleerd met het basiscertificaat en hoeft u niets te doen.

Als uw bedrijf een CA heeft, moet u de basis- of tussencertificaten pushen via Groepsbeleid of deze handmatig toevoegen.

Als u een zelfondertekend certificaat hebt en het aantal clients dat het nodig heeft, is het in het algemeen klein om het handmatig toe te voegen. Als het aantal clients echter groot is, kunt u Groepsbeleid gebruiken om het certificaat te distribueren. Exporteer deze uit SQL Server zonder de persoonlijke sleutel voor beveiliging.

Als SQL Server geen certificaat gebruikt, wordt er een voor zichzelf gegenereerd.

Oplossing

Kortetermijnbeperking: instellen TrustServerCertificate=Yes in de verbindingsreeks van de toepassing.

Langetermijnbeperking: Koop of genereer een certificaat voor de server.

Meer informatie