|   | 1 | = Mutual TLS Connectivity | 
          
          
            |   | 2 | This page isn't strictly related to MadMartian Mod but it is necessary for JMX over TLS which we use to monitor MadMartian Mod remotely and securely. | 
          
          
            |   | 3 |  | 
          
          
            |   | 4 | == Mutual Trust | 
          
          
            |   | 5 | Both the client (Java Mission Control) and the server (JMX) require three things: | 
          
          
            |   | 6 | * Self-signed certificate | 
          
          
            |   | 7 | * Private key | 
          
          
            |   | 8 | * Trust store | 
          
          
            |   | 9 |  | 
          
          
            |   | 10 | Self-signed certificates come with a private key (standard PKI), that's the infamous pair right there (you hare).  The trust store is for storing the other side's public key. | 
          
          
            |   | 11 |  | 
          
          
            |   | 12 | == Generate Self-Signed Certificate and Private Key Store | 
          
          
            |   | 13 | Before we get started it is imperative that the store passwords match the private key passwords, otherwise you'll get unrecoverable key errors when trying to handshake. | 
          
          
            |   | 14 |  | 
          
          
            |   | 15 | First step is to generate a private key: | 
          
          
            |   | 16 | {{{#!sh | 
          
          
            |   | 17 | openssl genrsa -out my.key 2048 | 
          
          
            |   | 18 | }}} | 
          
          
            |   | 19 |  | 
          
          
            |   | 20 | Then create the certificate from it: | 
          
          
            |   | 21 | {{{#!sh | 
          
          
            |   | 22 | openssl req -x509 -new -nodes -key my.key -sha256 -days 1024 -out my.pem | 
          
          
            |   | 23 | }}} | 
          
          
            |   | 24 |  | 
          
          
            |   | 25 | Now create a PKCS12 store from the PKI pair (private key + public cert): | 
          
          
            |   | 26 | {{{#!sh | 
          
          
            |   | 27 | openssl pkcs12 -export -name my-side -in my.pem -inkey my.key -out my.p12 | 
          
          
            |   | 28 | }}} | 
          
          
            |   | 29 | Replace ''my-side'' with the side that the certificate belongs to ('server' if it will reside on the server and be trusted by the client and vice versa for the client) | 
          
          
            |   | 30 |  | 
          
          
            |   | 31 | Import the PKCS12 store into a local JKS: | 
          
          
            |   | 32 | {{{#!sh | 
          
          
            |   | 33 | keytool -importkeystore -destkeystore my.jks -srckeystore my.p12 -srcstoretype pkcs12 -alias my-side | 
          
          
            |   | 34 | }}} | 
          
          
            |   | 35 |  | 
          
          
            |   | 36 | == Trust The Other Side's Certificate | 
          
          
            |   | 37 | Once you have completed generating certificates for both sides you must now create the trust relationship between them: | 
          
          
            |   | 38 |  | 
          
          
            |   | 39 | Trust the ''other'' side's certificate: | 
          
          
            |   | 40 | {{{#!sh | 
          
          
            |   | 41 | keytool -import -alias other-side -file other.pem -keystore my.trust.jks | 
          
          
            |   | 42 | }}} |