在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"]

再根據項目的實際情況進行修改即可

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