程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在GlassFish v2中使用SSL

在GlassFish v2中使用SSL

編輯:關於JAVA

大多數企業應用程序都需要在安全環境中運行。傳輸層安全(TLS)/安全套接 層(SSL)是一種點對點的安全傳輸機制,可用於驗證客戶端和服務器之間交換的 消息,並確保消息的完整性和機密性。TLS/SSL(或在本文中,就是“SSL”)可 滿足大多數企業應用環境的安全要求,因此得到了廣泛應用。

無論如何參與 SSL 保護的信息交換,服務器都需要成為 SSL 服務器。本文將 介紹如何使 GlassFish v2 應用程序服務器成為 SSL 服務器。

為了理解這些步驟,您需要理解 SSL 中的一些基本概念(比如密鑰和證書) ,並對 GlassFish v2 中的 profile(配置)有所了解。

密鑰和證書

密鑰和證書是 SSL 中的兩個重要概念。密鑰用於在客戶端和服務器之間的傳 輸中建立信任和隱私。SSL 使用公鑰加密法,這種加密法是基於密鑰對的。密鑰 對包含一個公鑰和一個私鑰。如果用其中一個密鑰加密了數據,則只能用密鑰對 中的另外一個密鑰來解密。

證書用於驗證。要使用 SSL,服務器必須擁有其可以連接的每個客戶端 IP 地 址的相關證書。證書標識了服務器站點的所有者並提供相關的信息。證書由其所 有者進行了加密數字簽名。對於驗證非常重要的網站,可以從值得信賴的知名證 書認證機構(CA)購買。但是,如果驗證並不特別重要,網站也可以使用自簽名 的證書。

GlassFish v2 配置

GlassFish v2 支持多種配置。每個配置都預置了配置參數,用於應用程序服 務器為某種特定用途對其進行優化。它支持三種配置:developer(開發人員)、 cluster(集群)和enterprise(企業)。

開發人員配置可優化 GlassFish v2 適用於開發環境。這表示配置參數支持類 似快速啟動的目標,但是不支持登錄或會話復制。集群配置將設置支持集群創建 和會話復制的配置參數。集群是一組可作為單個邏輯實體管理和監視的 GlassFish v2 實例。企業配置可優化 GlassFish v2 適用於生產環境。它支持登 錄和其他安全相關的功能。

使 GlassFish v2 應用程序服務器成為 SSL 服務器

使 GlassFish v2 成為 SSL 服務器的步驟取決於應用服務器的配置。首先讓 我們來查看一下使用開發人員配置時的過程。然後再查看使用企業配置時的過程 。

使用開發人員配置

再次提醒:GlassFish v2 配置預置了某種特定使用類型的配置參數。這些參 數中有一種是 Security Store,它可以確定如何存儲安全和信任相關的事物,比 如證書和密鑰。對於開發人員配置,Security Store 值設置為 JKS。在本例中, 服務器的證書和密鑰存儲在 Java keystore 文件(keystore.jks)中,而信任的 CA 簽發的證書存儲在證書文件(cacerts.jks)中。

安裝 GlassFish v2 時,它會創建一個默認的自簽名證書作為服務器證書。但 是,如果驗證對您的網站非常重要,則您需要將該自簽名證書替換為由 CA 簽發 的數字簽名證書。本節將介紹如何替換該自簽名證書、如何從 CA 獲得服務器證 書以及如何將服務器證書導入到 keystore。

以下步驟需要使用 keytool,它是一種密鑰和證書管理工具。Keytool 在多種 版本的 Java Platform 、Standard Edition(Java SE)Development Kit(jdk )中均可獲得。但是,Java SE 6 在 keytool 中添加了一些必要的功能。以下教 程基於 jdk 6 版本的 keytool。有關 keytool 的詳細信息,請參閱 JDK Tools and Utilities。

應用服務器使用開發人員配置時,可采用以下步驟使 GlassFish v2 成為 SSL 服務器。

使用以下命令刪除默認的自簽名證書(注意:出於格式目的,以下及以後步驟 中的命令分多行顯示):

keytool -delete -alias s1as -keystore keystore.jks

-storepass

其中,<store_passwd> 是 keystore 的密碼,例如 mypass。注意: s1as 是 GlassFish v2 keystore 的默認別名。

使用以下命令為應用程序服務器生成新密鑰對:

keytool -genkeypair -keyalg

-keystore keystore.jks -validity -alias s1as

其中,<key_alg> 是用於生成密鑰對的算法,例如 RSA。 <val_days> 為證書的有效天數,例如 365。

注意:除了生成密鑰對,該命令會將公鑰包含到一個自簽名的證書中,並將證 書和私鑰存儲在一個由該別名標識的新 keystore 條目中。

