在初始握手期间使IIS需要SSL客户端证书

nsl*_*wes 19 iis ssl client-certificates

我正在尝试配置IIS网站以要求SSL客户端证书.该网站在IIS 6和7中都设置了,虽然我更感兴趣的是使其适用于7.我在IIS中设置了require客户端证书属性,它通过Web浏览器访问网站时工作正常,但是Java-基于客户端无法访问它.

我认为问题是IIS在初始SSL握手期间不会请求客户端证书.相反,它会协商正常的SSL连接,检查资源是否需要客户端证书,如果是,则启动请求客户端证书的新SSL握手.IIS执行此操作以支持仅需要某些资源的客户端证书的站点.即使为整个网站指定了要求,IIS仍会启动两次SSL握手.我想强制IIS在第一次SSL握手时请求客户端证书,这有望使客户端正常工作.(客户端是由外部合作伙伴开发的,我几乎不了解它是如何设置的,也无法访问其源代码)

有没有人在IIS之前处理过这个问题?

Cra*_*yro 11

这是我在IIS 7.5上的方法:

  1. 在管理命令提示符中运行以下命令: netsh http show sslcert
  2. 将输出保存在文本文件中.看起来像这样:

    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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用该信息创建批处理文件:

    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
    
    Run Code Online (Sandbox Code Playgroud)

    (是的,你必须删除并重新添加;你不能只是就地改变clientcertnegotiation.这就是保存哈希和GUID很重要的原因,因此它知道要重新添加什么.)

  4. 运行该批处理文件,检查是否有错误,完成.

请记住,此设置是按证书应用,而不是按服务器应用的.因此,如果您使用多个证书,或更改/更新您的证书,则必须再次执行此操作.


Way*_*eks 7

我花了一段时间才找到此配置数据库设置.我们的客户使用新的certicom库遇到了同样的问题.自从MITM攻击发现SSL重新协商以来,很多圈子的答案都是重新进行重新协商请求.

从\ inetpub\adminscripts运行以下cmd将强制IIS始终请求客户端证书.

对于IIS 6:cscript adsutil.vbs设置\ w3svc\siteID\SSLAlwaysNegoClientCert True

(因此对于默认网站,cscript adsutil.vbs设置\ w3svc\1\SSLAlwaysNegoClientCert True)

请记住,某些客户端Internet Explorer在收到客户端证书时会提示客户端证书是否需要客户端证书.

对于IIS 7:

将以下文本保存到名为"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);
Run Code Online (Sandbox Code Playgroud)

从提升/管理员命令提示符运行以下命令:

cscript.exe enable_ssl_renegotiate_workaround.js

(来自KB文章977377)