2013-09-26 88 views
1

我試圖讓JMX在Tomcat 7.0.23下使用SSL工作。這些服務器位於AWS,這意味着所有主機都是NAT,並且我需要使用JmxRemoteLifecycleListener明確設置JMX使用的兩個端口。我一直在對這個主題進行大量的閱讀,但我無法正確地將所有的部分一起工作。使用SSL和自簽名證書獲取JMX在Tomcat 7下的工作

我可以讓JMX在沒有SSL的情況下正常工作。我已經爲我的Tomcat版本下載了catalina-jmx-remote.jar版本,並將它安裝在我的tomcat/lib目錄中。我的server.xml中包含:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
     rmiRegistryPortPlatform="1099" rmiServerPortPlatform="1098" /> 

當我啓動Tomcat具有以下設置,我可以用一個不安全的會話連接:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access 
-Djava.rmi.server.hostname=<public IP of server> 
-Dcom.sun.management.jmxremote.ssl=false 

但是如果我改變這些到那麼下面我不能建立SSL連接:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access 
-Djava.rmi.server.hostname=<public IP of server> 
-Dcom.sun.management.jmxremote.ssl=true 
-Dcom.sun.management.jmxremote.ssl.need.client.auth=false 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djavax.net.ssl.keyStore=/path/to/keystore.dat 
-Djavax.net.ssl.keyStorePassword=<password> 
-Djavax.net.ssl.trustStore=/path/to/truststore.dat 
-Djavax.net.ssl.trustStorePassword=<password> 

keystore.dat只包含通過創建一個證書:

openssl x509 -outform der -in cert.pem -out cert.der 
keytool -import -alias tomcat -keystore keystore.dat -file cert.der -storepass <password> 

truststore.dat包含Java的cacerts的完整副本加爲我的自簽名證書的CA證書:

cp $JAVA_HOME/jre/lib/security/cacerts truststore.dat 
keytool -storepasswd -storepass changeit -new <password> -keystore truststore.dat 
keytool -import -trustcacerts -file mycacert.pem -alias myalias -keystore truststore.dat -storepass <password> 

推出的Tomcat我試圖通過JConsole的連接後,但它不能建立一個連接。我試圖驗證SSL使用OpenSSL的,但它看起來像Tomcat沒有利用該證書的:

$ openssl s_client -connect <host>:1099 
CONNECTED(00000003) 
140735160957372:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177: 
--- 
no peer certificate available 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 0 bytes and written 322 bytes 
--- 
New, (NONE), Cipher is (NONE) 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
--- 

我驗證過我的本地密鑰庫和信任被導出密鑰和驗證證書設置正確鏈(combined.pem是truststore.dat所有的CA證書和cert.pem是keystore.dat我CERT):

$ openssl verify -verbose -purpose sslserver -CAfile combined.pem cert.pem 
cert.pem: OK 

所以現在我在一個完全喪失。證書和CA證書看起來是正確的。未加密的JMX連接正常工作。但我似乎無法獲得使用SSL的連接。我在這裏錯過了什麼?

我不知道這是否只是一個紅鯡魚,但我沒有看到任何方式來指定什麼證書在密鑰庫中使用的JMX。我讀過的部分內容暗示它只是使用帶有別名「tomcat」的證書。那是對的嗎?

回答

1

您正在啓動RMI註冊處,端口。爲了RMI註冊表利用SSL您需要傳遞另外的-Dcom.sun.management.jmxremote.registry.ssl=true參數。

編輯: 您是否使用jconsole -J-Djavax.net.ssl.trustStore=truststore -J-Djavax.net.ssl.trustStorePassword=trustword -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password啓動JConsole?它需要知道商店的位置和相應的密碼。

對於VisualVM,您可以安裝VisualVM-Security插件,它將向選項對話框中添加一個新選項卡,以允許您在UI中自定義SSL相關選項。

+0

謝謝。我不確定我錯過了那一個。不幸的是,添加它不會以任何方式改變行爲。我仍然無法從JConsole建立安全連接,並且如果我運行openssl s_client命令,它仍會生成相同的「無對等證書可用」消息。 –

+0

如上所述,我在啓動jconsle時指定了相同的密鑰庫和信任庫文件。但這根本不會改變行爲。我完全不相信問題出在客戶端,因爲當我運行我在原始問題中提到的「openssl s_client」命令時,我甚至無法獲得有效的SSL握手。既然它說沒有證書可用,並且沒有發送CA名稱,那麼它在服務器端看起來就像是一個問題。 –

+0

如果您使用相同的商店爲客戶端和服務器,他們必須「交叉」 - 例如。 服務器:{truststore = store1,keystore = store2},客戶端:{truststore = store2,keystore = store1} –

1

我希望tomcat能夠使用jmx和ssl,並遵循Bruce設置。如果有人運行INT同樣的問題:在使用OpenSSL和密鑰工具命令形式布魯斯我得到在客戶端SSL錯誤:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 

不知道爲什麼,但在一側figerprint爲5個字符長的開頭。

我重新使用密鑰庫:

keytool -genkeypair -alias tomcat -keyalg RSA -keystore keystore.jks -dname cn=test,ou=test,dc=example,dc=com 

在Tomcat中sever.xml我添加偵聽布魯斯建議。

由於客戶端身份驗證設置爲false,因此我不在tomcat jmx配置中添加信任庫。相反,我加入registry.ssl:

[...] 
-Djavax.net.ssl.keyStorePassword=your_keystore_pass 
-Dcom.sun.management.jmxremote.registry.ssl=true 

然後在客戶端爲JB建議我下載的SSL插件的VisualVM和縱橫交錯的密鑰庫導致:

visualvm -J-Djavax.net.ssl.trustStore=keystore.jks -J-Djavax.net.ssl.trustStorePassword=your_keystore_pass 

當添加認證確保您的JMX訪問文件看起來像:

<user_name> readwrite 

和您的密碼文件看起來像:

<user_name> <your_password> 

這解決了我用於測試visualm vm的ssl jmx安裝程序。

編輯:

曾與具有註冊表還通過SSL的一些問題,通過設置:

導致在客戶端拋出:

Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint 

添加客戶端驗證身份驗證:

-Dcom.sun.management.jmxremote.ssl.need.client.auth=true 
-Djavax.net.ssl.trustStore=truststore.jks 
-Djavax.net.ssl.trustStorePassword=your_trust_store_pass 

解決了jmx及其註冊表使用ssl。