3

简短的介绍

对于 Windows Server 2012:如果客户端不支持 SNI,是否可以定义默认证书?

详细描述

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

  1. SSTP 主机 (vpn.example.com)
  2. 单个 TLS 网站 (www.example.com) 的主机

因此,为相同的 IP 地址和端口定义了两个证书。当调用 443 端口时,几乎每个客户端都会提交 SNI 参数“server_name”。然后,服务器会使用此参数为连接选择正确的证书。

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

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

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

  1. 所有 www 请求都将获得 www 证书,即使它们不支持 SNI。
  2. 所有 SSTP 请求都会获得 vpn 证书,因为它们都支持 SNI。

这可以做到吗?

4

2 回答 2

3

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

在您的情况下,如果您编辑 vpn.example.com 的 https 443 绑定并勾选需要服务器名称指示框并输入主机名当然并单击确定。然后在另一个网站 www.example.com 上执行相同操作,但删除“需要服务器名称指示”中的勾号。

当我运行它时,netsh http show sslcert它显示我已经交换了两个证书,一个在 ip:port 上,另一个在 hostname: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

希望这将为您和其他任何人节省一些时间!

于 2013-10-29T18:02:48.630 回答
1

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

netsh http show sslcert

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

但是 RAS 服务使用证书 vpn.example.com 注册完整的端口 443:0.0.0.0:443。

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

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

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

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

于 2013-10-25T07:53:00.890 回答