1      SSL双向认证的实现

这里是基于SSL和Tomcat配置实现的,配置方法如下:

1.1    生成CA数字证书

首先需要配置OPENSSL环境变量。

我的OPENSSL配置文件路径是“D:\OpenSSL-Win32\bin\openssl.cfg”。


1.1.1  生成CA私钥

Ø  说明:

CA作为一个权威机构,他本身也是使用证书来标识自己,CA本身也拥有私钥。在签发数字证书的过程中,CA的私钥主要用于加密用户证书请求中的用户信息及公钥。

Ø  命令:

openssl genrsa -out d:\ca\ca-key.pem 1024

Ø  运行结果:

Ø  运行结果:

该命令会产生长度为1024字节的私钥文件“ca-key.pem”。

1.1.1  生成CA证书请求文件

Ø  说明:

创建CertificateSecure Request证书请求文件。

Ø  命令:

openssl req -new -out d:\ca\ca-req.csr -key d:\ca\ca-key.pem -config D:\OpenSSL-Win32\bin\openssl.cfg

Ø  运行结果:

Ø  运行结果:

生成CSR文件“ca-req.csr”

Ø  注意:

在生成过程中,“CommonName (e.g. server FQDN or YOUR name) []:”需要输入你所希望的根证书颁发结构名称,如BOCHAO字样等。

1.1.1  生成CA证书自签名文件

Ø  说明:

使用CA私钥“ca-key.pem”文件对“ca-req.csr”请求文件签名。

Ø  命令:

openssl x509 -req -in d:\ca\ca-req.csr -out d:\ca\ca-cert.pem -signkey d:\ca\ca-key.pem -days 365

Ø  运行结果:

生成自签名CA证书文件“ca-cert.pem”文件,“ca-cert.pem”文件即为CA根证书,可将其下发到客户端,作为根证书导入。

1.1.1  生成CA证书浏览器支持格式

Ø  说明:

生成Windows下浏览器支持的CA根证书文件“CARoot.cer”。

Ø  命令:

openssl x509 -in d:\ca\ca-cert.pem -inform PEM -out D:\ca\CARoot.cer -outform DER

Ø  运行结果:

生成了“CARoot.cer”文件为“cer”格式的CA根证书文件。

1.1    生成服务器证书库

服务器证书和客户端证书生成略有不同,这是由于服务器对证书格式与客户端证书格式要求不同导致,对于Tomcat、WebLogic、WebSphere服务器通常需要一种JKS格式的文件,在该文件中,保存有服务器私钥、服务器证书(公钥)以及服务器根证书链(从RootCA一直到服务器证书颁发机构的一系列CA证书列表)。

1.1.1  创建服务器证书库

Ø  说明:

为了保证证书的真实性,需要给证书签名,通常这个是由第三方的CA(Certification Authentication)来签发,这里我们使用自签名的证书。

(1). 此命令在当前目录下生成一个密钥库文件“fspdrs-server.jks”,该密钥库文件密码为“password”

(2). 此命令还产生一个密钥对(其私钥别名为“serverkey”)和一个包含公钥信息的证书,证书的主题信息为“CN=192.168.2.38,OU=博超,O=博超,L=北京,ST=北京市,c=zh”,同时,该证书由私钥签名。

(3). 证书跟私钥绑定形成了一条密钥实体存储在“fspdrs-server.jks”文件中,可以通过别名“serverkey”来访问证书。

Ø  命令:

keytool -genkey -alias serverkey -keystore d:\ca\fspdrs-server.jks -keyalg RSA -dname "CN=192.168.2.38,OU=博超,O=博超,L=北京,ST=北京市,c=zh" -storepass password -keypass password

Ø  运行结果

生成了“fspdrs-server.jks”文件。

Ø  注意:

(1). 在输入上述的“名字与姓氏”时,需要注意所输入的值应该与服务器IP或者域名一致,否则在客户端验证服务器证书时会认为该证书与指定的服务器实体不匹配,如果是IE就会弹出一个窗口提示用户是否信任该证书。

(2). 这里要求“keystore”和“certificate”的密码一致,这是Tomcat的约束。

1.1.1.1 创建服务器证书库的CSR文件

Ø  说明:

生成服务器证书的请求文件为“server.csr”。把该请求文件发送给证书颁发机构,该机构将会验证请求中的实体信息,然后实现签证,因为我们自己做了CA,所以签证这一步也是我们自己来做。

Ø  命令:

keytool -certreq -alias serverkey -sigalg MD5withRSA -file d:\ca\server.csr -keypass password -keystore d:\ca\fspdrs-server.jks -storepass password

Ø  运行结果:

生成服务器端证书的CSR请求文件“server.csr”。

