2009-10-27 47 views
2

我有兩個WCF服務器,都在域mydomain.com上(虛構的例子,下面是IP),分別命名爲server1和server2。如何使用SSL通配符證書通過X509相互驗證多個WCF服務器?

他們都是通過自己的公網IP地址訪問(foo.1和2),而且從專用LAN他們對(即192.168.0.1 192.168.0.2和)

我自己一個通配符SSL證書* .mydomain.com。它正確地安裝在相關的商店(即個人加密和值得信賴的客戶端進行身份驗證)

我希望我的兩臺服務器在本地網絡地址上使用我的通配符證書進行身份驗證。

我已經更新了C:\ WINDOWS \ SYSTEM32 \ DRIVERS \ ETC \ hosts文件,使它看起來像這樣:

192.168.0.1  Server1.mydomain.com 
192.186.0.2  Server2.mydomain.com 

這些都不是IP地址,如果我解決Server1.mydomain我得到.COM(我寧願讓foo.1 - 2)

我還編輯了連接特定的DNS後綴

我的證書被稱爲我的IPV4本地接口「mydomain.com」喜歡這個在我的Server.config文件(我剝去了所有與認證無關的部分)

 <behavior name="ServerToServerBehavior" > 
      <serviceCredentials> 
      <clientCertificate> 
       <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/> 
      </clientCertificate> 
      <serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="myServerAsClientBehaviorConfiguration"> 
      <clientCredentials> 
      <clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/> 
      <serviceCertificate> 
       <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/> 
      </serviceCertificate> 
      </clientCredentials> 
     </behavior> 
     </endpointBehaviors> 

這工作完全正常我自己開發的計算機上本地生成X509證書,但在我的生產環境,這裏就是我得到:

Server.Connect:無法連接到服務器 Server2上: System.ServiceModel.Security.MessageSecurityException: 傳出 消息的身份檢查失敗。遠程端點 的預期DNS標識爲 'server2.mydomain.com',但遠程端點 提供了DNS索賠 'mydomain.com'。如果這是一個合法的遠程端點 ,則可以通過 明確指定DNS身份「mydomain.com」 作爲 端點地址創建通道 代理時的身份屬性。

我試圖讓服務器回答Server2.mydomain.com,而不是僅僅mydomain.com,都沒有成功。有關如何做到這一點的任何提示?

我也嘗試了錯誤消息中提出的解決方案,但這似乎沒有任何效果(其他用戶似乎有the same problem,我還沒有找到解決方案)。任何想法如何解決這個問題?

編輯: 我檢查了我的證書提供者,我確實可以將它用於X509身份驗證。

回答

1

我終於明白了爲什麼我的標識字段被忽略。

我的端點構建是這樣的:

DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server"); 

設置uri參數的情況下,DNS標識字段(在App.config定義),被覆蓋以及(即使它是空的,這是當我們使用字符串而不是真正的URI對象時)。

解決的辦法是設置編程使用下面的代碼:

 System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]); 

     DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri); 
0

我認爲DNS聲明覆蓋錯誤是在客戶端而不是服務器上指定的錯誤,所以你不打開任何東西通過進行更改,除了你的客戶端可以成功連接到任何服務器你的域名(如果它正在收聽)。你看到的錯誤有點像證書上主機名稱不匹配的消息安全等價物。經過大量的調整,我已經獲得了消息安全性以處理通配證書,但是您可能必須執行一些自定義驗證工作,因爲您的證書可能沒有指定客戶機身份驗證使用情況。

您沒有使用傳輸安全性的任何原因?更簡單的工作,除非你有中間的Layer7路由...

+0

是的,我的證書可以作爲X509證書(只問魔島) – Brann 2009-10-28 10:43:34

+0

我使用的運輸保障。在綁定部分中定義的id如下: Brann 2009-10-28 11:02:26

相關問題