6

我需要使用客户端证书对 Azure 云服务Web 角色的请求进行身份验证。如何将证书颁发机构 (CA) 根证书放入正确的受信任存储区?

我尝试将其上传到管理门户中,然后使用AuthRoot存储名称在服务定义文件中定义它:

<Certificate name="RootCA" storeLocation="LocalMachine" storeName="AuthRoot" />

真正奇怪的是它可以工作......但只是有时。它可能在实例重启后工作,但在服务更新或另一个实例重启后可能无法工作。这似乎是 Azure 中的一个错误。

当我说“有效”时,我的意思是服务器成功接受了客户端证书并处理了请求。当我说“不起作用”时,我的意思是服务器在证书检查和“请求被中止:无法创建 SSL/TLS 安全通道”之后没有协商连接。在客户端抛出异常。

如何让它工作稳定?

升级版:

在系统 Windows 事件日志中找到这条记录(来源是 Schannel):

当请求客户端身份验证时,此服务器会向客户端发送受信任的证书颁发机构列表。客户端使用此列表来选择服务器信任的客户端证书。目前,该服务器信任的证书颁发机构太多,以至于列表变得太长。因此,此列表已被截断。这台机器的管理员应该审查信任的证书颁发机构进行客户端身份验证,并删除那些实际上不需要信任的证书颁发机构。

4

1 回答 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>
于 2013-02-13T08:45:18.500 回答