28
28
import static org .junit .Assert .assertTrue ;
29
29
import static org .junit .Assume .assumeTrue ;
30
30
31
+ import java .io .File ;
31
32
import java .io .IOException ;
32
33
import java .lang .management .ClassLoadingMXBean ;
33
34
import java .lang .management .ManagementFactory ;
39
40
import java .lang .management .GarbageCollectorMXBean ;
40
41
import java .lang .management .MemoryPoolMXBean ;
41
42
import java .lang .management .MemoryUsage ;
43
+ import java .nio .file .Files ;
44
+ import java .nio .file .attribute .PosixFilePermission ;
42
45
import java .util .HashMap ;
43
- import java .util .List ;
46
+ import java .util .HashSet ;
44
47
import java .util .Map ;
48
+ import java .util .Set ;
49
+ import java .util .List ;
45
50
46
51
import jdk .management .jfr .FlightRecorderMXBean ;
47
52
import org .graalvm .nativeimage .ImageInfo ;
58
63
import javax .management .remote .JMXConnector ;
59
64
import javax .management .remote .JMXConnectorFactory ;
60
65
import javax .management .remote .JMXServiceURL ;
66
+ import javax .rmi .ssl .SslRMIClientSocketFactory ;
67
+
61
68
import org .junit .Assert ;
62
69
63
70
@ AddExports ("jdk.management.agent/jdk.internal.agent" )
64
71
public class JmxTest {
65
72
static final String PORT_PROPERTY = "com.sun.management.jmxremote.port" ;
73
+ static final String RMI_PORT_PROPERTY = "com.sun.management.jmxremote.rmi.port" ;
66
74
static final String AUTH_PROPERTY = "com.sun.management.jmxremote.authenticate" ;
75
+ static final String CLIENT_AUTH_PROPERTY = "com.sun.management.jmxremote.ssl.need.client.auth" ;
76
+ static final String ACCESS_PROPERTY = "com.sun.management.jmxremote.access.file" ;
77
+ static final String PASSWORD_PROPERTY = "com.sun.management.jmxremote.password.file" ;
67
78
static final String SSL_PROPERTY = "com.sun.management.jmxremote.ssl" ;
79
+ static final String KEYSTORE_PROPERTY = "javax.net.ssl.keyStore" ;
80
+ static final String KEYSTORE_PASSWORD_PROPERTY = "javax.net.ssl.keyStorePassword" ;
81
+ static final String TRUSTSTORE_PROPERTY = "javax.net.ssl.trustStore" ;
82
+ static final String TRUSTSTORE_PASSWORD_PROPERTY = "javax.net.ssl.trustStorePassword" ;
83
+ static final String REGISTRY_SSL_PROPERTY = "com.sun.management.jmxremote.registry.ssl" ;
68
84
static final String TEST_PORT = "12345" ;
69
- static final String FALSE = "false" ;
85
+ static final String TRUE = "true" ;
86
+ static final String JMX_REMOTE_RESOURCES = "src/com.oracle.svm.test/src/com/oracle/svm/test/jmx/jmxremoteresources" ;
70
87
71
88
@ BeforeClass
72
- public static void checkForJFR () {
89
+ public static void checkForJFR () throws IOException {
73
90
assumeTrue ("skipping JMX tests" , !ImageInfo .inImageCode () ||
74
91
(VMInspectionOptions .hasJmxClientSupport () && VMInspectionOptions .hasJmxServerSupport ()));
75
92
76
93
System .setProperty (PORT_PROPERTY , TEST_PORT );
77
- System .setProperty (AUTH_PROPERTY , FALSE );
78
- System .setProperty (SSL_PROPERTY , FALSE );
94
+ System .setProperty (RMI_PORT_PROPERTY , TEST_PORT );
95
+ System .setProperty (AUTH_PROPERTY , TRUE );
96
+ System .setProperty (CLIENT_AUTH_PROPERTY , TRUE );
97
+ System .setProperty (SSL_PROPERTY , TRUE );
98
+ System .setProperty (REGISTRY_SSL_PROPERTY , TRUE );
99
+ // The following are dummy password access, and SSL files required for testing
100
+ // authentication and SSL.
101
+ System .setProperty (ACCESS_PROPERTY , JMX_REMOTE_RESOURCES + "/jmxremote.access" );
102
+ System .setProperty (PASSWORD_PROPERTY , JMX_REMOTE_RESOURCES + "/jmxremote.password" );
103
+ System .setProperty (KEYSTORE_PROPERTY , JMX_REMOTE_RESOURCES + "/clientkeystore" );
104
+ System .setProperty (KEYSTORE_PASSWORD_PROPERTY , "clientpass" );
105
+ System .setProperty (TRUSTSTORE_PROPERTY , JMX_REMOTE_RESOURCES + "/servertruststore" );
106
+ System .setProperty (TRUSTSTORE_PASSWORD_PROPERTY , "servertrustpass" );
107
+
108
+ // Password file must have restricted access.
109
+ File file = new File (JMX_REMOTE_RESOURCES + "/jmxremote.password" );
110
+ Set <PosixFilePermission > perms = new HashSet <>();
111
+ perms .add (PosixFilePermission .OWNER_READ );
112
+ perms .add (PosixFilePermission .OWNER_WRITE );
113
+ Files .setPosixFilePermissions (file .toPath (), perms );
114
+
79
115
try {
80
116
// We need to rerun the startup hook with the correct properties set.
81
117
ManagementAgentStartupHook startupHook = new ManagementAgentStartupHook ();
@@ -89,7 +125,10 @@ private static MBeanServerConnection getLocalMBeanServerConnectionStatic() {
89
125
try {
90
126
JMXServiceURL jmxUrl = new JMXServiceURL ("service:jmx:rmi:///jndi/rmi://" + "localhost" + ":" + TEST_PORT + "/jmxrmi" );
91
127
Map <String , Object > env = new HashMap <>();
92
-
128
+ String [] credentials = {"myrole" , "MYP@SSWORD" }; // dummy password for testing
129
+ env .put (JMXConnector .CREDENTIALS , credentials );
130
+ // Include below if protecting registry with SSL
131
+ env .put ("com.sun.jndi.rmi.factory.socket" , new SslRMIClientSocketFactory ());
93
132
JMXConnector connector = JMXConnectorFactory .connect (jmxUrl , env );
94
133
return connector .getMBeanServerConnection ();
95
134
} catch (IOException e ) {
0 commit comments