Bootstrap

Keytool生成双向https证书提供请求https的工具包

背景

前段时间分享了一个使用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 拷贝到Tomcatconf目录下,如上的 server.xml 配置文件中的 keystoreFiletruststoreFile 的路径都改成 "./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);
}
;