2010-08-10 55 views
7

我正在開發一個WCF服務(NetTcpBinding),它工作得很好,沒有安全性。我們從DigiCert購買了證書,並將其安裝在服務器上並使用DigicertUtil.exe進行配置。也安裝在測試客戶機上。根據驗證程序,遠程證書無效

打開安全性我可以從我的開發PC連接到它,沒有任何問題。

服務器配置:

binding.Security.Mode = SecurityMode.Transport; 
    binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; 
    binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign; 
    ServerHost.Credentials.ServiceCertificate.SetCertificate(
       StoreLocation.LocalMachine, 
       StoreName.My, 
       X509FindType.FindBySubjectName, 
       Properties.Settings.Default.CertificateName); 

客戶端配置:(我修改了域名和服務名,以保持客戶的隱私)

<binding name="EndPointTCP" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" 
       hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="1610612736" 
       maxReceivedMessageSize="1610612736"> 
       <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="false" inactivityTimeout="00:10:00" enabled="false" /> 
       <security mode="Transport"> 
       <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign"/> 
       </security> 
      </binding> 

    <behaviors> 
      <endpointBehaviors> 
      <behavior name="behavior_ServerService"> 
       <clientCredentials> 
       <clientCertificate findValue="*.domain.com" 
          storeLocation="LocalMachine" 
          storeName="My" 
          x509FindType="FindBySubjectName" /> 
       </clientCredentials> 
      </behavior> 
      </endpointBehaviors> 
     </behaviors> 

<client> 
    <endpoint address="net.tcp://clients.domain.com:10001/Server/ServerService" 
    binding="netTcpBinding" bindingConfiguration="EndPointTCP" contract="ServerServiceReference.IServerWS" 
    name="EndPointTCP" behaviorConfiguration="behavior_ServerService"> 
    <identity> 
     <dns value="*.domain.com" /> 
    </identity> 
    </endpoint> 
</client> 

從任何其他計算機嘗試它我在客戶端收到以下錯誤:

The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:00:59.9840000'.

An existing connection was forcibly closed by the remote host

服務器上的跟蹤日誌說:

The remote certificate is invalid according to the validation procedure.

,因爲我使用的服務器和客戶端使用相同的證書,這是非常奇怪的......(別說dev的PC從它的工作好...)

錯誤信息是一樣的,即使我設置

ServerHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 
在服務器上

ServiceClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 

在客戶端上。

有人能告訴我如何正確地做到這一點嗎?當然,我不想使用變通方法,比如驗證回調總是返回true或者上面的未驗證模式。

任何幫助,將不勝感激。只有這個「小」問題應該得到解決,以便能夠釋放... :(

非常感謝事先!

Hudgi

+0

http:// stackoverflow。COM /問題/ 777607 /的遠程證書 - 是 - 根據到的驗證無效 - - 程序-PLE 複製粘貼1線和KABOOM :) – ariel 2012-03-07 09:14:01

回答

10

這聽起來像你正在嘗試使用相同的證書無論是服務器還是客戶端證書,並且您的客戶端沒有與頒發證書的主機名相同的主機名即使您設置了X509CertificateValidationMode.None,主機名也必須匹配如果您的開發機器與服務器相同,成功

您是否故意嘗試讓客戶端進行身份驗證通過SSL連接到服務器,還是隻是試圖通過證書頒發機構建立對客戶的信任?

我還懷疑你的證書可能不是真正的通配符證書,如果這是你運氣不好的情況下使用該證書進行客戶端驗證。

+0

平淡嗨, 我怎麼能檢查證書是通配符還是不是? 在主題備用名稱字段我有simlar這個值: DNS名稱= clients.domain.com DNS名稱= domain.com DNS名稱= * domain.com 開發商機是我的筆記本電腦和服務器是與其他測試PC相似的另一個VPN。 我需要一種不強制主機名與服務器相同的方式,因爲我們希望稍後在世界上的許多機器上運行客戶端。我在服務器和客戶端配置文件中都向端點添加了子句。這不夠嗎? Thx。 – Hudgi 2010-08-11 09:51:12

+0

如果您沒有證書進行備份,只更改標識元素是不夠的。你說你有* .domain.com ..其中包括myClient.domain.com,但我不認爲通配符會支持像myClient.clients.domain.com這樣的子域名。你的客戶是否在一個子域? – insipid 2010-08-11 14:18:19

+0

我們計劃允許客戶訪問世界各地的服務,所以我們不能指望他們擁有相同的域名。我們希望將客戶端軟件安裝在遠程計算機上並自動將其作爲服務運行。我們只是想對客戶端和服務器之間的通信進行加密,因爲它通過互聯網發送敏感數據。 服務器的地址是clients.domain.com(當然它不是真正的地址,但顯示了子域的深度),我們根本不知道客戶端地址。可以做到嗎? – Hudgi 2010-08-11 15:05:36

相關問題