[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[HTTPS]

简介:

上一篇演示的是绑定类型为NetTcpBinding情况下基于TLS/SSL的Transport安全模式的实现,接下来我们改用另外一种绑定:WS2007HttpBinding。对于基于HTTP的绑定,Transport安全模式的实现方式又根据寄宿方式的不同而具有一定的差异,我们首先来介绍自我寄宿的方式。

一、自我寄宿(Self-Hosting)

无论对于HTTPS还是SSL Via TCP,服务端都需要绑定一个证书。对于采用后者的NetTcpBinding,我们是通过ServiceCredentials这个服务行为来进行证书设置的。但是对于HTTPS,我们需要通过相应的命令行工具将一个X.509证书绑定到相应的端口。而这个工具的选择依赖于机器的操作系统,对于Windows XP和Windows 2003,该命令行工具为httpcfg.exe,而对应之后的版本,则是netsh.exe。关于如何通过httpcfg.exe和netsh.exe为端口设置SSL证书,你可以参考:http://msdn.microsoft.com/zh-cn/library/ms733791.aspx

httpcfg.exe和netsh.exe均是通过证书的指纹(thumbprint)来关联具体的证书的,在这里具有全局唯一特性的指纹可以看成是证书的唯一标识。我们之前已经通过MakeCert命令行创建了一个主题为Jinnan-PC的证书,我们现在重用该证书。你可以通过MMC的证书管理单元来查看证书的指纹,并将其拷贝到写字板上(比如指纹为:‎f332bf17db3abb8f9a9a2694ba2c75da701bef0f),然后根据操作系统的不同分别执行httpcfg.exe和netsh.exe命令行,为端口3721进行SSL证书的设置,你可以将任意有效的GUID作为appid的参数。

httpcfg set ssl -i 0.0.0.0:3721 -h f332bf17db3abb8f9a9a2694ba2c75da701bef0f
OR
netsh http add sslcert ipport=0.0.0.0:3721 certhash= f332bf17db3abb8f9a9a2694ba2c75da701bef0f
  appid={CFA5621F-CD55-4009-AD7E-51EDDAEC5786}

接下来我们将服务寄宿配置替换成如下的形式。从配置中我们可以看出,寄宿服务的唯一终结点采用了被设置成Transport模式,客户端凭证类型为None的WS2007HttpBinding。地址被设置成https://Jinan-PC:3721/calculatorservice,3721正式上面我们进行SSL证书设置的端口。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
  <bindings>
    <ws2007HttpBinding>
      <binding name="transportWS2007HttpBinding">
        <security mode="Transport">
          <transport clientCredentialType="None"/>
        </security>
      </binding>
    </ws2007HttpBinding>      
  </bindings>
  <services>
    <service name="Artech.WcfServices.Services.CalculatorService">
      <endpoint address="https://Jinnan-PC:3721/calculatorservice" binding="ws2007HttpBinding" bindingConfiguration="transportWS2007HttpBinding" 
contract="Artech.WcfServices.Contracts.ICalculator" />
    </service>
  </services>
  </system.serviceModel>
</configuration>

客户端的配置和编程同样进行相应的修改,具有与服务端相同的绑定设置。具体的配置和服务调用程序如下所示。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <ws2007HttpBinding>
        <binding name="transportWS2007HttpBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </ws2007HttpBinding>
    </bindings>
    <client>
      <endpoint name="calculatorService" address="https://Jinnan-PC:3721/calculatorservice" binding="ws2007HttpBinding" 
bindingConfiguration="transportWS2007HttpBinding" contract="Artech.WcfServices.Contracts.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

服务调用程序:

using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
{
    ICalculator calculator = channelFactory.CreateChannel();
    Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2)); ;
}

然后我们运行程序,你会发现如下图所示的SecurityNegotiationException异常在服务调用过程中被抛出,并提示“无法为SSL/TLS 安全通道与颁发机构“jinnan-pc:3721”建立信任关系”。抛出异常的原因和之前一致:证书不受信任,因为HTTPS在默认的情况下依然采用ChainTrust认证模式

