ale*_*xey 6 certificate client-certificates azure azure-web-roles
我需要使用客户端证书对Azure Cloud Service Web角色的请求进行身份验证.如何将证书颁发机构(CA)根证书放在正确的受信任存储中?
我尝试在管理门户中上传它,然后使用AuthRoot商店名称在服务定义文件中定义它:
<Certificate name="RootCA" storeLocation="LocalMachine" storeName="AuthRoot" />
Run Code Online (Sandbox Code Playgroud)
真正奇怪的是它有效......但有时候才有效.它可能在实例重新引导后工作,但在服务更新或其他实例重新引导后可能无法工作.这似乎是Azure中的一个错误.
当我说"工作"时,我的意思是服务器成功接受客户端证书并处理请求.当我说"不起作用"时,我的意思是服务器在证书检查后没有协商连接并且"请求被中止:无法创建SSL/TLS安全通道".在客户端抛出异常.
如何使其稳定运行?
UPD:
在系统Windows事件日志中找到此记录(源是Schannel):
在请求客户端身份验证时,此服务器会向客户端发送可信证书颁发机构列表.客户端使用此列表选择服务器信任的客户端证书.目前,该服务器信任如此多的证书颁发机构,因此该列表已经变得太长了.因此该列表被截断.此计算机的管理员应检查受信任的证书颁发机构以进行客户端身份验证,并删除那些不需要信任的证书颁发机构.
这里描述了确切的问题: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
Run Code Online (Sandbox Code Playgroud)
要从CMD启动任务运行它:
PowerShell -ExecutionPolicy Unrestricted .\Startup.ps1
exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)
在ServiceDefinition.csdef中:
<WebRole name="Web">
<Startup>
<Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple" />
</Startup>
<!-- ... ->
</WebRole>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4516 次 |
| 最近记录: |