我試圖讓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」的證書。那是對的嗎?
謝謝。我不確定我錯過了那一個。不幸的是,添加它不會以任何方式改變行爲。我仍然無法從JConsole建立安全連接,並且如果我運行openssl s_client命令,它仍會生成相同的「無對等證書可用」消息。 –
如上所述,我在啓動jconsle時指定了相同的密鑰庫和信任庫文件。但這根本不會改變行爲。我完全不相信問題出在客戶端,因爲當我運行我在原始問題中提到的「openssl s_client」命令時,我甚至無法獲得有效的SSL握手。既然它說沒有證書可用,並且沒有發送CA名稱,那麼它在服務器端看起來就像是一個問題。 –
如果您使用相同的商店爲客戶端和服務器,他們必須「交叉」 - 例如。 服務器:{truststore = store1,keystore = store2},客戶端:{truststore = store2,keystore = store1} –