image

如果证书是官方机构颁发,你可以将CA证书导入到“受信任根证书颁发机构”存储区来解决这个问题。但是由于对于我们这个测试程序来说,你需要需求另外的办法,也就是改变客户端对SSL证书的认证方式。不过这与采用NetTcpBinding时通过终结点行为ClientCredentials来设置服务证书认证模式的方式有所不同,这里需要采用另外一种方式。你需要通过注册ServicePointManager静态ServerCertificateValidationCallback回调自定义证书认证方式,ServerCertificateValidationCallback回调在ServicePointManager中的定义如下面的代码片断所示。

   1: public class ServicePointManager
   2: {
   3:     //其他成员
   4:     public static RemoteCertificateValidationCallback ServerCertificateValidationCallback { get; set; }
   5: }
   6: public delegate bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, 
   7: X509Chain chain, SslPolicyErrors sslPolicyErrors);

在下面给出的代码片断中,我通过在进行服务调用之前通过注册ServerCertificateValidationCallback回调的方式来忽略掉对SSL证书的认证,就可以抑制SecurityNegotiationException异常的抛出。

   1: ServicePointManager.ServerCertificateValidationCallback+=( sender,  certificate,  chain,  sslPolicyErrors)=>true;
   2: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
   3: {
   4:     ICalculator calculator = channelFactory.CreateChannel();
   5:     Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2)); ;
   6: }

对于SSL证书的认证,还有一点需要说明的是:在默认的情况下,客户端除了采用ChainTrust模式对证书进行认证之外,还具有一个认证规则,那就是要求终结点地址的DNS和证书的主体名称相匹配。以我们创建的这个程序为例,如果我们将客户端配置文件中的终结点地址从https://Jinnan-PC:3721/calculatorservice替换成https://localhost:3721/calculatorservice,在进行服务调用的时候会抛出SecurityNegotiationException异常。

二、IIS寄宿

最后我们来演示IIS寄宿方式。如果你的IIS中没有一个SSL站点,你需要手工创建。所有先来演示一样如何在你的IIS中创建一个SSL站点,这里以IIS 7.5为例。

当你开启了IIS管理器之后,点击左侧边栏的“应用程序池(Application Pool)”结点,打开应用程序池列表界面。然后通过右击弹出上下文菜单,并选择“添加应用程序池(Add Application Pool)”菜单项,打开添加应用程序池对话框。设置添加的应用程序池的名称(比如“DefaultSSLAppPool”),选择.NET版本(.NET Framework 4.0.30319)和托管管道模式(Integrated)。点击确认后,新的应用程序池被创建出来。

接下来我们需要创建使用这个应用程序池的SSL站点。右击“站点(Sites)”结点,选择“添加Web站点(Add Web Site)”菜单项,进入添加Web站点对话框。在该对话框中设置新建站点的名称(Default SSL Web Site),选择刚刚创建的应用程序池(DefaultSSLAppPool),并为站点设置一个本地的物理路径。在绑定类型列表中选择https,保持IP地址和端口的默认值。在SSL证书下拉框中你会看到我们之前创建的证书(Jinnan-PC),选择它作为站点的SSL证书。点击确认按钮后,新的站点被创建出来。

SSL站点被成功创建之后,你需要在该站点中创建一个应用程序,起名为WcfServices,并将物理地址影射为解决方案中Services项目的根目录。然后你需要对Services项目的“生成(Build)”进行相应的设置,将编译后的目标目录从默认的“\bin\debug”改成“\bin”,以确保项目编译后的程序集被生成到bin目录下。

IIS寄宿需要为服务创建相应的.svc文件,此时你直接在Services项目中添加一个文本文件,起名为CalculatorService.svc,并为其添加如下的内容。

   1: <%@ ServiceHost Service="Artech.WcfServices.Services.CalculatorService" %>

