對於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"]
再根據項目的實際情況進行修改即可