1.1.1.1 使用CA来签发服务器证书库请求文件

Ø  说明:

使用我们自制的CA数字证书来签发服务器根证书请求文件。

Ø  命令:

openssl x509 -req -in d:\ca\server.csr -out d:\ca\server-cert.pem -CA d:\ca\ca-cert.pem -CAkey d:\ca\ca-key.pem -CAserial d:\ca\ca-cert.srl -CAcreateserial -days 365

Ø  运行结果:

生成CA签发的根证书文件“server-cert.pem”,和在签发中生成一个CA的“ca-cert.srl”文件。

1.1.1  将CA证书导入到服务器证书库文件中。

Ø  说明:

将CA证书的“ca-cert.pem”文件导入到服务器证书库(密钥库中)“fspdrs-server.jks”文件中。

Ø  命令:

keytool -importcert -alias RootCA -v -file d:\ca\ca-cert.pem -keystore d:\ca\fspdrs-server.jks -storepass password

Ø  运行结果:

1.1.1  将CA签发的服务器请求文件导入服务器证书库(密钥库)文件中。

Ø  说明:

将CA签发的服务器端证书“server-cert.pem”导入服务器端根证书(密钥库)“fspdrs-server.jks”中。

Ø  命令:

keytool -importcert -alias serverkey -v -file d:\ca\server-cert.pem -keystore d:\ca\fspdrs-server.jks -storepass password

Ø  执行结果:

Ø  注意:

(1). 首先导入CA根证书链,最后导入服务器根证书。

(2). 导入服务器时的别名必须与生成JKS库时的别名相同一致。

1.1.1  查看服务器端根证书库文件

Ø  说明:

查看服务器证书库(密钥库)证书文件。

Ø  命令:

keytool -list -v -keystore d:\ca\fspdrs-server.jks -storepass password

1.1    生成客户端证书

客户端证书可以使用OPENSSL来制作也可以是用KEYTOOL来制作,使用KEYTOOL比较麻烦,而且签证必须由OPENSSL来制作,所以这里全部使用OPENSSL来制作。

1.1.1  生成客户端证书

Ø  说明:

生成一个客户端证书,例如为DCZ用户生成一个客户端证书。

Ø  命令:

openssl genrsa -out d:\ca\dcz\DCZ-key.pem 1024

Ø  运行结果:

在当前目录中会生成一个“DCZ-key.pem”文件。

1.1.1  生成客户证书请求文件

Ø  说明:

生成“DCZ-key.pem”客户端证书请求文件“DCZ-req.csr”文件。

Ø  命令:

openssl req -new -out d:\ca\dcz\DCZ-req.csr -key d:\ca\dcz\DCZ-key.pem -config D:\OpenSSL-Win32\bin\openssl.cfg

Ø  运行结果:

生成过程中如果不是必须填写的项目,可以直接使用“.”表示忽略该字段。

1.1.1  使用CA证书来签发CSR文件“DCZ-req.csr”

Ø  说明:

生成CA签发的客户端证书“DCZ-cert.perm”文件。

Ø  命令:

openssl x509 -req -in d:\ca\dcz\DCZ-req.csr -out d:\ca\dcz\DCZ-cert.pem -signkey d:\ca\dcz\DCZ-key.pem -CA d:\ca\ca-cert.pem -CAkey d:\ca\ca-key.pem -CAcreateserial -days 365

Ø  运行结果:

生成CA签发的客户端证书“DCZ-cert.pem”文件。

1.1.1  生成客户端证书的其它格式

Ø  说明:

这步把客户端证书(公钥)与私钥捆绑在一起,生成DCZ.pfx文件,该文件连同CA根证书一起发送给客户。

导入客户端证书为浏览器支持的.PFX格式的证书DCZ.pfx文件。

Ø  命令:

openssl  pkcs12 -export -clcerts -in d:\ca\dcz\DCZ-cert.pem -inkey d:\ca\dcz\DCZ-key.pem -out d:\ca\dcz\DCZ.pfx -password pass:DCZpassword

Ø  运行结果:

生成“DCZ.pfx”客户端证书文件。

1.1    配置双向认证服务器

1.1.1 配置SSL的Tomcat双向认证服务器

找到你要配置的Tomcat服务器,进到根目录conf下,直接编辑server.xml文件,找到文件中的这段代码,实际上它是被注释的。

<!-- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />-->

我们上面这段代码注释打开,并修改为如下:

<Connector port="16001"
SSLEnabled="true"
clientAuth="true"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
compression="on"
compressionMinSize="2048"
keystoreFile="conf\certificate\fspdrs-server.jks"
keystorePass="password"
maxThreads="150"
noCompressionUserAgents="gozilla, traviata"
protocol="org.apache.coyote.http11.Http11NioProtocol"
scheme="https"
secure="true"
sslProtocol="TLS"
truststoreFile="conf\certificate\fspdrs-server.jks"
truststorePass="password"/>

