背景
前段时间分享了一个使用jdk自带的Keytool+tomcat项目http转单向https的文章,但是业务中很多需求还是要使用到双向的https
更加安全,今天分享一下具体操作步骤。
项目如果是IP方式访问用-ext SAN=ip:192.168.1.1
,如果是域名用 -ext SAN=dns:www.abc.com
,注意“您的名字与姓氏是什么?”就是你的IP
或域名
根据实际情况做必要的修改,其中需要注意的是:服务端的密钥库参CN
必须与服务端的IP
地址相同,否则会报错,客户端的任意。
证书生成
首先创建一个D:\key2
文件夹,用于保存生成的证书。这里密码就是使用123456
了,可以按需修改。有效期是指为3650
天,命令中的具体参数可以看上个文章介绍。
1、生成服务器证书库
keytool -validity 3650 -genkey -v -alias servercert -keyalg RSA -ext SAN=ip:192.168.1.1 -keystore D:\key2\server.keystore -dname CN=192.168.1.1,OU=server,O=server,L=server,ST=server,c=CN -storepass 123456 -keypass 123456
2、生成客户端证书库
keytool -export -v -alias clientcert -keystore D:\key2\clientcert.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\key2\clientcert.cer
3、从客户端证书库中导出客户端证书
keytool -export -v -alias clientcert -keystore D:\key2\clientcert.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\key2\clientcert.cer
4、将客户端证书导入到服务器证书库(使得服务器信任客户端证书)
keytool -import -v -alias clientcert -file D:\key2\clientcert.cer -keystore D:\key2\server.keystore -storepass 123456 -noprompt
5、让客户端信任服务器证书,将证书填入到“受信任的根证书颁发机构”
keytool -keystore D:\key2\server.keystore -export -alias servercert -file D:\key2\server.cer -storepass 123456
6、查看证书库中的全部证书 (一个是服务器证书,一个是受信任的客户端证书),可以省略这一步。
keytool -list -keystore D:\key2\server.keystore -storepass 123456
赠送命令:证书条目的删除(根据项目情况这个需要时再用)
keytool -delete -alias clientcert -keystore D:\key2\server.keystore -storepass 123456
7、修改Tomcat的 server.xml 配置文件,这里使用的是Tomcat8.0.47版本测试
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="D:/key2/server.keystore" keystorePass="123456"
truststoreFile="D:/key2/server.keystore" truststorePass="123456"/>
在服务服务器上可以将生成的 server.keystore
拷贝到Tomcat
的 conf
目录下,如上的 server.xml
配置文件中的 keystoreFile
、truststoreFile
的路径都改成 "./conf/server.keystore"
,然后就可以了。
java中请求https地址
赠送一个我们自己的工具类不喜勿喷。下载链接
/**
* http/https请求工具类测试
* @ wei_xin_gong_zhong_hao 快乐学习与分享
*/
public static void test() throws Exception{
String url = "http或者https开头的URL都可以";
HttpExecutorContext httpExecutorContext = HttpExecutorContext.create();
if (url.startsWith("https")) {
HttpExecutorContext.create(HttpExecutor.createHttpsClient());
}
httpExecutorContext.header("token", "xxxx");
String res = HttpExecutor.simpleGet(httpExecutorContext, url);
}