您的位置:首页 > 理论基础 > 计算机网络

https 单向认证和双向认证及tomcat配置及各种证书类型之间的转换,适用ios,Android,网页端

2017-04-10 14:09 701 查看
最近在弄https的双向认证,顺便把以前弄的单向认证也写进博文,因为网上很多博文的https都是自己的keytool生成的,没有经过ca机构的认证,所以不太适用,这里准备自己新写一篇。先写以下我自己配置https的环境和工具。


腾讯云申请的https证书

Portecle工具

linux

tomcat7

单向认证

在tomcat配单向认证还是比较简单的,在腾讯云上申请https证书,申请之后会有四个文件夹




因为我这里用的是tomcat配置https,所以选用的是tomcat的文件夹里面的server.jks文件,先把文件放到tomcat目录下的/conf,在conf新建文件夹/https,把server.jks放到https文件夹里面,修改/conf下的server.xml文件,在原server.xml文件里的80~90行左右会有这样一段代码

<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->


可以把这段代码的注释打开,然后再修改成


<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="密钥库文件路径,也就是.jks文件我这里是conf/https/server.jks"
keystorePass="密码,就是在申请https文件时填的密码,建议申配置https时所有密码最好统一,不然不知道该填哪个" />


如果单向认证客户端需要证书的话可以在linux环境下用下面这行命令导出cer文件给客户端

keytool -export -alias server -storepass 123456 -keystore server.jks -file server.cer


-storepass后面跟的是你刚才设置的密码,不加这个也没关系,它会主动问你!;-file设置了保存证书的路径

注意

如果端口被占用可以修改port=”8443”为其他端口,修改这个端口的时候,把上面8080端口重定向也要重新配置,这样就可以访问http直接跳转到https,不然访问https要加上端口号如https://域名:444/xxx/xxx.jsp

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="你修改后的端口" />


双向认证

双向认证需要两个密钥实体,一个放服务端一个放客户端。

为客户端重新生成多一份证书,这里我是 用keytool生成的,(注意:双向认证的客户端证书是自己生成的,服务端证书是向ca机构申请的)

1.创建客户端证书,alias参数可以随意指定

keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12


2.导出客户端证书的公钥,alias参数要与上一步指定的相同

keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer


3.将公钥保存到keystore中供服务器使用

keytool -import -v -file client.cer -keystore clientKeys.jks


4.配置tomcat

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="conf/https/server.jks" keystorePass="密码"
truststoreFile="conf/https/clientKeys.jks" truststorePass="密码"
clientAuth="true" sslProtocol="TLS" />


启动服务,直接访问时,会提示客户端认证失败。将第1步创建.p12的证书导入到浏览器中,再访问服务则可以正常访问。

证书之间的转换

因为ios和Android和网页需要的证书的类型都不太一样,所以下面介绍一个工具Portecle工具

点这里下载Portecle工具

在window下解压双击portecle.jar

运行之后就会出来UI界面,用它打开你需要转类型的文件然后选菜单 Tools –> Change Keystore Type –>(选择你需要选择的类型) 在弹出框输入密码进行转换,最后别忘记选菜单 File –> Save Keystore As 将它另存为 文件名.文件类型

可能会出现这样的异常:java.security.KeyStoreException: java.io.IOException: Error initialising store of key store

解决办法是下载JCE然后替换掉JDK\jre\lib\security和JRE\lib\security这两个目录下的同名文件,并重启Portecle

注意 :Android端可能需要两个p12文件,双向认证的时候只需要把双向认证第一步中的client.p12和单向认证中的server.jks用Portecle工具转换成p12。就可以完成双向认证了


下面这里还有一篇和ios一起协调实现双向认证的文章,有需要的同学可以去看一下iOS https自制证书单向&双向验证
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat ca 腾讯云