程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF分布式開發常見錯誤(24)

WCF分布式開發常見錯誤(24)

編輯:關於.NET

WCF分布式開發常見錯誤(24):Could not establish trust relationship for the SSL/TLS secure channel with authority

使用傳輸安全模式,證書建立SSL,宿主端口證書配置完畢,但是客戶調用服 務出錯。

【1】錯誤信息:

Could not establish trust relationship for the SSL/TLS secure channel with authority 'computer:9001'.

不能和授權計算機為 SSL/TLS 安全通道建立信任關系.

WCF中文論壇問題連接:http://social.microsoft.com/Forums/zh- CN/wcfzhchs/thread/1591a00d-d431-4ad8-bbd5-34950c39d563

錯誤截圖:

【2】配置信息:

2.1服務端配置:

服務端設置證書,不采用客戶端安全認證。安全方式是傳輸安全。服務端配 置信息如下:

<services>
<service behaviorConfiguration="WCFService.WCFServiceBehavior"  name="WCFService.WCFService" >
<endpoint
address="WCFService"
binding="wsHttpBinding"
bindingConfiguration="BasicWithTransport"
contract="WCFService.IWCFService">
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding"  contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="https://computer:9001/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFService.WCFServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<serviceCertificate  storeName="My"   x509FindType="FindBySubjectName" findValue="WCFHTTPS"  storeLocation="LocalMachine"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="BasicWithTransport">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>

2.2 客戶端配置:

客戶端添加服務引用後,直接實例化類調用WCF服務,結果就出現不能為SSL 建立信任關系錯誤。

WCFClient.ClientProxy.WCFServiceClient wcfServiceProxyHttp  = new WCFClient.ClientProxy.WCFServiceClient ("WSHttpBinding_IWCFService");
//通過代理調用SayHello服務
string sName = "Frank Xu Lei WSHttpBinding";
string sResult = string.Empty;
sResult = wcfServiceProxyHttp.SayHello(sName);

【3】問題分析:

Could not establish trust relationship for the SSL/TLS secure channel with authority 'computer:9001'.

不能和授權計算機為 SSL/TLS 安全通道建立信任關系.

實際原因和證書有很大關系,這裡證書是跟證書頒發機構信任的證書,在客 戶端和服務端建立安全會話的時候,無法信任此證書。

另外一個可能的原因是你其他域裡也使用此一個證,這個也有可能導致錯誤 。

【4】解決辦法:

3.1:定義一個類,來對遠程X.509證書的驗證,進行處理,返回為true.我們 要自己定義一個類,然後在客戶單調用WCF服務之前,執行一次即可。代碼如下 :

 public static class Util
{
/// <summary>
/// Sets the cert policy.
/// </summary>
public static void SetCertificatePolicy()
{
ServicePointManager.ServerCertificateValidationCallback
+=  RemoteCertificateValidate;
}

/// <summary>
/// Remotes the certificate validate.
/// </summary>
private static bool RemoteCertificateValidate (
object sender, X509Certificate cert,
X509Chain chain, SslPolicyErrors error)
{
// trust any certificate!!!
System.Console.WriteLine("Warning, trust  any certificate");
return true;
}
}

你要在調用操作點先調用這個方法: Util.SetCertificatePolicy();

sResult = wcfServiceProxyHttp.SayHello(sName);

3.2:就是需要你在客戶端和服務端各安裝一個跟證書授權機構。然後制作一 受信任的根證書機構的證書。可以參考這個:

http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20To% 20-%20Create%20and%20Install%20Temporary%20Certificates%20in%20WCF% 20for%20Message%20Security%20During% 20Development&referringTitle=How%20Tos

【5】總結:

對Windows Server服務器產品開發部署WCF服務的時候才采用的第二種機制。 需要授權的證書機構頒發的證書。對於普通的學習第一種方式就可以了。

WCF安全開發編程實踐,是一個比較復雜的過程,除了需要掌握基本的安全知 識以外,要需要熟練運用各種證書制作,安裝、SSL證書httpcfg.配置等工具。 在Windows Server2003,Vitsa系統下差別還很大,普通的XP系統下開發學習更是 需要安裝一寫服務,而且調試過程也比較繁瑣,一旦有點配置不對,就會出現異 常。需要耐心去學習。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved