|
17 | 17 | */
|
18 | 18 | package org.apache.hadoop.hbase.ipc;
|
19 | 19 |
|
| 20 | +import static org.junit.Assert.assertArrayEquals; |
20 | 21 | import static org.junit.Assert.assertNotNull;
|
21 | 22 | import static org.junit.Assert.assertTrue;
|
| 23 | +import static org.mockito.Mockito.mock; |
| 24 | +import static org.mockito.Mockito.when; |
22 | 25 |
|
| 26 | +import java.io.ByteArrayInputStream; |
| 27 | +import java.net.InetSocketAddress; |
| 28 | +import java.net.SocketAddress; |
| 29 | +import java.nio.charset.StandardCharsets; |
| 30 | +import java.security.cert.Certificate; |
| 31 | +import java.security.cert.CertificateException; |
| 32 | +import java.security.cert.CertificateFactory; |
| 33 | +import java.security.cert.X509Certificate; |
23 | 34 | import java.util.Arrays;
|
24 | 35 | import java.util.Collection;
|
| 36 | +import javax.net.ssl.SSLEngine; |
| 37 | +import javax.net.ssl.SSLPeerUnverifiedException; |
| 38 | +import javax.net.ssl.SSLSession; |
25 | 39 | import org.apache.hadoop.hbase.HBaseClassTestRule;
|
26 | 40 | import org.apache.hadoop.hbase.HBaseTestingUtil;
|
27 | 41 | import org.apache.hadoop.hbase.TableName;
|
|
47 | 61 | import org.junit.runners.Parameterized;
|
48 | 62 | import org.junit.runners.Parameterized.Parameters;
|
49 | 63 |
|
| 64 | +import org.apache.hbase.thirdparty.io.netty.handler.ssl.SslHandler; |
| 65 | + |
50 | 66 | @Category({ RPCTests.class, MediumTests.class })
|
51 | 67 | @RunWith(Parameterized.class)
|
52 | 68 | public class TestNettyRpcServer {
|
@@ -122,4 +138,51 @@ protected void doTest(TableName tableName) throws Exception {
|
122 | 138 | }
|
123 | 139 | }
|
124 | 140 |
|
| 141 | + private static final String CERTIFICATE = "-----BEGIN CERTIFICATE-----\n" |
| 142 | + + "MIIEITCCAwmgAwIBAgIUaLL8vLOhWLCLXVHEJqXJhfmsTB8wDQYJKoZIhvcNAQEL\n" |
| 143 | + + "BQAwgawxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNldHRzMRIwEAYD\n" |
| 144 | + + "VQQHDAlDYW1icmlkZ2UxGDAWBgNVBAoMD25ldHR5IHRlc3QgY2FzZTEYMBYGA1UE\n" |
| 145 | + + "CwwPbmV0dHkgdGVzdCBjYXNlMRgwFgYDVQQDDA9uZXR0eSB0ZXN0IGNhc2UxIzAh\n" |
| 146 | + + "BgkqhkiG9w0BCQEWFGNjb25uZWxsQGh1YnNwb3QuY29tMB4XDTI0MDEyMTE5MzMy\n" |
| 147 | + + "MFoXDTI1MDEyMDE5MzMyMFowgawxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNz\n" |
| 148 | + + "YWNodXNldHRzMRIwEAYDVQQHDAlDYW1icmlkZ2UxGDAWBgNVBAoMD25ldHR5IHRl\n" |
| 149 | + + "c3QgY2FzZTEYMBYGA1UECwwPbmV0dHkgdGVzdCBjYXNlMRgwFgYDVQQDDA9uZXR0\n" |
| 150 | + + "eSB0ZXN0IGNhc2UxIzAhBgkqhkiG9w0BCQEWFGNjb25uZWxsQGh1YnNwb3QuY29t\n" |
| 151 | + + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy+qzEZpQMjVdLj0siUcG\n" |
| 152 | + + "y8LIHOW4S+tgHIKFkF865qWq6FVGbROe2Z0f5W6yIamZkdxzptT0iv+8S5okNNeW\n" |
| 153 | + + "2NbsN/HNJIRtWfxku1Jh1gBqSkAYIjXyq7+20hIaJTzzxqike9M/Lc14EGb33Ja/\n" |
| 154 | + + "kDPRV3UtiM3Ntf3eALXKbrWptkbgQngCaTgtfg8IkMAEpP270wZ9fW0lDHv3NPPt\n" |
| 155 | + + "Zt0QSJzWSqWfu+l4ayvcUQYyNJesx9YmTHSJu69lvT4QApoX8FEiHfNCJ28R50CS\n" |
| 156 | + + "aIgOpCWUvkH7rqx0p9q393uJRS/S6RlLbU30xUN1fNrVmP/XAapfy+R0PSgiUi8o\n" |
| 157 | + + "EQIDAQABozkwNzAWBgNVHRIEDzANggt3d3cuZm9vLmNvbTAdBgNVHQ4EFgQUl4FD\n" |
| 158 | + + "Y8jJ/JHJR68YqPsGUjUJuwgwDQYJKoZIhvcNAQELBQADggEBADVzivYz2M0qsWUc\n" |
| 159 | + + "jXjCHymwTIr+7ud10um53FbYEAfKWsIY8Pp35fKpFzUwc5wVdCnLU86K/YMKRzNB\n" |
| 160 | + + "zL2Auow3PJFRvXecOv7dWxNlNneLDcwbVrdNRu6nQXmZUgyz0oUKuJbF+JGtI+7W\n" |
| 161 | + + "kRw7yhBfki+UCSQWeDqvaWzgmA4Us0N8NFq3euAs4xFbMMPMQWrT9Z7DGchCeRiB\n" |
| 162 | + + "dkQBvh88vbR3v2Saq14W4Wt5rj2++vXWGQSeAQL6nGbOwc3ohW6isNNV0eGQQTmS\n" |
| 163 | + + "khS2d/JDZq2XL5RGexf3CA6YYzWiTr9YZHNjuobvLH7mVnA2c8n6Zty/UhfnuK1x\n" + "JbkleFk=\n" |
| 164 | + + "-----END CERTIFICATE-----"; |
| 165 | + |
| 166 | + @Test |
| 167 | + public void testHandshakeCompleteHandler() |
| 168 | + throws SSLPeerUnverifiedException, CertificateException { |
| 169 | + NettyServerRpcConnection conn = mock(NettyServerRpcConnection.class); |
| 170 | + SslHandler sslHandler = mock(SslHandler.class); |
| 171 | + SocketAddress remoteAddress = new InetSocketAddress("localhost", 5555); |
| 172 | + SSLEngine engine = mock(SSLEngine.class); |
| 173 | + SSLSession session = mock(SSLSession.class); |
| 174 | + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); |
| 175 | + X509Certificate x509Certificate = (X509Certificate) certificateFactory |
| 176 | + .generateCertificate(new ByteArrayInputStream(CERTIFICATE.getBytes(StandardCharsets.UTF_8))); |
| 177 | + Certificate[] certificates = new Certificate[] { x509Certificate }; |
| 178 | + |
| 179 | + when(sslHandler.engine()).thenReturn(engine); |
| 180 | + when(engine.getSession()).thenReturn(session); |
| 181 | + when(session.getPeerCertificates()).thenReturn(certificates); |
| 182 | + |
| 183 | + NettyRpcServer.sslHandshakeCompleteHandler(conn, sslHandler, remoteAddress); |
| 184 | + |
| 185 | + assertArrayEquals(certificates, conn.clientCertificateChain); |
| 186 | + } |
| 187 | + |
125 | 188 | }
|
0 commit comments