確保證書的名稱與網站的完全限定主機名匹配是非常重要的。如果名稱不匹配 ,則連接到服務器的客戶端將會看到一個安全警告,提示證書的名稱與站點的名 稱不匹配。你應該注意到默認的自簽名證書的名稱與完全限定的主機名匹配。

通過以下命令生成證書簽名請求(CSR):

keytool -certreq -alias s1as -file

-keystore keystore.jks -storepass

其中,<certreq_file> 是存儲 CSR 的文件,例如 s1as.csr,而 <store_passwd> 為 keystore 的密碼,例如 changeit。

將 CSR 提交到 CA,比如 VeriSign。您將收到一個簽名的服務器證書作為回 應。確保將 CA 的 CA 證書以及 CA 在回應中表明的任何中間證書導入到浏覽器 。

將來自的 CA 的已簽名服務器證書(包括標記 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----)存儲到某個文件中,比如 s1as.cert。下載 CA 證書以及所有中間 CA 證書,並將它們存儲到本地文件中。參考浏覽器文檔中有 關如何將 CA 和中間 CA 證書導入到浏覽器的說明。CA 可能提供了如何將 CA 證 書導入到各種浏覽器(Mozilla 和 Internet Explorer)的信息。

使用從 CA 獲得的證書(存儲在一個文件中,比如 s1as.cert)代替原始的自 簽名證書。您可以使用 keytool 來執行此任務,但是需要好幾步來執行。運行以 下 Java 程序來執行該替換會比較容易:

import java.io.*;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;


public class Main {
public static void main(String[] args) throws Exception {
//args[] error checking logic omitted
//file containing signed cert reply from CA
String csrReplyFromCA = args[0];
//Path to GlassFish keystore.jks
String keystoreLocation = args[1];
//Password for GlassFish keystore.jks
String keystorePassword = args[2];
//The keyalias to be replaced : s1as in our example
String selfSignedKeyEntry = args[3];

//create the signed Cert
Certificate cert = null;
FileInputStream fis =
new FileInputStream(csrReplyFromCA);
CertificateFactory cf =
CertificateFactory.getInstance("X.509");
cert = cf.generateCertificate(fis);

//now replace the original entry
char[] passwordChars =
keystorePassword.toCharArray ();
KeyStore keystore = KeyStore.getInstance ("JKS");
keystore.load(new FileInputStream (keystoreLocation),
passwordChars);
Key key = keystore.getKey (selfSignedKeyEntry,
passwordChars);
keystore.setKeyEntry (selfSignedKeyEntry, key,
passwordChars, (new Certificate[] {cert}));
keystore.store(new FileOutputStream(
keystoreLocation), passwordChars);
}
}

運行該程序後,您會發現 GlassFish keystore 中的證書 s1as 已不再是原 始的自簽名證書,而是來自 CA 的證書。這裡有一個例子,比較了原始 s1as 證 書和從 VeriSign 獲得的新 s1as 證書:

原始 s1as(自簽名):

Owner: CN=KUMAR, OU=Sun Java System Application Server, O=Sun

Microsystems, L=Santa Clara, ST=California, C=US

Issuer: CN=KUMAR, OU=Sun Java System Application Server, O=Su

n Microsystems, L=Santa Clara, ST=California, C=US

Serial number: 472acd34

Valid from: Fri Nov 02 12:39:40 GMT+05:30 2007 until: Mon Oct

30 12:39:40 GMT+05:30 2017

新 s1as(包含來自 CA 的簽名證書):

Owner: CN=KUMAR, OU=Terms of use at www.verisign.com/cps/test

ca (c)05, OU=Sun Java System Application Server, O=Sun Micros

ystems, L=Santa Clara, ST=California, C=US

Issuer: CN=VeriSign Trial Secure Server Test CA, OU=Terms of

use at https://www.verisign.com/cps/testca (c)05, OU="For Test

Purposes Only. No assurances.", O="VeriSign, Inc.", C=US

Serial number: 1375de18b223508c2cb0123059d5c440

Valid from: Sun Nov 11 05:30:00 GMT+05:30 2007 until: Mon Nov

26 05:29:59 GMT+05:30 2007

執行這些步驟之後,您可以重啟 GlassFish v2 並使用由 CA 簽發的簽名服 務器證書。

使用集群配置

當應用程序使用集群配置進行配置時,和使用開發人員配置一樣,你可以執 行同樣的步驟使 GlassFish v2 成為 SSL 服務器。但是,在這種情況下,你需要 確保在集群的所有應用程序服務器實例中復制同一個服務器密鑰。

使用企業配置

