2010-03-25 17 views
15

Sto tentando di configurare un sito Web IIS per richiedere certificati client SSL. Il sito Web è configurato in IIS 6 e 7, anche se sono più interessato a farlo funzionare per 7. Ho impostato la proprietà dei certificati client richiesta in IIS e funziona correttamente quando si accede al sito tramite un browser Web, ma un Java- il client basato ha problemi ad accedervi.Fare in modo che IIS richieda un certificato client SSL durante l'handshake iniziale

Credo che il problema è che IIS non richiede un certificato client durante l'handshake SSL iniziale. Invece negozia una normale connessione SSL, controlla se la risorsa richiede i certificati client e se lo fa avvia un nuovo handshake SSL che richiede un certificato client. In questo modo, IIS supporta i siti che richiedono solo i certificati client per determinate risorse. Anche quando il requisito è specificato per l'intero sito Web, IIS avvia ancora due handshake SSL. Voglio forzare IIS a richiedere il certificato client sul primo handshake SSL, che si spera possa far funzionare le cose per il client. (Il client è sviluppato da un partner esterno e non ho praticamente alcuna conoscenza di come è impostato e nessun accesso al suo codice sorgente)

Qualcuno ha già avuto a che fare con questo problema in IIS?

+0

Si consiglia di provare questa domanda serverfault.com – Jeff

risposta

6

Mi ci è voluto un po 'per trovare questa impostazione della metabase. Stavamo riscontrando lo stesso problema con il nostro cliente che utilizzava le nuove librerie certicom. Dalla scoperta dell'attacco MITM intorno alla rinegoziazione SSL, la risposta in molte cerchie è stata l'interruzione delle richieste di rinegoziazione.

eseguendo il seguente cmd da \ inetpub \ adminscripts obbligherà IIS a richiedere sempre un certificato client.

Per IIS 6: cscript adsutil.vbs set \ w3svc \ ID sito \ SSLAlwaysNegoClientCert Vero

(Così, per il sito Web predefinito, cscript adsutil.vbs set \ w3svc \ 1 \ SSLAlwaysNegoClientCert True)

Tenere tenere presente che alcuni client Internet Explorer richiedono i certificati client quando riceve il pacchetto se è necessario o meno il certificato client.

Per IIS 7:

Salvare il testo seguente in un file chiamato "Enable_SSL_Renegotiate_Workaround.js"

var vdirObj=GetObject("IIS://localhost/W3svc/1"); 
// replace 1 on this line with the number of the web site you wish to configure 

WScript.Echo("Value of SSLAlwaysNegoClientCert Before: " + vdirObj.SSLAlwaysNegoClientCert); 
vdirObj.Put("SSLAlwaysNegoClientCert", true); 
vdirObj.SetInfo(); 
WScript.Echo("Value of SSLAlwaysNegoClientCert After: " + vdirObj.SSLAlwaysNegoClientCert); 

eseguire il seguente comando da un prompt dei comandi con privilegi elevati/amministratore:

cscript. exe enable_ssl_renegotiate_workaround.js

(Jacked dell'articolo KB per 977377)

+1

bene, ha ancora come il modo in cui ho digitato ... generico cscript adsutil.vbs \ w3svc \ ID sito \ SSLAlwaysNegoClientCert vero per il sito web di default (Esempio) cscript adsutil.vbs \ w3svc \ 1 \ SSLAlwaysNegoClientCert True –

+0

Funziona in IIS 7? Ricordo di aver trovato SSLAlwaysNegoClientCert ma non sono riuscito a capire come impostarlo in IIS 7. Recentemente ho trovato questa spiegazione: http://forums.iis.net/t/1158990.aspx. Alla fine, abbiamo deciso di seguire una strada diversa per l'autenticazione del nostro cliente, quindi il mio interesse è solo per curiosità. Grazie per la tua risposta. – nslowes

+0

Sì, il nostro documento di installazione già consiglia i componenti di compatibilità IIS 6. Quindi, sono partito facilmente. La tua domanda potrebbe avermi salvato un mummia che mastica di lunedì. Non ho controllato se adsutil fosse parte dei componenti di combattibilità di IIS 6. Ne ho avuto troppi troppi per preoccuparmene adesso. –

8

Ecco come ho fatto questo, su IIS 7.5:

  1. eseguire il seguente in un prompt dei comandi di amministrazione: netsh http show sslcert
  2. salvare l'output in un file di testo.Sarà simile a questa:

    IP:port     : 0.0.0.0:443 
    Certificate Hash  : [a hash value] 
    Application ID   : {[a GUID]} 
    Certificate Store Name : MY 
    Verify Client Certificate Revocation : Enabled 
    Verify Revocation Using Cached Client Certificate Only : Disabled 
    Usage Check : Enabled 
    Revocation Freshness Time : 0 
    URL Retrieval Timeout : 0 
    Ctl Identifier   : (null) 
    Ctl Store Name   : (null) 
    DS Mapper Usage : Disabled 
    Negotiate Client Certificate : Disabled 
    
  3. Creare un file batch utilizzando queste informazioni:

    netsh http show sslcert 
    netsh http delete sslcert ipport=0.0.0.0:443 
    netsh http add sslcert ipport=0.0.0.0:443 certhash=[your cert hash from above] appid={[your GUID from above]} certstorename=MY verifyclientcertrevocation=enable VerifyRevocationWithCachedClientCertOnly=disable UsageCheck=Enable clientcertnegotiation=enable 
    netsh http show sslcert 
    

    (Sì, è necessario eliminare e aggiungere nuovamente, non si può solo alterare clientcertnegotiation in- Questo è il motivo per cui è importante salvare l'hash e il GUID, quindi sa cosa aggiungere nuovamente.)

  4. Eseguire quel file batch, verificare eventuali errori, fatto.

Tenete presente che questa impostazione viene applicata per-certificato, non per-server. Quindi, se usi più certs, o cambi/aggiorni il tuo cert, dovrai farlo di nuovo.

+0

Ci dovrebbero essere delle nuove righe tra ciascuno di questi comandi netsh. Non ricordo da dove ho preso questo - KB? MSDN? – CrazyPyro

+0

In secondo luogo, ciò funziona in IIS 7.5 su Windows 2008 R2. –

Problemi correlati