SNI的默认证书(服务器名称指示)

时间:2013-10-24 12:28:25

标签: ssl-certificate windows-server-2012 sni

简短说明

对于Windows Server 2012:如果客户端不支持SNI,有没有办法定义默认证书?

详细说明

我们目前正在配置Windows Server 2012,由于技术原因,它只有一个IP。该服务器用于两个任务:

  1. SSTP-Host(vpn.example.com)
  2. 单个TLS网站(www.example.com)的主持人
  3. 因此,为同一IP地址和端口定义了两个证书。当对端口443进行调用时,几乎每个客户端都提交SNI参数“server_name”。然后,服务器使用此参数为连接选择正确的证书。

    BUT: 带有Internet Explorer的Windows XP不支持SNI,并且缺少参数“server_name”。因此服务器必须猜测,返回哪个证书。在我们的示例中,它默认为vpn-certificate,浏览器显示证书错误(因为证书的主机名“vpn.example.com”与URL“www.example.com”中的主机名不匹配)。

    有没有办法建议服务器使用www-certificate作为默认值?

    在我们的案例中,这将是一个完美的解决方案:

    1. 所有www-requests都会获得www证书,即使他们不支持SNI。
    2. 所有SSTP请求都将获得vpn证书,因为它们都支持SNI。
    3. 可以这样做吗?

2 个答案:

答案 0 :(得分:1)

我知道你已经自己回答了这个问题,但令我感到困惑的是,没有简单的方法可以做到这一点。 我不确定你是否有时间尝试它,但我认为这种方法即使在重启期间也会保存设置。

在您的情况下,如果编辑vpn.example.com的https 443绑定并勾选“需要服务器名称指示”框并输入课程的主机名,然后单击“确定”。 然后在另一个网站www.example.com上做同样的事情,但删除"要求服务器名称指示"。

当我运行netsh http show sslcert时,它显示了我已经交换的两个证书,一个在ip:port上,另一个在主机名:port

 IP:port                      : 0.0.0.0:443
 Certificate Hash             : 41f099397ad4437f7af7bf1c3157a18bd2576ebc
 Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
 Certificate Store Name       : WebHosting
 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

 Hostname:port                : secure.localhost:443
 Certificate Hash             : 106073025a888e17e94a7843de844d270714e806
 Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
 Certificate Store Name       : WebHosting
 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

之后

 IP:port                      : 0.0.0.0:443
 Certificate Hash             : 106073025a888e17e94a7843de844d270714e806
 Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
 Certificate Store Name       : WebHosting
 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

 Hostname:port                : localhost:443
 Certificate Hash             : 41f099397ad4437f7af7bf1c3157a18bd2576ebc
 Application ID               : {4dc3e181-e14b-4a21-b022-59fc669b0914}
 Certificate Store Name       : WebHosting
 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

希望这会为你节省一些时间和其他任何事情!

答案 1 :(得分:0)

我做了更多的研究。底线:它可以完成,但只能在命令行上完成,可能不是永久性的。 Netsh可以显示http绑定。

netsh http show sslcert

在那里你可以看到IIS注册了一个SNI-Binding:www.example.com:443

但RAS-Service使用证书vpn.example.com注册完整端口443:0.0.0.0:443。

如果客户端不支持SNI,后者也是默认证书。 现在我使用netsh将RAS-Binding移动到vpn.example.com:443并在www.example.com上为0.0.0.0:443创建一个新绑定。

现在服务器的行为完全符合我的要求。我甚至使用Wireshark来确保我的RAS客户端确实支持SNI。

但是这个设置可能不是永久性的。只要IIS或RAS-Service重置设置,它们就会丢失。

当然,您可以使用某种服务每隔几秒检查一次这些设置。但我没有发现任何开箱即用的东西,也不想实现它。因此,我将等待Microsoft通过gui为RAS启用SNI,并在此之前使用单个证书。