SSL证书验证有时会成功,有时会在客户端连接到Azure Cloud Service时失败

时间:2016-04-13 10:17:00

标签: azure ssl iis curl azure-web-roles

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验证工具据报道,thisthis表示证书安装不正确。

问题不能一致地再现。有时请求成功,有时失败。第三方工具有时会报告服务已正确配置,有时会报告其配置错误。

在用户开始报告这些问题之前,服务中没有更改任何内容。

什么可能导致这个问题?

1 个答案:

答案 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仅提供服务证书。

请记住,您的网络角色前面有一个负载均衡器。不同的请求可能会到达不同的实例。如果您的服务扩展并且新实例开始,他们可能无法获取中间体,并且到达他们的请求将产生没有中间体的响应,这使得用户不满意。某些实例可能会重新定位或重新映像,无法重新获取会导致同样问题的中间体。

您的服务定义导致服务行为不可靠的底线。列出证书元素下的中间体来解决此问题。