2016-04-13 45 views
0

一個微軟的Azure雲服務具有在服務定義中定義這樣一個Web角色:SSL證書驗證有時成功,有時失敗

<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連接時開始報告一些模糊的問題。

Safari瀏覽器在iOS上報道說這是無法驗證服務器的身份,捲曲報道說這是無法得到如thisthis報道說當地的頒發者證書和第三方SSL驗證工具證書安裝不正確。

該問題未得到一致的轉載。有時候請求會成功,有時會失敗。第三方工具有時會報告服務已正確配置,有時會報告其配置錯誤。

在用戶開始報告這些問題之前的兩週內,服務中沒有任何變化。

什麼可能導致此問題?

回答

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只提供服務證書。

請記住,在您的Web角色面前有一個負載平衡器。不同的請求可能會到達不同的實例。如果您的服務擴展並且新實例已啓動,則它們可能無法獲取中間體,並且到達它們的請求將產生響應而沒有使用戶不快樂的中間件。某些實例可能會重新定位或重新映像,並且無法重新獲取會導致相同問題的中間體。

您的服務定義的底線會導致不可靠的服務行爲。根據列出中間體證書元素來解決這個問題。

+0

你能在你的答案中包含更新的Azure文檔鏈接嗎? –

+0

@GauravMantri完成。 – sharptooth

相關問題