La sezione sui certificati client nella specifica TLS 1.0 (RFC 2246) dice questo:
If no suitable certificate is
available, the client should send a
certificate message containing no
certificates. If client authentication
is required by the server for the
handshake to continue, it may respond
with a fatal handshake failure alert.
Il fatto che possa rispondere con un avviso fatale non significa che debba farlo.
Hai taggato la tua domanda con IIS, ma qui c'è un po 'di background su altri server.
In Apache Httpd, ci sono tre impostazioni per richiedere un certificato client : none
, optional
e required
(e optional_no_ca
se si desidera disabilitare la verifica del certificato lì).
Quando il server è configurato con optional
, quando il client non presenta un certificato, l'handshake continuerà comunque. Quando il server è configurato con required
, se non è presente alcun certificato client, si verificherà un avviso di errore irreversibile. Java SSLEngine
implementa questi impostazioni con setWantClientAuth
e setNeedClientAuth
.
Si noti che procedere con l'handshake non significa che il server concederà l'accesso alla risorsa o autorizzerà l'esecuzione della richiesta.
Il grosso lato negativo del comportamento di avviso di guasto fatale è che chiude bruscamente la connessione. Nella migliore delle ipotesi, apparirà come un messaggio di "connessione chiusa - errore di handshake" (o qualcosa di simile) nel browser. Nessuno scambio HTTP avrà avuto luogo, quindi non è possibile inviare un codice di stato HTTP e / o una pagina web di accompagnamento per descrivere il problema.
Da un punto di vista dell'usabilità, questo può essere molto confuso, specialmente per gli utenti che non hanno necessariamente familiarità con i certificati client (spesso c'è una certa curva di apprendimento semplicemente per gestire i certificati). Per questo motivo, molti server richiedono solo l'autenticazione del certificato client opzionale, in modo da poter inviare una spiegazione se l'autorizzazione è negata.
Devo ammettere che non sono del tutto familiare con le impostazioni in IIS, ma la documentazione sembra suggerire che ci sono anche tre opzioni:
Select Ignore if you do not want to
accept a client certificate even if a
client presents one.
Select Accept to accept client
certificates.
Select Require to require client
certificates. To use Require Client
Certificates, you must enable Require
SSL.
Un altro documento suggerisce che esiste un codice di stato HTTP e un messaggio di errore per non aver fornito un certificato richiesto: " 403.7 Proibito: richiesto il certificato del cliente ".
Il fatto che esista un codice di stato HTTP per questo caso implica che non è un caso che causa un errore di handshake (altrimenti la connessione non verrebbe stabilita per inviare messaggi HTTP). Ciò implica che la modalità "require" di IIS si comporta come la modalità "facoltativa" di Apache Httpd per quanto riguarda l'handshake TLS, ovvero non presentare un certificato client non causa un avviso fatale (l'autorizzazione in seguito è diversa importa, ovviamente).
Non sono sicuro di cosa siano "ignore" e "accetta", quindi. In SSL / TLS, solo il server può richiedere un certificato, inviando un messaggio CertificateRequest
. Se il server non invia questo messaggio, il client semplicemente non invierà mai il suo certificato, ancora una volta, da RFC 2246:
7.4.6. Client certificate
When this message will be sent:
This is the first message the client can send after receiving a
server hello done message. This message is only sent if the
server requests a certificate.
La mia ipotesi è che significano "ignorare" / "accettare" in termini di mappatura dell'account o autorizzazione, più avanti sulla linea.
Modifica.
Per quanto mi ricordo, per impostazione predefinita, IIS negozia sempre i certificati client usando rinegoziazione : una prima stretta di mano ha esito positivo, senza alcuna richiesta di certificato client, ma poi, una seconda stretta di mano è innescato.
Ciò significa che non si sarà in grado di vedere lo scambio di certificati client osservando i pacchetti, poiché questa seconda stretta di mano verrà eseguita all'interno della sessione crittografata (in alcuni casi è possibile vederlo con Wireshark, è configurato con il server chiave privata e supporta la suite di crittografia).
È possibile configurare la negoziazione del certificato client da eseguire nell'handshake iniziale utilizzando l'opzione clientcertnegotiation=enable
di netsh (che si riferisce all'handshake iniziale).