SSL/TLS 应用于无Svc文件的WCF
在许多项目中,我们可能需要使用SSL/TLS(SSL Security Socket Layer 安全套接字/TSL Transfer Layer Security 传输层安全)来对客户端与服务端进行认证,并使用客户端与服务端之间认证成功后产生的会话密钥(Session Key)对数据加密,以保证消息的机密性。
应用SSL/TLS,很自然想到证书。.Net平台下,可以使用makeCert来制作测试证书。关于makeCert的使用,可以参见MSDN。
本节内容:
1、证书制作
2、无Svc文件的服务端配置
3、客户端调用
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表示证书的存储区为个人。
-sr localMachine 表示存储于本地计算机
这些信息在稍后的配置中会用到。其他的请参见MSDN中的说明
查看证书如图:
2、无Svc文件的服务端配置
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细消息,请访问 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、客户端调用
可以通过添加引用调用服务:如下图,单击确定即可:
客户端调用代码如下:
var proxy = new TerminalClient(); proxy.GetTerminalAlarm("123123", 10);
运行代码出现如下异常:
由于证书是使用信任链模式对进行认证的,如果证书不收信,将导致以上异常。解决办法如下:
1、将证书导入“受信任根证书颁发机构”,如下图:
在上图的导入窗口中操作后,客户端调用就不会有以上异常。
2、在C#客户端调用时,可以通过代码回调证书的认证方式:
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyError) => true ; var proxy = new TerminalClient(); proxy.GetTerminalAlarm( "123123" , 10); |
参考:
http://www.cnblogs.com/artech/archive/2011/06/02/Authentication_042.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构