在这之后,同样在Services项目中添加一个Web.config文件,定义如下一段服务寄宿的配置。在这段配置中,除了无需指定终结点地址之外,其他所有的配置与通过自我寄宿方式别无二致。

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:   <system.serviceModel>
   4:     <bindings>
   5:       <ws2007HttpBinding>
   6:         <binding name="transportWS2007HttpBinding">
   7:           <security mode="Transport">
   8:             <transport clientCredentialType="None"/>
   9:           </security>
  10:         </binding>
  11:       </ws2007HttpBinding>
  12:     </bindings>
  13:     <services>
  14:       <service name="Artech.WcfServices.Services.CalculatorService">
  15:         <endpoint binding="ws2007HttpBinding" bindingConfiguration="transportWS2007HttpBinding" 
  16: contract="Artech.WcfServices.Contracts.ICalculator" />
  17:       </service>
  18:     </services>
  19:   </system.serviceModel>
  20: </configuration>

至此服务寄宿方面的工作已经完毕,你只需要在Client项目中的配置中修改一下终结点地址(https://Jinnan-PC/WcfServices/CalculatorService.svc)就能直接执行你的程序。


作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
目录
打赏
0
0
0
0
16429
分享
相关文章
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
SSL/TLS证书**是一种用于加密网络通信的数字证书
SSL/TLS证书**是一种用于加密网络通信的数字证书
212 6
SSL/TLS:构建数字世界的加密长城
**协议演进:从网景实验室到全球标准** 1994年,网景公司推出SSL协议,首次实现40位密钥加密传输,开启网络安全新纪元。此后,SSL 3.0、TLS 1.0相继问世,至2018年TLS 1.3将握手速度提升60%,强制前向加密确保历史会话安全。TLS协议通过非对称加密、对称加密和证书信任链等多层架构保障通信安全。2014年POODLE漏洞促使全行业禁用SSL 3.0,催生防降级机制。
SSL/TLS:互联网通信的加密基石与安全实践
**简介:** 在数字化时代,互联网每天传输海量敏感数据,网络攻击频发。SSL/TLS协议作为网络安全的基石,通过加密技术确保数据安全传输。本文解析SSL/TLS的技术架构、密码学原理、应用场景及常见误区,探讨其在未来的发展趋势,强调持续演进以应对新型威胁的重要性。 SSL/TLS不仅保障Web安全,还广泛应用于API、邮件、物联网等领域,并遵循合规标准如PCI DSS和GDPR。
HTTPS与SSL证书的关系
**HTTPS 与 SSL 证书:安全通信的基石** 在互联网时代,网络安全至关重要。HTTPS 和 SSL 证书是保障网站安全通信的关键。HTTPS 是 HTTP 的安全版本,通过 SSL/TLS 协议加密数据,防止窃取和篡改。SSL 证书用于验证网站身份并加密通信,包含域名、CA、公钥等信息。两者共同确保数据加密、身份验证,提升用户信任度,并有助于 SEO 优化。部署 HTTPS 和 SSL 证书是提升网站安全性和用户体验的必要措施。
IP 地址,包括 IPv6 怎么申请 SSL证书来实现 https
很多企业单位已经开始在使用 IPv6 资源,跟 IPv4 一样,IPv6也是需要SSL证书的。在目前的SSL证书品牌,KeepTrust 是可以支持 IPv6 地址的。跟普通IP地址一样,给IPv6签发SSL证书也是需要验证申请者对 IP 地址的管理权限的。如果是 OV 版,还需要验证组织信息的真实性。
SSL/TLS协议是什么?
SSL/TLS协议是什么?
355 57
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
1421 8
内网ip申请SSL证书实现https访问
内网IP地址虽不能直接申请公网SSL证书,但可通过IP SSL证书保障数据安全。流程包括:确定固定内网IP,选择支持内网IP的CA,注册申请证书,生成CSR,验证IP所有权,下载部署证书至Web服务器,测试HTTPS访问,确保配置正确及证书有效。此方法适用于内网环境,提升数据传输安全性。
内网ip申请SSL证书实现https访问
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
114 11

热门文章

最新文章