Condividi tramite


Errore di convalida del certificato

Note

Questo articolo è destinato a persone che hanno familiarità con l'acquisizione e la lettura delle tracce di rete.

Sintomi

Quando il client non riesce a convalidare il certificato server, nell'applicazione client viene visualizzato il messaggio di errore seguente:

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

Esempio di traccia di rete

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,

Esempio di traccia di rete con commenti

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,

Note

Questo esempio mostra SQL Server usando un certificato generato automaticamente, ma qualsiasi certificato potrebbe trovarsi nel pacchetto Server Hello se non è considerato attendibile dal client per qualche motivo.

Spiegazione

Controllare la traccia di rete per comprendere il flusso di comunicazione tra il client e il server.

  • Frame 590 - 599: handshake TCP e pacchetto PreLogin che indica che è necessaria la crittografia dei dati.
  • Frame 605 - 617: handshake TLS con Server Hello che invia il certificato del server.
  • Frame 686 - 719: chiusura della connessione a causa di un errore di convalida del certificato.

Il client richiede la crittografia dei dati, che attiva la convalida del certificato server. Tuttavia, il server risponde inviando un certificato autofirmato (SSL_Self_Signed_Fallback), che causa l'esito negativo della convalida.

Quando il client richiede la crittografia dei dati (Encrypt=yes o ) o Use Encryption for Data=Trueil server richiede la crittografia dei dati (Force Encryption=Yes solo per i driver più recenti), il driver client tenta di convalidare il certificato del server.

Note

Se la crittografia non è richiesta, il pacchetto PreLogin è ancora crittografato, ma il certificato non viene convalidato.

Per convalidare il certificato del server, l'archivio certificati computer del client deve contenere una copia del certificato del server, un certificato radice attendibile o un certificato intermedio attendibile.

Quando si acquista un certificato da un'autorità di certificazione (CA) di terze parti, Windows viene in genere preinstallato con il certificato radice e non è necessario eseguire alcuna operazione.

Se l'azienda ha una CA, è necessario eseguire il push dei certificati radice o intermedi tramite Criteri di gruppo o aggiungerli manualmente.

Se si ha un certificato autofirmato e il numero di client necessari è ridotto, in genere è necessario aggiungerlo manualmente. Tuttavia, se il numero di client è elevato, è possibile usare Criteri di gruppo per distribuire il certificato. Esportarlo da SQL Server senza la chiave privata per la sicurezza.

Se SQL Server non usa un certificato, ne genera uno per se stesso.

Mitigazione

Mitigazione a breve termine: impostata TrustServerCertificate=Yes nel stringa di connessione dell'applicazione.

Mitigazione a lungo termine: acquistare o generare un certificato per il server.

Ulteriori informazioni