SSL/TLS 應(yīng)用于無Svc文件的WCF
在許多項目中,我們可能需要使用SSL/TLS(SSL Security Socket Layer 安全套接字/TSL Transfer Layer Security 傳輸層安全)來對客戶端與服務(wù)端進(jìn)行認(rèn)證,并使用客戶端與服務(wù)端之間認(rèn)證成功后產(chǎn)生的會話密鑰(Session Key)對數(shù)據(jù)加密,以保證消息的機(jī)密性。
應(yīng)用SSL/TLS,很自然想到證書。.Net平臺下,可以使用makeCert來制作測試證書。關(guān)于makeCert的使用,可以參見MSDN。
本節(jié)內(nèi)容:
1、證書制作
2、無Svc文件的服務(wù)端配置
3、客戶端調(diào)用
1、證書制作
本例中使用的制作證書的命令如下:
makecert -r -pe -n "CN= Tyb1222 " -b 01/01/2000 -e 01/01/2050 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12
注意以上命令紅色部分表示證書主題。
-ss my表示證書的存儲區(qū)為個人。
-sr localMachine 表示存儲于本地計算機(jī)
這些信息在稍后的配置中會用到。其他的請參見MSDN中的說明
查看證書如圖:
2、無Svc文件的服務(wù)端配置
<?xml version="1.0" encoding="utf-8"?> <!-- 有關(guān)如何配置 ASP.NET 應(yīng)用程序的詳細(xì)消息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="vrvTransportBinding"> <security mode="Transport"> <transport clientCredentialType="None"></transport> </security> </binding> </basicHttpBinding> </bindings> <serviceHostingEnvironment> <serviceActivations> <add service="VrvService.StateGrid.TerminalService" relativeAddress="TerminalService.svc"/> </serviceActivations> </serviceHostingEnvironment> <services> <service name="VrvService.StateGrid.TerminalService" behaviorConfiguration="vrvServiceBehavior"> <endpoint address="" binding="basicHttpBinding" contract="VrvService.Interface.ITerminal" behaviorConfiguration="vrvEndpointBehavior" bindingConfiguration="vrvTransportBinding"> </endpoint> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="vrvServiceBehavior"> <serviceMetadata httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="True"/> <serviceCredentials> <windowsAuthentication allowAnonymousLogons="true"/> <clientCertificate> <authentication certificateValidationMode="PeerTrust"/> </clientCertificate> <serviceCertificate findValue="Tyb1222" storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
3、客戶端調(diào)用
可以通過添加引用調(diào)用服務(wù):如下圖,單擊確定即可:

客戶端調(diào)用代碼如下:
var proxy = new TerminalClient(); proxy.GetTerminalAlarm("123123", 10);
運行代碼出現(xiàn)如下異常:

由于證書是使用信任鏈模式對進(jìn)行認(rèn)證的,如果證書不收信,將導(dǎo)致以上異常。解決辦法如下:
1、將證書導(dǎo)入“受信任根證書頒發(fā)機(jī)構(gòu)”,如下圖:

在上圖的導(dǎo)入窗口中操作后,客戶端調(diào)用就不會有以上異常。
2、在C#客戶端調(diào)用時,可以通過代碼回調(diào)證書的認(rèn)證方式:
ServicePointManager.ServerCertificateValidationCallback +=
(sender, certificate, chain, sslPolicyError) => true;
var proxy = new TerminalClient();
proxy.GetTerminalAlarm("123123", 10);
參考:
http://www.rzrgm.cn/artech/archive/2011/06/02/Authentication_042.html
浙公網(wǎng)安備 33010602011771號