我需要使用客户端证书对Azure云服务的Web角色进行身份验证。如何将认证机构(CA)根证书放置在正确的受信任存储中?
我尝试在管理门户中上传它,然后使用AuthRoot存储名称在服务定义文件中定义它:
非常奇怪的是它能够工作……但仅在某些情况下。它可能会在实例重启后正常工作,但在服务更新或另一个实例重启后可能无法工作。这似乎是 Azure 中的一个 bug。
当我说“工作”时,我的意思是服务器成功接受客户端证书并处理请求。 当我说“不工作”时,我的意思是服务器在证书检查后未能协商连接,并在客户端抛出“请求已中止:无法创建 SSL/TLS 安全信道。”异常。
如何使其稳定工作?
更新: 在系统 Windows 事件日志(来源为 Schannel)中找到了这条记录:
当要求客户端身份验证时,此服务器向客户端发送受信任的证书颁发机构列表。客户端使用此列表选择服务器信任的客户端证书。当前,此服务器信任如此之多的证书颁发机构,以至于列表过长。因此,该列表已被截断。此计算机的管理员应查看信任用于客户端身份验证的证书颁发机构,并删除那些确实不需要信任的证书颁发机构。
我尝试在管理门户中上传它,然后使用AuthRoot存储名称在服务定义文件中定义它:
<Certificate name="RootCA" storeLocation="LocalMachine" storeName="AuthRoot" />
非常奇怪的是它能够工作……但仅在某些情况下。它可能会在实例重启后正常工作,但在服务更新或另一个实例重启后可能无法工作。这似乎是 Azure 中的一个 bug。
当我说“工作”时,我的意思是服务器成功接受客户端证书并处理请求。 当我说“不工作”时,我的意思是服务器在证书检查后未能协商连接,并在客户端抛出“请求已中止:无法创建 SSL/TLS 安全信道。”异常。
如何使其稳定工作?
更新: 在系统 Windows 事件日志(来源为 Schannel)中找到了这条记录:
当要求客户端身份验证时,此服务器向客户端发送受信任的证书颁发机构列表。客户端使用此列表选择服务器信任的客户端证书。当前,此服务器信任如此之多的证书颁发机构,以至于列表过长。因此,该列表已被截断。此计算机的管理员应查看信任用于客户端身份验证的证书颁发机构,并删除那些确实不需要信任的证书颁发机构。