如何使用 SSL
社群 > 常見問題 > 使用 Apache ActiveMQ Classic > 如何使用 SSL
設定金鑰與信任儲存區
另請參閱 Tomcat 的 SSL 指示 以獲取更多資訊。以下內容由 Colin Kilburn 提供。感謝 Colin!
ActiveMQ Classic 預設使用虛擬憑證
ActiveMQ Classic 包含參考虛擬自簽憑證的金鑰和信任儲存區。當您為您的安裝建立代理程式憑證和儲存區時,請覆寫 conf 目錄中的值,或刪除現有的虛擬金鑰和信任儲存區,以避免它們干擾。
- 使用 keytool,為代理程式建立憑證
keytool -genkey -alias broker -keyalg RSA -keystore broker.ks
- 匯出代理程式的憑證,以便可以與客戶端共享
keytool -export -alias broker -keystore broker.ks -file broker_cert
- 為客戶端建立憑證/金鑰儲存區
keytool -genkey -alias client -keyalg RSA -keystore client.ks
- 為客戶端建立信任儲存區,並匯入代理程式的憑證。這確立客戶端「信任」代理程式
keytool -import -alias broker -keystore client.ts -file broker_cert
啟動代理程式
使用 javax.net.ssl.* 系統屬性
在啟動代理程式的 VM 之前,請設定 ACTIVEMQ_SSL_OPTS 環境變數,使其知道使用代理程式金鑰儲存區。(請注意,在先前版本的 ActiveMQ Classic 中,此屬性在某些腳本中稱為 SSL_OPTS。自 v5.12.0 起,所有腳本都使用 ACTIVEMQ_SSL_OPTS)
export ACTIVEMQ_SSL_OPTS = -Djavax.net.ssl.keyStore=/path/to/broker.ks -Djavax.net.ssl.keyStorePassword=password
使用 Spring 為代理程式實例設定 SSL
有時使用 javax.net.ssl.* 系統屬性並不適當,因為它們會影響 JVM 中的所有 SSL 使用者。ActiveMQ Classic 5.2.x 新增了一個元素,允許設定特定於代理程式的 SSL 屬性集。
SslContext 測試案例 驗證了使用在代理程式 Xbean 中指定的組態來啟動 SSL 傳輸監聽器。SslContext 元素會如下加入到代理程式中
SslContext 用於設定該代理程式的 SslTransportFactory。可在 綱要定義 或 org.apache.activemq.spring.SpringSslContext 的存取器中看到可用的組態選項的完整詳細資訊
啟動客戶端
在啟動客戶端的 VM 時,請指定以下系統屬性
javax.net.ssl.keyStore=/path/to/client.ks
javax.net.ssl.keyStorePassword=password
javax.net.ssl.trustStore=/path/to/client.ts
在 Linux 中,請勿使用金鑰儲存區的絕對路徑。預設情況下,keytool 使用 ~/.keystore
,但在某些設定中,將 -Djavax.net.ssl.keyStore=/home/account/.keystore
傳遞給 Java VM 無法運作。這並非 ActiveMQ Classic 特有,但無論如何都值得記住。
客戶端憑證
如果您想要驗證客戶端憑證,您需要執行一些額外的步驟
- 匯出客戶端的憑證,以便可以與代理程式共享
keytool -export -alias client -keystore client.ks -file client_cert
- 為代理程式建立信任儲存區,並匯入客戶端的憑證。這確立代理程式「信任」客戶端
keytool -import -alias client -keystore broker.ts -file client_cert
- 將
-Djavax.net.ssl.trustStore=/path/to/broker.ts
加入至
ACTIVEMQ_SSL_OPTS
- 透過在 activemq.xml 中設定以下內容,指示 ActiveMQ Classic 需要客戶端驗證
憑證撤銷
從 5.12 版本開始,您可以在 SSL 上下文中定義憑證撤銷清單 (CRL) 路徑,以便可以撤銷無效的憑證
<sslContext>
<sslContext keyStore="org/apache/activemq/security/broker1.ks"
keyStorePassword="password"
trustStore="org/apache/activemq/security/activemq-revoke.jks"
trustStorePassword="password"
crlPath="org/apache/activemq/security/activemq-revoke.crl"/>
</sslContext>
此清單是靜態的,並在代理程式啟動時載入。
從 5.14.0 版本開始,您也可以啟用更進階的線上憑證狀態協議 (OCSP) 協定。為此,您需要透過設定適當的系統屬性(在 ${ACTIVEMQ_HOME}/bin/env
中)來設定 java.security
組態延伸的位置,例如
ACTIVEMQ_SSL_OPTS="-Djava.security.properties=$ACTIVEMQ_CONF/java.security"
然後,您需要在 java.security
檔案中設定 OCSP 回應器屬性,例如
ocsp.enable=true ocsp.responderURL=<http://ocsp.example.net:80>
可以在 https://github.com/dejanb/sslib 找到使用 OCSP 回應器的代理程式組態示範
解決 Java 7 SSL 錯誤
如 AMQ-5970 問題所述,某些版本的 Java 7 似乎在使用需要 Diffie-Hellman 密碼套件的 SSL 會話時存在問題。如果您遇到此問題,只需將 Bouncy Castle bcprov-jdk15on-148.jar 複製到 ActiveMQ Classic 的 lib 目錄,然後重新啟動您的代理程式。
實用連結
這些連結也可能有所幫助