企業配置的 Security Store 參數值為 NSS,表示 Network Security Services(網絡安全服務)。在 NSS 安全基礎結構中,沒有 JKS keystore,因 此沒有默認的 GlassFish keystore。

但使用企業配置時,使 GlassFish v2 應用程序服務器成為 SSL 服務器的大 部分步驟與使用開發人員配置時的步驟是一樣的。但是也有兩處不同。第一個不 同與該過程的第一步有關。由於沒有 JKS keystore,您需要使用空的 keystore (keystore.jks)啟動該過程。第二個不同與該過程的最後一步有關。您需要將 生成的簽名證書導入到 NSS store,而不是 JKS keystore。換句話說,要使 GlassFish v2 應用程序服務器成為 SSL 服務器,您需要執行和 當使用開發人員 配置時 這一節中同樣的步驟,但是使用空的 keystore 開始,並且將該部分中的 第 6 步替換為以下步驟:

通過以下命令,將 keystore 中的服務器證書的私鑰以加密郵件(PEM)格式 導出:

keyexport.bat -keyfile serverkey.pem

-keystore keystore.jks -storepass changeit -alias s1as

該命令將調用 keyexport 實用工具。您可以在 keyexport 包中找到 keyexport,可以通過 Project Metro 的 XWSS 下載頁面 下載該程序包。

作為響應,系統將提示需要輸入 keystore 密碼。該 Keystore 密碼和密鑰密 碼是一樣的,因此您可以通過簡單地按下回車鍵進行回應。

這會創建一個 serverkey.pem 文件,該文件在標志 -----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY----- 下包含服務器私鑰。

將來自 CA 的簽名證書回應(包括 -----BEGIN CERTIFICATE----- 和 ----- END CERTIFICATE----- 標志)附加到 servercert.pem 文件。將回應附加到 END PRIVATE KEY 標志的下面。

將 serverkey.pem 文件轉換為 PKCS#12 文件(具有 .pfx 擴展名的文件)。 “PKCS”指由 RSA Security 設計並發布的一組公鑰加密標准。PKCS#12 定義了 一種通常用於存儲具有相應公鑰證書的私鑰的格式,使用基於密碼的對稱密鑰進 行保護。

您可以使用多種工具將 serverkey.pem 文件轉換為 PKCS#12 文件。openssl 即為其中的一個工具。這裡是使用 openss1 轉換文件的命令:

openssl pkcs12 -export -in serverkey.pem -out s1as.pfx

作為響應,系統將提示需要輸入導出密碼。輸入密碼,比如 changeit 或 GlassFish 主密碼。

s1as.pfx 文件現在將包含所需的簽名服務器證書和私鑰。

通過以下命令,刪除原始 s1as 自簽名條目(如果存在):

certutil -D -n s1as -d $AS_NSS_DB

通過以下命令,使用 pk12util 實用工具將新的 s1as.pfx 文件導入 NSS store:

pk12util -i s1as.pfx -d $AS_NSS_DB

pk12util 是一種 NSS 實用工具,它位於 GlassFish 企業配置的安裝模板目 錄下。該實用工具用於將 PCKS#12 文件導入 NSS store 或從中導出。

為響應該命令,系統將提示輸入 NSS 軟令牌和 PKCS#12 文件的密碼。提供相 應的密碼。然後您將看到以下消息,表示導入成功:

pk12util: PKCS12 IMPORT SUCCESSFUL

還有兩個問題需要注意:

應用程序服務器配置為企業配置,並且服務器密鑰對已存在於 PKCS#12 文件 中。如果在 store 中已存在別名為 s1as 的條目,則您只需要執行“當使用企業 配置時”中說明的第 4 步來刪除該原始條目:

certutil -D -n s1as -d $AS_NSS_DB

然後執行第 5 步將新的 s1as.pfx 文件導入到 NSS store:

pk12util -i s1as.pfx -d $AS_NSS_DB

如果在 store 中沒有別名為 s1as 的條目,則直接執行第 5 步。

應用程序服務器配置為開發人員配置,並且服務器密鑰對已存在於 PKCS#12 文件中。在這種情況下,你只需要按 當使用企業配置時 中說明的第 5 步刪除原 始 s1as 條目即可。然後使用 pkcs12import 實用工具將 PCKS#12 文件導入 GlassFish keystore:

pkcs12import.sh -file s1as.pfx -alias s1as

-keystore keystore.jks -storepass changeit

-pass

其中,<exp_password> 為導出 PKCS#12 文件時使用的密碼,例如 changeit。

您可以在 pkcs12import 包中找到 pkcs12import 實用工具,可以通過 Project Metro 的 XWSS 下載頁面 下載該程序包。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved