基于openssl、tomcat 7、Axis2的双向CA认证方案以及Java客户端调用
程序员文章站
2022-06-16 14:27:41
...
文章只是笔者试验的一些笔记,前半部分的内容主要参考 http://kyfxbl.iteye.com/blog/1910891 博客,然而文章还包括与tomcat的集成与Axis2的集成,另外还包括Java作为客户端如何调用?遇到的种种问题,但内容现在还没有这么全,由于时间原因,日后补充!
文章待整理。。。。。。!
目录准备:
1、mkdir private
2、mkdir certificates
一、签发CA根证书和私钥
1、创建CA秘钥
openssl genrsa -aes256 -out private/ca.key.pem 2048
秘钥密码:a1234567
2、创建CA签名请求文件
openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=KH/ST=PHNOM PENH/L=PHNOM PENH/O=supernet/OU=supernet/CN=*.supernet.com.kh"
提示输入秘钥的密码
提交一些组织信息DN,CN比较重要,因为里面含有域名信息,访问时必须是匹配的才能访问
3、签发CA根证书
openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certificates/ca.cer
4、把根证书从PEM编码转为PKCS编码
openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certificates/ca.cer -out certificates/ca.p12
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
有些浏览器不支持PEM格式编码的证书,JAVA也不支持,因此转换成PKCS的p12文件。
二、签发服务器端证书
1、创建服务器端私钥
openssl genrsa -aes256 -out private/server.key.pem 2048
私钥密码:a1234567
2、创建服务器端证书签发请求
openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=KH/ST=PHNOM PENH/L=PHNOM PENH/O=supernet/OU=supernet/CN=boss.supernet.com.kh"
CN现在是一个具体的网站
3、利用CA根证书,签发服务端证书
openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certificates/server.cer
4、转换成p12的格式
openssl pkcs12 -export -cacerts -inkey private/server.key.pem -in certificates/server.cer -out certificates/server.p12
以上两步骤已经可以完成SSL单向验证了。可以配置tomcat下得conf/server.xml,
当通过浏览器访问时需要注意:
1、配置Hosts域名,否则浏览器会给与警告
2、此时还是报警告,提示证书不被信息的机构所颁发,导入CA根证书,ca.cer,然而导入之后还是警告,在mac下chrome还需要设置证书的信任机制,加密套接字协议层(SSL): 始终信任,设置以后在访问,就不会看到错误图标
<Connector SSLEnabled="true" acceptCount="100"
disableUploadTimeout="true" enableLookups="false"
maxThreads="25" port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
scheme=“https" secure="true" sslProtocol="TLS"keystoreFile="/Users/killer/Downloads/SignedCerts/v9/certificates/server.p12"
keystorePass="a1234567"
keystoreType="PKCS12"
// false为单向,true为双向
clientAuth="false"
truststoreFile="/Users/killer/Downloads/SignedCerts/v8/server.keystore"
truststorePass="a1234567"
truststoreType="JKS"
>
</Connector>
三、签发客户端证书
1、生成客户端证书私钥
openssl genrsa -aes256 -out private/client.key.pem 2048
2、创建客户端证书签发申请
openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=KH/ST=PHNOM PENH/L=PHNOM PENH/O=supernet/OU=supernet/CN=supernet boss user"
3、利用CA根证书,签发客户端证书
openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/client.csr -out certificates/client.cer
4、把客户端证书转换成p12格式
openssl pkcs12 -export -clcerts -inkey private/client.key.pem -in certificates/client.cer -out certificates/client.p12
证书生成成功,接下来可以配置双向验证,配置tomcat ssl,conf/server.xml,配置如下,这里使用根证书充当服务器验证客户端发送过来的客户端证书
clientAuth="true"
truststoreFile="/Users/killer/Downloads/SignedCerts/v9/certificates/ca.p12"
truststorePass="a1234567"
truststoreType="PKCS12"
注意:这里只有老版本的chrome会提示SSL 错误,“无法与服务器建立安全连接,可能是服务器出现了问题,也可能是您没有服务器要求的客户端证书”
其它浏览器版本都是,“安全连接失败,连接被中断”。
接下来客户端浏览器安装client.p12文件,因为都是同一个根证书所签发的证书,因此只要安装client.p12就能通过校验。导入至个人证书,firefox下是“您的证书”,会自动选择到PKCS12文件类型,输入密码 a1234567
这里客户端证书切记要导入正确,否则不能生效的。正常情况会弹出一个选择证书的界面,如下,各个浏览器不一致:
五、SSL总结
1、证书一定严格按照步骤来生成,否则会出现各种问题,根证书相当于一个机构,当客户端浏览器安装了这个机构的根证书之后,以后用这个根证书生成的所有证书,都会被信任,这里服务端,通过自签的CA根证书生成,客户端可以安装根证书,也可以安装服务端证书,安装服务器证书的不便之处在意,以后有多级域名之后,客户端还需要安装其它服务器端证书,但如果是安装了根证书,其它服务器只需要根据根证书来签发一个新的证书,而客户端不用变。
2、单向验证,只需要客户端安装一个信任的机构,这里是一个根证书,服务器配置(tomcat)根证书签发的证书,就可以实现单向验证了,客户端没有安装根证书之前,能访问系统,但会提醒https警告,需要点击继续访问。安装了之后,就是一个绿色的锁。
每次访问系统时,服务器Tomcat会发送服务器证书至客户端进行验证,客户端浏览器根据接收到得证书去查找本地安装的证书机构,最终会找到了之前安装的根证书,然后进行验证通过,给予安全的标示。
客户端浏览器安装根证书ca.cer + Tomcat配置服务器证书(server.p12/a1234567)
3、双向验证,除了单向验证的流程之外,客户端还需要发送客户端证书给予服务器进行验证,客户端的证书也是通过CA根证书签发的,服务器TOmcat需要配置为客户端验证clientAuth = true,其次配置信任的证书,这里配置的是根证书ca.p12,因为根证书能直接验证其所签发的客户端证书,所有的客户端都安装客户端证书就能通过验证,客户端应该是安装p12文件个人证书,不能安装cer。
客户端浏览器安装客户端证书client.p12 + Tomcat配置信任证书ca.p12/a1234567
并开启clientAuth = true
六、其它
1、应用部分请求强制使用ssl访问
<!-- 强制SSL配置 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/welcome.jsp</url-pattern><!-- 使用SSL -->
</web-resource-collection>
<user-data-constraint>
<description>force SSL</description>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
2、将CA证书生成JKS
keytool -keystore ca.jks -keypass a1234567 -storepass a1234567 -alias ca -import -trustcacerts -file ca.cer
3、添加信任的证书
keytool -keystore ca.jks -keypass a1234567 -storepass a1234567 -alias xxxxx -import -trustcacerts -file xxxxx.crt
查看列表:keytool -list -keystore ca.jks
参考资料:
http://openssl.org/docs/
http://kyfxbl.iteye.com/blog/1910891
http://my.oschina.net/dongchao/blog/403447?utm_source=tuicool
http://*.com/questions/13848724/axis2-https-is-forbidden
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html