java – 如何加密JConsole密码文件的密码
我正在使用JConsole访问我的应用程序MBean,并使用password.properties文件.但根据Sun的规范,此文件仅包含明文格式的密码.
com.sun.management.jmxremote.password.file = LT; someLocation> /password.properties 现在我想加密密码并将其用于JConsole的JMX用户身份验证(Remote部分中的用户名和密码字段).我可以使用任何预定义的加密逻辑或我自己的加密算法. 有没有人知道任何这样的拦截将明文密码更改为加密密码,以便JMX Framework也知道加密密码? 我当前的密码文件: guest guest admin admin 使用加密它应该看起来像: guest ENC(RjqpRYbAOwbAfAEDBdHJ7Q4l/GO5IoJidZctNT5oG64=) admin ENC(psg3EnDei6fVRuqHeLwOqNTgIWkwQTjI2+u2O7MXXWc=) 解决方法
您可以使用management.properties文件中的配置参数com.sun.management.jmxremote.login.config(请参阅%JAVA_HOME%/ lib / management / management.properties)来配置要使用的Authenticator和LoginModule.
默认值如下: JMXPluggableAuthenticator { com.sun.jmx.remote.security.FileLoginModule required; }; 它读取纯文本密码文件jmxremote.password.由于可以重新配置com.sun.jmx.remote.security.JMXPluggableAuthenticator 要重新实现FileLoginModule,您应该看看attemptAuthentication(boolean)方法, public class EncryptedFileLoginModule implements LoginModule { @Override public void initialize(Subject subject,CallbackHandler callbackHandler,Map<String,?> sharedState,?> options) { this.subject = subject; this.callbackHandler = callbackHandler; } public boolean login() throws LoginException { attemptLogin(); if (username == null || password == null) { throw new LoginException("Either no username or no password specified"); } MessageDigest instance = MessageDigest.getInstance("SHA-1"); byte[] raw = new String(password).getBytes(); byte[] crypted = instance.digest(raw); // TODO: Compare to the one stored locally if (!authenticated) throw new LoginException(); return true; } private void attemptLogin() throws LoginException { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("username"); callbacks[1] = new PasswordCallback("password",false); callbackHandler.handle(callbacks); username = ((NameCallback) callbacks[0]).getName(); user = new JMXPrincipal(username); char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword(); password = new char[tmpPassword.length]; System.arraycopy(tmpPassword,password,tmpPassword.length); ((PasswordCallback) callbacks[1]).clearPassword(); } 但是,由于这已经是服务器端,如果您不强制执行,密码仍将以纯文本形式传输 总而言之,依靠JAAS提供的现有身份验证机制可能要好得多.例如,如果 创建文件c:/temp/mysecurity.cfg: MyLoginModule { com.sun.security.auth.module.NTLoginModule REQUIRED debug=true debugNative=true; }; 接下来,配置jmxremote.access文件以包含您希望授予对JMX服务器的访问权限的用户名或角色: monitorRole readonly controlRole readwrite ... mhaller readonly (我建议启用调试模式,直到它工作.当用户尝试登录时,您将看到所有用户名,域名和组名) -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8686 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=true -Djava.net.preferIPv4Stack=true -Djava.security.auth.login.config=c:/temp/mysecurity.cfg -Dcom.sun.management.jmxremote.login.config=MyLoginModule 启动应用程序并尝试使用JConsole或VisualVM进行连接. 请注意,JConsole,您需要指定用户名和密码,尽管它不会被使用.任何密码和任何用户名都可以使用. 另请注意,远程连接时NTLoginModule不起作用,我认为你必须使用更复杂的登录模块, > com.sun.security.auth.module.Krb5LoginModule:使用Kerberos协议对用户进行身份验证 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |