我的应用程序中有一个 sslscoket 作为服务器,我正在运行 java 1.6。我需要握手期间使用的主密钥来实现 MS-CHAP 质询响应等。我已经读过“这个主密钥的值只有底层安全套接字实现才知道,并且不会通过 SSLSession API 公开”
如何获取主密钥的值?
谢谢
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());
}
过了一会儿,我设法获得了 TLS hanshake 中使用的主密钥。可以使用反射和 SSLSessionImpl.class 来获得它
它不能通过 API 获得。正如你的报价所说。
注意主密钥不是密钥。