2

我的应用程序中有一个 sslscoket 作为服务器,我正在运行 java 1.6。我需要握手期间使用的主密钥来实现 MS-CHAP 质询响应等。我已经读过“这个主密钥的值只有底层安全套接字实现才知道,并且不会通过 SSLSession API 公开”

如何获取主密钥的值?

谢谢

4

3 回答 3

2
Enumeration<byte[]> e = sslContext.sessionContext().getIds();
    while ( e.hasMoreElements() ) {
        byte[] b = e.nextElement();
        System.out.println("session id: " + DatatypeConverter.printHexBinary(b).toLowerCase());
        SSLSession session = sslContext.sessionContext().getSession(b);
        Class<?> c = Class.forName("sun.security.ssl.SSLSessionImpl");
        Field masterSecretField = c.getDeclaredField("masterSecret");
        masterSecretField.setAccessible(true);
        SecretKey k = (SecretKey)masterSecretField.get(session);
        System.out.println("secret: " + DatatypeConverter.printHexBinary(k.getEncoded()).toLowerCase());

    }
于 2017-01-17T09:29:10.290 回答
0

过了一会儿,我设法获得了 TLS hanshake 中使用的主密钥。可以使用反射和 SSLSessionImpl.class 来获得它

于 2013-05-21T13:48:53.047 回答
-1

它不能通过 API 获得。正如你的报价所说。

注意主密钥不是密钥。

于 2013-03-22T09:12:56.733 回答