将我们生成的证书中的“fspdrs-server.jks”服务器证书库文件放入上面代码指定的路径下。

好,修改完毕,保存退出,直接启动Tomcat等待连接测试。

1.1.1 安装客户端证书

(1). 导入CA证书文件:

点击导入按钮,找到我们生成的CARoot.cer浏览器支持的格式文件:

导入成功会出现如下提示:

点击“是”即可安装成功,安装成功后会在浏览器的“受信任的根证书颁发机构”中发现安装的CA证书。

(2). 安装客户证书

这里我为自己生成了一个客户端证书“DCZ.pfx”,直接双击该文件即可安装:

点击“下一步”:

输入我们生成证书的密码:

点击“下一步”:

至此,完成所有的操作。

下面去浏览器中直接输入https://192.168.2.38:16001/看看有何反应:

在浏览器访问安全的链接时候会弹出上面证书确认弹框,说明配置成功,至此全部配置完毕!

基于SSL协议的双向认证 - 双向认证 [3]的更多相关文章

  1. 基于SSL协议的双向认证 - SSL协议 [1]

    1  概要说明 在互联网通信方式中,目前用的最广泛的是HTTPS配合SSL和数字证书来保证传输和认证安全了. 2  详细介绍 2.1    HTTPS HTTPS全称:Hypertext Transf ...

  2. 如何让你的传输更安全--基于SSL协议的通信模式

    之前发表在另一个平台的文章http://www.jointforce.com/jfperiodical/article/1218,现在发表到自己的博客上. 对于SSL/TLS协议,如果要每个开发者都自 ...

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

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

  4. 【转】SSL协议、SET协议、HTTPS简介

    一.SSL协议简介 SSL是Secure Socket Layer的缩写,中文名为安全套接层协议层.使用该协议后,您提交的所有数据会首先加密后,再提交到网易邮箱,从而可以有效防止黑客盗取您的用户名.密 ...

  5. open-falcon之使用mail-provider发邮件(支持smtp SSL协议)

    一.首先确定go语言安装环境配置好 1.进入官网下载源码包 https://golang.org/dl/ 2.解压缩,配置环境变量 在/etc/profile最后加上export PATH=$PATH ...

  6. HTTPS 中双向认证SSL 协议的具体过程

    HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器.② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.③ 客户浏览器检查服务器送 ...

  7. 基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证

    基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证 摘自:https://blog.csdn.net/ty1121466568/article/details/811184 ...

  8. mosquitto ---SSL/TLS 单向认证+双向认证

    生成证书 # * Redistributions in binary form must reproduce the above copyright #   notice, this list of ...

  9. 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good

    上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...

随机推荐

  1. zabbix 3.0快速安装简介(centos 6)

    zabbix快速安装 系统版本:centos 6 1.yum源配置和zabbix.msyql安装 rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3. ...

  2. jQuery小技巧

    1. 禁止右键点击 $(document).bind("contextmenu",function(e){ return false; }); 2.隐藏搜索文本框文字 $(docu ...

  3. idea community 配置已有的scala工程

  4. centos 6.4 系统代理上网 设置

    前面讲了yum 代理设置上网的方法,现在设置一下系统代理上网, 网上很多都不管用,已亲测管用 [root@proxy ~]# cat .bash_profile #root目下添加代理上网,蓝色代码# ...

  5. SortedMap接口

    SortedMap接口是排序接口,只要是实现了此接口的子类,都属于排序的子类,TreeMap也是此接口的一个子类. import java.util.Map; import java.util.Sor ...

  6. Eratosthenes筛选法构造1-n 素数表

    筛选法:对于不超过n的每个非负整数p,删除2p,3p,4p...当处理完所有数之后,还没没删除的就是素数. 代码中进行了相应的优化. 本代码功能,输入一个数,输出从1-该数之间的素数.功能待完善,可将 ...

  7. 【转】【Java】利用反射技术,实现对类的私有方法、变量访问

    java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...

  8. OC-self关键字

    self关键字 1. 成员变量和局部变量同名 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量 用self访问成员变量,区分同名的局部变量 2.使用细节 1)     出现的地方:所有的OC ...

  9. p命名空间的使用(不推荐用)

    xmlns:p="http://www.springframework.org/schema/p" p:没有xsd文件,直接加上面那句就好了 <!-- singleton和p ...

  10. java中跳出if判断

    今天学到的一点儿新东西一个if判断里面有好多东西,紧接着还有其他代码,不能使用return来结束这个if判断这时候,就需要这样: out:if (!"null".equals(re ...