Microsoft Azure Cloud Service具有Web角色,在服务定义中定义如下:
<ServiceDefinition name="Magic" schemaVersion="" xmlns="[WHATEVER]">
<WebRole name="MagicRole">
<Sites>
<Site name="Web" >
<Bindings>
<Binding name="HttpIn" endpointName="HttpIn" />
<Binding name="HttpsIn" endpointName="HttpsIn" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="HttpIn" protocol="http" port="80" />
<InputEndpoint name="HttpsIn" protocol="https"
port="443" certificate="ServiceCert"/>
</Endpoints>
<Certificates>
<Certificate name="ServiceCert"
storeLocation="LocalMachine" storeName="My" />
</Certificates>
</WebRole>
</ServiceDefinition>
这项服务已经好几个月了。最近,用户在建立与服务的SSL连接时开始报告一些模糊的问题。
据报道,iOS上的Safari声称它无法验证服务器身份,据报道cURL说无法获得本地发行人证书和第三方SSL验证工具据报道,this和this表示证书安装不正确。问题不能一致地再现。有时请求成功,有时失败。第三方工具有时会报告服务已正确配置,有时会报告其配置错误。
在用户开始报告这些问题之前,服务中没有更改任何内容。
什么可能导致这个问题?
答案 0 :(得分:1)
您的服务定义已损坏。最近更新了Azure documentation以显示正确的配置。 证书元素必须列出服务证书信任链中的所有中间证书。中间证书不会绑定到任何端点,只需列出它们即可。方法如下:
<Certificates>
<Certificate name="IntermediateCAForServiceCert"
storeLocation="LocalMachine" storeName="CA" />
<!-- List all intermediate certificates from the chain
when the chain contains more than one intermediate-->
<Certificate name="ServiceCert"
storeLocation="LocalMachine" storeName="My" />
</Certificates>
使用这样的配置,中间证书将安装到本地存储中,IIS可以在那里找到它并提供给客户端(以及服务证书),以便客户端可以验证服务证书链。
使用您的配置,您可能会看到“它正常工作”,因为Windows / IIS中的某个地方存在未记录的行为。这个answer显示了证明。简而言之,当服务证书安装到角色实例中时,中间件中的某些东西会尝试从CA基础结构中获取缺少的中间证书,并将它们存储在本地某个位置(而不是存储在证书存储区中)。如果提取成功,则IIS具有证书并可以将其提供给客户端。如果提取失败(网络问题,CA基础结构暂时不可用,等等),则IIS仅提供服务证书。
请记住,您的网络角色前面有一个负载均衡器。不同的请求可能会到达不同的实例。如果您的服务扩展并且新实例开始,他们可能无法获取中间体,并且到达他们的请求将产生没有中间体的响应,这使得用户不满意。某些实例可能会重新定位或重新映像,无法重新获取会导致同样问题的中间体。
您的服务定义导致服务行为不可靠的底线。列出证书元素下的中间体来解决此问题。