SSL/TLS 是企業級應用傳輸層安全的基石。GlassFish v2 提供三種配置檔,安全存儲機制各異:Developer (JKS)、Cluster (JKS + 複寫)、Enterprise (NSS)。本文詳細解析三種模式下,從自簽憑證替換為 CA 簽署憑證的完整操作流程。
預設別名:s1as (GlassFish 專用)。工具:JDK 6 keytool (支援 -genkeypair, -certreq)。
keytool -delete -alias s1as -keystore keystore.jks -storepass changeit
keytool -genkeypair -keyalg RSA -keystore keystore.jks -validity 365 -alias s1as -storepass changeit
# 過程中輸入 CN=FQDN (必須與網站完整域名一致),否則瀏覽器會彈出名稱不符警告
keytool -certreq -alias s1as -file s1as.csr -keystore keystore.jks -storepass changeit
將回覆 (含 -----BEGIN CERTIFICATE-----) 存為 s1as.cert。同步下載 CA 根憑證與中介憑證匯入瀏覽器/客戶端 Truststore。
推薦方式:使用 Java 程式碼精準替換 (保留原私鑰):
// 參數: CA回覆檔, keystore路徑, keystore密碼, 別名
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(new FileInputStream(csrReplyFile));
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystoreLoc), storePass.toCharArray());
Key key = ks.getKey(alias, storePass.toCharArray());
ks.setKeyEntry(alias, key, storePass.toCharArray(), new Certificate[]{cert});
ks.store(new FileOutputStream(keystoreLoc), storePass.toCharArray());
替代方式 (keytool 僅限導入信任鏈):需先 -importcert 根/中介 CA 至 keystore (別名不同),再 -importcert 伺服器憑證至 s1as,但較繁瑣且易出錯。
無 JKS,改用 NSS 資料庫 ($AS_NSS_DB 環境變數指向)。需額外工具:pk12util (NSS 工具)、openssl、certutil。
.pfx) → 匯入 NSS。# 1. 從暫存 JKS 導出私鑰 (PEM 格式) - 需 keyexport 工具 (XWSS 專案提供)
keyexport.bat -keyfile serverkey.pem -keystore keystore.jks -storepass changeit -alias s1as
# 輸入密碼 (同 keystore) → 產生 serverkey.pem (含私鑰)
# 2. 附加 CA 簽署憑證至 serverkey.pem 末尾 (在 -----END PRIVATE KEY----- 之後)
cat s1as.cert >> serverkey.pem
# 3. 轉換為 PKCS#12
openssl pkcs12 -export -in serverkey.pem -out s1as.pfx
# 輸入導出密碼 (如 changeit)
# 4. 刪除 NSS 中舊別名 (若存在)
certutil -D -n s1as -d $AS_NSS_DB
# 5. 匯入 PKCS#12 至 NSS
pk12util -i s1as.pfx -d $AS_NSS_DB
# 輸入 NSS 軟令牌密碼與 PFX 密碼 → 顯示 "PKCS12 IMPORT SUCCESSFUL"
| 來源 | 目標 | 工具/指令 |
|---|---|---|
| PKCS#12 (.pfx) | JKS (Developer) | pkcs12import.sh -file s1as.pfx -alias s1as -keystore keystore.jks -storepass changeit -pass <pfx密碼> |
| JKS | NSS (Enterprise) | 同上 openssl → pk12util 流程 |
app.example.com),不可用 IP 或 localhost。storepass 與 keypass 不一致,GlassFish 要求兩者相同。$AS_NSS_DB 指向正確目錄 (含 cert8.db, key3.db),且 pk12util 版本相容。keystore.jks、cacerts.jks 複寫至所有節點相同路徑。GlassFish v2 SSL 配置的核心難點在於「金鑰對生成 → CSR → CA 簽署 → 精準替換私鑰條目」的流程完整性。Developer/Cluster 依賴 JKS + keytool/Java 代碼;Enterprise 則轉向 NSS + PKCS#12 橋接。建議生產環境統一使用 CA 簽署憑證,並自動化部署腳本化,確保叢集一致性與憑證週期管理。