在Azure中,客户端证书认证和CA证书

6
我需要使用客户端证书对Azure云服务的Web角色进行身份验证。如何将认证机构(CA)根证书放置在正确的受信任存储中?
我尝试在管理门户中上传它,然后使用AuthRoot存储名称在服务定义文件中定义它:
<Certificate name="RootCA" storeLocation="LocalMachine" storeName="AuthRoot" />

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

6
这里描述了一个具体的问题:http://support.microsoft.com/kb/2801679
在2012年12月的Windows更新后,向AuthRoot存储区添加许多证书。因此,我们需要删除它们以解决问题。
为此,我使用PowerShell启动任务:
Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\AuthRoot\Certificates | Where-Object {$_.Name -notlike "*\<YOUR_CERTIFICATE_THUMBPRINT>"} | Remove-Item

要从CMD启动任务运行它:

PowerShell -ExecutionPolicy Unrestricted .\Startup.ps1
exit /b %errorlevel%    

在 ServiceDefinition.csdef 文件中:

<WebRole name="Web">
  <Startup>
    <Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple" />
  </Startup>
  <!-- ... ->
</WebRole>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接