我有我的JMX服务器,它注册从本地文件读取的bean,并根据需要将它们提供给其他JMX客户端。 可以使用“jconsole”或在Tomcat容器下运行的Java应用程序访问服务器。
我想要的是添加身份验证以防止访问JMX Server的“未知”身份。为此,我使用以下JVM选项添加了Kerberos authentication @ server
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=5555
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=false
-Djava.security.auth.login.config=./conf/jaas.conf
-Djava.security.krb5.conf=./conf/krb5.conf
-Dcom.sun.management.jmxremote.login.config=MyKrbAuth
-Ddynamic.mbean.store=./conf/mbeans
-Djava.net.preferIPv4Stack=true
我的jaas.conf看起来像这个>>
MyKrbAuth {
com.sun.security.auth.module.Krb5LoginModule required debug=true debugNative=true;
};
当我使用上述配置启动我的JMX服务器并尝试使用“jconsole”连接它时,我在客户端获得以下异常并且连接失败>>
Cipher: Crypto Permission check failed
Cipher: granted: (CryptoPermission * 128)
Cipher: requesting: (CryptoPermission AES 256)
但在服务器身份验证似乎成功>>
[java] [STARTED] Mbean Server
[java] Debug is true storeKey false useTicketCache false useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false
[java] [Krb5LoginModule] user entered username: username
[java]
[java] Acquire TGT using AS Exchange
[java] principal is user@localhost.com
[java] EncryptionKey: keyType=3 keyBytes (hex dump)=0000: FD 46 7C 02 19 9B 34 E9
[java] EncryptionKey: keyType=1 keyBytes (hex dump)=0000: FD 46 7C 02 19 9B 34 E9
[java] EncryptionKey: keyType=23 keyBytes (hex dump)=0000: FE 6D 82 01 8A D7 AB 60 98
[java] EncryptionKey: keyType=16 keyBytes (hex dump)=0000: 89 02 31 5D F7 5B 3E 89 BC F7 8A 01 A1 80 C7
[java] EncryptionKey: keyType=17 keyBytes (hex dump)=0000: A5 67 71 17 F6 57 A9 26 01 09 B1 EB 75 46 6C
[java]
[java] Commit Succeeded
[java]
从上面看来,客户端似乎无法解码响应(这是AES256加密)..如何解决???
答案 0 :(得分:4)
您需要在Java安装中包含unlimited strength cryptography policy file(链接用于Java 6,其他人请参阅java.oracle.com)。默认情况下,Java不允许您使用像AES256这样的强加密(因为美国出口法律荒谬,认为加密是武器/弹药)。策略文件将解锁更强大的加密。
答案 1 :(得分:3)
管理修复上述问题。 以下是在JMX客户端/服务器上引入Kerberos身份验证/授权的步骤
启用Kerberos @ JMX服务器,
使用以下一组args =>
启动服务器-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=<port_no>
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=false
-Djava.security.auth.login.config=<locatin_of_jaas.conf>
-Djava.security.krb5.conf=<locatin_of_krb5.conf>
-Dcom.sun.management.jmxremote.login.config=<name_of_login_config_to_be_used>
-Djava.net.preferIPv4Stack=true
在$ JAVA_HOME / jre / lib / management / jmxremote.access中添加访问项。用户通过身份验证后,将根据jmxremote.access提供对JMX服务器的读/写访问权限。可以使用服务器启动时的以下jvm arg提供.access文件的位置
-Dcom.sun.management.jmxremote.access.file=<acees_control_file>
启用Kerberos @ JMX客户端(jconsole)
使用调试选项启动jconsole&amp;连接到服务器
jconsole -J-Djava.security.debug=all
如果请求的加密是AES256,则下载unlimited strength cryptography policy jar files,解压缩并将策略文件放在$ JAVA_HOME / jre / lib / security /。 [感谢Mark指出政策包含。]
上面应该使Kerberos在JMX客户端和JMX服务器端都能正常工作
如果您仍然遇到连接问题,那么您可以使用logging.properties file =&gt;
为jconsole启用详细调试handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
// Use FINER or FINEST for javax.management.remote.level - FINEST is very verbose...
javax.management.level = FINEST
javax.management.remote.level = FINER
使用
启动jconsolejconsole -J-Djava.util.logging.config.file=<location_of_logging.properties>
答案 2 :(得分:0)
如果我在jconsole中输入我的用户ID和密码,我已按照上面的说明设法让kerberos认证正常工作。由于我在服务器上设置了com.sun.management.jmxremote.ssl = false,因此不可避免地会以明文形式通过网络发送密码。
您是否设法通过在客户端使用缓存票证来连接jconsole?例如,如果您这样做:
kinit user
Password for user@REALM:
New ticket is stored in cache file C:\Users\user\krb5cc_user
然后尝试将jconsole连接到服务器而不输入您的用户名/密码?