对于https稍微详细的一点的流程,在之前的文章《java实现http/https抓包拦截》中有过一些记录,这里不再详细说明。
https双向认证
按照我的个人理解,所谓https的双向认证简单点来说也就是:客户端(client,一般是浏览器)不仅要验证来处服务端(server)的请求是否合法,服务端(server)也还需要验证客户端(client)的合法性。
一般对于安全性要求比较高的情况下才会使用到https的双向验证,要完成双向认证一般需要3个证书来完成:
- ca证书
- server端证书
- client端证书
对于https双向认证时server端和client端所需要做的工作大体相同,这里以开发时常见的client端进行说明
https双向认证开发环境导入证书
一般开发时,server方会将自己生成的ca证书交给客户端方,同时也会将一个由server方预先生成好的客户端证书交给客户端方,那么开发时我们只需要将那两个证书导入到本地环境中即可
https双向认证在开发时直接用命令导入jdk中即可,如果是jdk1.8,那么也就是jdk(jre)/lib/security这个目录,切换到此目录后,执行下面的命令即可:
keytool -import -alias gen -keystore cacerts -file "D:\myCA.cer"
keytool -import -alias pt2 -keystore cacerts -file "D:\myPt2.cer"
上面导入的过程中会要求输入密码,以及输入yes/no以接受导入证书,完成之后根据代码进行开发即可
在docker环境中https双向认证证书导入
项目开发好后,一般会进行部署,而现在部署时大都用的docker容器来部署的。
此时对于证书的导入和上面大体相同,在打镜像时完成导入操作即可,还是keytool命令:
RUN \
cd $JAVA_HOME/jre/lib/security \
&& keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias gen -file /genCA.cer
通过-storepass先指定密码和-noprompt指定不需要确认流程
那么dockerFile大致就可以这样:
FROM adoptopenjdk/openjdk8-openj9:latest
RUN mkdir -p /usr/share/zoneinfo/Asia
VOLUME ["/tmp"]
COPY my-app-1.0.jar app.jar
COPY TimeZone /usr/share/zoneinfo/Asia/Shanghai
COPY classes/ca/myCA.cer myCA.cer
COPY classes/ca/myPt2.cer myPt2.cer
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
RUN \
cd $JAVA_HOME/jre/lib/security \
&& keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias gen -file /myCA.cer
RUN \
cd $JAVA_HOME/jre/lib/security \
&& keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias pt2 -file /myPt2.cer
CMD ["java", "-Xmx512m", "-XX:+IdleTuningGcOnIdle", "-Xtune:virtualized", "-Xscmx128m", "-Xscmaxaot100m", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/app.jar"]
再根据项目的实际情况进行修改即可