我有这个简单的JMX客户端
public void testTomcatBasicAuthentication() throws Exception { System.out.println("Test Server Basic Authentication"); try { String truststore = "C:\\client.jks"; String trustStorePassword = "password"; JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9999/jmxrmi"); HashMap environment = new HashMap(); String[] credentials = new String[] { "user", "passwd" }; environment.put(JMXConnector.CREDENTIALS, credentials); // environment.put("javax.net.ssl.trustStore", truststore); // environment.put("javax.net.ssl.trustStorePassword", trustStorePassword); // environment.put("javax.net.ssl.keyStore", truststore); // environment.put("javax.net.ssl.keyStorePassword", trustStorePassword); KeyManager[] kms = getKeyManagers(truststore, trustStorePassword); TrustManager[] tms = getTrustManagers(truststore, trustStorePassword); System.setProperty("javax.net.ssl.trustStore", truststore); System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword); System.setProperty("javax.net.ssl.keyStore", truststore); System.setProperty("javax.net.ssl.keyStorePassword", trustStorePassword); JMXConnector jmxc = JMXConnectorFactory.connect(url, environment); MBeanServerConnection server = jmxc.getMBeanServerConnection(); Sets2 = server.queryNames(new ObjectName("Catalina:type=Server,*"), null); for (ObjectName obj : s2) { ObjectName objname = new ObjectName(obj.getCanonicalName()); System.out.println("serverInfo " + server.getAttribute(objname, "serverInfo")); System.out.println("address " + server.getAttribute(objname, "address")); System.out.println("stateName " + server.getAttribute(objname, "stateName")); } } catch (Exception e) { e.printStackTrace(); } }
我如何System.setProperty(....)
用Java代码替换?我不想用System.setProperty
.
编辑.我找到了这个例子
我们可以使用这段代码吗?
KeyManager[] kms = getKeyManagers(truststore, trustStorePassword); TrustManager[] tms = getTrustManagers(truststore, trustStorePassword); SslContext.setCurrentSslContext(new SslContext(kms, tms, null)); private static TrustManager[] getTrustManagers(String location, String password) throws IOException, GeneralSecurityException { // First, get the default TrustManagerFactory. String alg = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmFact = TrustManagerFactory.getInstance(alg); FileInputStream fis = new FileInputStream(location); KeyStore ks = KeyStore.getInstance("jks"); ks.load(fis, password.toCharArray()); fis.close(); tmFact.init(ks); // And now get the TrustManagers TrustManager[] tms = tmFact.getTrustManagers(); return tms; } private static KeyManager[] getKeyManagers(String location, String password) throws IOException, GeneralSecurityException { // First, get the default KeyManagerFactory. String alg = KeyManagerFactory.getDefaultAlgorithm(); KeyManagerFactory kmFact = KeyManagerFactory.getInstance(alg); FileInputStream fis = new FileInputStream(location); KeyStore ks = KeyStore.getInstance("jks"); ks.load(fis, password.toCharArray()); fis.close(); // Now we initialise the KeyManagerFactory with this KeyStore kmFact.init(ks, password.toCharArray()); // And now get the KeyManagers KeyManager[] kms = kmFact.getKeyManagers(); return kms; } private static KeyStore keyStoreFromCertificateString(String alias, String certificateString) throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException { KeyStore ks = KeyStore.getInstance("jks"); ks.load(null); // Create empty key store CertificateFactory cf = CertificateFactory.getInstance("X.509"); Certificate cert = cf.generateCertificate(new ByteArrayInputStream(certificateString.getBytes())); ks.setEntry(alias, new KeyStore.TrustedCertificateEntry(cert), null); return ks; }
您能否想一想我们如何整合这些代码,或者应该有其他解决方案?
它似乎应该相对容易,但事实并非如此.
您需要在环境中传递实际的套接字工厂类,请参阅此示例.但是,该示例中使用的实现使用jvm默认套接字工厂.相反,您需要SSL*SocketFactory
使用适当的密钥库和信任库来设置自己的实例.然后,您需要RMI*SocketFactory
使用配置的套接字工厂实现自己的实例.您可以使用jdk impls作为指南,SslRMIClientSocketFactory和SslRMIServerSocketFactory.