最近在学习WCF X.509证书验证,想实现使用证书实现服务端和客户端的双向认证,实现原理是利用了数字证书包含的一对非对称密钥来实现数字签名及加密。所谓非对称密钥是采用两个密钥将加密和解密能力分开:一个公钥和一个私钥,公钥可解密私钥加密的信息,私钥也可以解密公钥加密的信息,前者用于数字签名后者用于信息加密,但从一个密钥是不可能分析出另一个密钥。利用非对称密钥的特点,我们将私钥签名的证书安装在服务端,把公钥签名的证书放在客户端,就可以实现使用证书实现服务端和客户端的双向认证。具体步骤如下:

【1】制作证书

(1) 需要创建一个证书作为证书认证中心(CA)的根证书,它用来签名所有在该CA注册的其他证书。这里使用makecert 工具:Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 命令提示行。在Visual Studio命令窗口输入以下命令创建证书

 makecert -n "CN=WCFRootCA" -r -sv WCFRootCA.pvk WCFRootCA.cer.  

生成证书时会提示设置私钥密码,这个密码是证书启用、导出、导入时的保护密码,为了防止其他人以不法手段窃取钥匙。我这里设置成WCF1234.

  相关命令参数含义可以在命令窗口输入:makecert查看。制作的证.书中扩展名为.cer的文件是公钥,而.pvk文件则是私钥;还有一种以.pfx为扩展名的文件是密钥交换文件包含公钥和私钥。

接着,将根证书分别安装到服务端和客户端的计算机上。运行“mmc”命令添加证书单元,在受信任的根证书颁发机构节点下的证书节点导入根证书,根证书就安装完毕了。

  (2) 将 WCFRootCA 安装的服务器和客户机上

运行“mmc”命令添加证书单元,将证书WCFRootCA.cer安装在本地计算机(Local Machine)—>受信任的根证书颁发机构(Trusted Root Certification Authorities)中。

  (3) 在服务器和客户端上创建并安装服务证书  

   因为要采用双向认证,所以服务端和客户端都各需要一个证书,通过下列命令创建一个由根证书签名的服务端证书:

  makecert -sk AutoWCF -iv WCFRootCA.pvk -n "CN=WCFServer" -ic WCFRootCA.cer -sr localmachine -ss my -sky exchange -pe WCFServer.cer

  执行这个命令后,服务证书WCFServer.cer被安装到“本地计算机(Local Machine)—>个人(Personal)中

注意:-sk 指定主题的密钥容器位置,该位置包含私钥。如果密钥容器不存在,系统将创建一个,但每个证书的密钥容器时唯一的。

客户端证书创建命令与其相似。

注意:导出客户端证书时要选择不导出私钥。这样私钥只留在服务端。

  最后,还需要给WCF进程访问服务端证书私钥的权利。可以通过运行下列命令实现:

  FindPrivateKey.exe My LocalMachine –n "CN= WCFServer "

  【2】配置文件编写

  证书设置完成后就可以来配置所选用的安全策略了,WCF既可以使用代码完成也可以通过配置文件完成。使用配置文件配置结构清晰,易于修改,所以此例采用这种方式。

    使用消息安全模式,客户端采用证书身份验证策略,证书验证方式配置信息如下

  <bindings>
<wsHttpBinding>
<binding name="BindingConfigration">
<security mode="Message">
<transport clientCredentialType="None"/>
<message clientCredentialType="Certificate" negotiateServiceCredential="true" establishSecurityContext="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>

这个配置要应用到服务的终结点配置上才会生效。除此之外,还要在服务行为中配置使用证书的相关信息。

<behaviors>
<serviceBehaviors>
<behavior name="WCFService.WCFServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<serviceCertificate storeName="My" x509FindType="FindBySubjectName" findValue="WCFServer" storeLocation="LocalMachine"/>
</serviceCredentials>
</behavior>

 这里指定了服务端证书的查找位置和查找条件。将此配置信息应用到服务,服务端的安全配置就算完成了。客户端配置与之相似,也要配置绑定和终结点服务行为。终结点服务行为中的证书设置应与客户端证书相关信息相符。

<behaviors>
<endpointBehaviors>
<behavior name="endpointBehavior">
<clientCredentials>
<clientCertificate storeName="My"
x509FindType="FindBySubjectName"
findValue="WCFClient"
storeLocation="CurrentUser"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>

WCF X.509证书双向认证小结的更多相关文章

  1. nginx_ssl证书双向认证以及负载均衡配置

    #user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log notice;#error_l ...

  2. Keytool配置 Tomcat的HTTPS双向认证

    Keytool配置 Tomcat的HTTPS双向认证 证书生成 keytool 简介 Keytool是一个Java数据证书的管理工具, Keytool将密钥(key)和证书(certificates) ...

  3. 基于SSL协议的双向认证 - 数字证书 [2]

    1.1    数字证书 1.1.1   概念理解 一种文件的名称,例如一个机构或人的签名,能够证明这个机构或人的真实性.简而言之数字证书是一种网络上证明持有者身份的文件,同时还包括有公钥.证书是由国际 ...

  4. SSL使用windows证书库中证书实现双向认证

    前一段时间对OpenSSL库中的SSL通讯稍微琢磨了一下,在百度文库中找了个示例程序,然后在机器上跑,哇塞,运行成功!那时那个惊喜啊,SSL蛮简单的嘛.前几天,老板要我整一个SSL通讯,要使用wind ...

  5. Tomcat服务器配置https双向认证(使用keytool生成证书)

    一,HTTPS原理   1,HTTP.HTTPS.SSL.TLS介绍与相互关系 (1)HTTP:平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的(明文),因此使用HTTP协议传输隐私 ...

  6. openssl实现双向认证教程(服务端代码+客户端代码+证书生成)

    一.背景说明 1.1 面临问题 最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击. <信息安全工程>中接触过 ...

  7. CA双向认证的时候,如果一开始下载的证书就有问题的,怎么保证以后的交易没有问题?

    研究HTTPS协议的时候,发现网站的CA认证,比如建行,比如支付宝,需要首先下载数字证书, 当然有些其他的双向认证,比如之前做过的港航和JP MORGAN进行交互的时候,证书是私下发送的,不需要去公网 ...

  8. https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL_转

    转自:https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL 因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料, 这里做一个总结. 1. 首 ...

  9. linux下Tomcat+OpenSSL配置单向&双向认证(自制证书)

    背景 由于ios将在2017年1月1日起强制实施ATS安全策略,所有通讯必须使用https传输,本文只针对自制证书,但目前尚不确定自制证书是否能通过appstore审核. 1.必须支持传输层安全(TL ...

随机推荐

  1. TCP/UDP区别&&心跳包机制【转】

    转自:https://www.jianshu.com/p/6d93a3c21c34 UDP:用户数据报协议:主要用在实时性要求比较高的以及对质量相对较弱的地方.但是面对现在高质量的线路不会容易丢包,除 ...

  2. COM和.NET的互操作

    组件对象模型的基本知识         基于构件的软件开发日益流行,这里我吧自己在学校时整理的关于COM的一些东西献给大家,供初学者参考.一.组件(COM),是微软公司为了计算机工业的软件生产更加符合 ...

  3. [golang note] 环境搭建

    LiteIDE(windows) • golang安装 ▶ 下载对应操作系统的版本并安装,下载地址:http://www.golangtc.com/download,譬如这里下载的是go1.6.win ...

  4. mysql innodb 行级锁升级

    创建数据表test,表定义如下所示: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NO ...

  5. 【linux】shell中命令替换$(cmd)和符号`cmd`

    来源:https://zhidao.baidu.com/question/485498670.html 作用: $(cmd)和`cmd`的作用是相同的,在执行一条命令时,会先将其中的 ``,或者是$( ...

  6. Java abstract 关键字

    abstract是声明抽象类和抽象方法的关键字 包含抽象方法的类叫抽象类,如果一个类中包含一个或多个抽象方法,该类必须被限定为抽象的,否则编译器会报错,抽象类不可创建对象,创建抽象类的对象编译器会报错 ...

  7. KnockoutJs学习笔记(十一)

    enable binding往往作用于form elements,比如input.select和textarea等.包含enable binding的DOM元素会依照enable binding参数的 ...

  8. form表单自动提交

    form表单提交是web项目中经常遇到的,但是如果form中只有一个input为text类型的输入框时, 需要格外注意,因为这时候只要你按下回车键,form表单就会自动提交,这是form表单的一个特性 ...

  9. hadoop日志数据分析开发步骤及代码

    日志数据分析:1.背景1.1 hm论坛日志,数据分为两部分组成,原来是一个大文件,是56GB:以后每天生成一个文件,大约是150-200MB之间:1.2 日志格式是apache common日志格式: ...

  10. P1855 榨取kkksc03 二维费用背包

    Kkksc03的时间和金钱是有限的,所以他很难满足所有同学的愿望.所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望? 输入输出格式 输入格式: 第一行,n M T,表示一共有n(n<= ...