在docker中让java程序支持https双向认证

对于https稍微详细的一点的流程,在之前的文章《java实现http/https抓包拦截》中有过一些记录,这里不再详细说明。

https双向认证

按照我的个人理解,所谓https的双向认证简单点来说也就是:客户端(client,一般是浏览器)不仅要验证来处服务端(server)的请求是否合法,服务端(server)也还需要验证客户端(client)的合法性。

一般对于安全性要求比较高的情况下才会使用到https的双向验证,要完成双向认证一般需要3个证书来完成:

  1. ca证书
  2. server端证书
  3. 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"]

再根据项目的实际情况进行修改即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章