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

来源:互联网 发布:pix飞控调参软件下载 编辑:程序博客网 时间:2024/04/30 16:53
最近在弄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自制证书单向&双向验证

3 0
原创粉丝点击