背景
我當前手頭已有一個服務器證書和對應的私鑰,現在需要轉換為 Java KeyStore 格式使用,找了一大圈才發現 keytool 無法直接導入服務器證書和私鑰,當然證書可以直接導入,但是私鑰是無法直接導入。找了一大圈發現可以先將服務器證書和證書私鑰轉為 PKCS12 格式的密鑰庫,然后通過 PKCS12 格式證書轉為 Java KeyStore 格式。
首先通過 openssl 生成ca證書,服務器證書和服務器私鑰:
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout ca.key -out ca.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Cloud/CN=ghimi.top"
openssl x509 -req -in ca.csr -key ca.key -out ca.crt -days 3650
# ca.key ca 證書私鑰
# ca.csr ca 證書簽名請求
# ca.crt ca 證書(自簽名證書)
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout server.key -out server.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Blog/CN=blog.ghimi.top"
# server.key 服務器證書私鑰
# server.csr 服務器證書簽名請求
# server.crt 服務器證書
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 \
-extensions SAN \
-extfile <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:dns.ghimi.top,IP:127.0.0.1"))
然后將上述服務器證書轉為 PKCS12 格式:
openssl pkcs12 -export -in server.crt -inkey server.key -CAfile ca.crt \
-password pass:123456 -name server -out server.p12
# 如果證書私鑰設置了密碼的話使用 -passin pass:123456 輸入密碼
# -password pass:123456 為 pkcs12 密鑰庫設置密碼
最后通過 keytool 命令將證書導出為 Java Keystore 密鑰庫格式:
# 導出服務器證書和證書私鑰為 java keystore 格式
keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks \
-srcstoretype pkcs12 -deststoretype jks -srcalias server -destalias server \
-deststorepass 123456 -srcstorepass 123456
# server.jks 為最終的導出結果
# 將 ca 證書導入到 server.jks 中
keytool -importcert -keystore server.jks -file ca.crt -alias root-ca -storepass 123456 -noprompt
參考資料
- keytool 簡介
- keytool 使用方法