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

时间:2021-02-06 21:19:47

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

Ø  运行结果:

基于SSL协议的双向认证 - 双向认证 [3]Ø  运行结果:

该命令会产生长度为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

Ø  运行结果:

基于SSL协议的双向认证 - 双向认证 [3]Ø  运行结果:

生成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

Ø  运行结果:

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

生成自签名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

Ø  运行结果:

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

生成了“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

Ø  运行结果

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

生成了“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

Ø  运行结果:

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

生成服务器端证书的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

Ø  运行结果:

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

生成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

Ø  运行结果:

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

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

Ø  执行结果:

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

Ø  注意:

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

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

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

Ø  说明:

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

Ø  命令:

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

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

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

1.1    生成客户端证书

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

1.1.1  生成客户端证书

Ø  说明:

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

Ø  命令:

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

Ø  运行结果:

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

在当前目录中会生成一个“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

Ø  运行结果:

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

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

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

Ø  运行结果:

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

生成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

Ø  运行结果:

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

生成“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证书文件:

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

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

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

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

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

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

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

(2). 安装客户证书

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

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

点击“下一步”:

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

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

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

点击“下一步”:

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

至此,完成所有的操作。

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

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

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