【发布时间】:2012-08-09 04:17:40
【问题描述】:
我知道返回公钥类型的方法.getPublicKey()。但是,这个函数并没有说明使用了哪种类型的密钥交换(EDH 或 RSA)。如果我是对的,它只返回公钥的类型。我的问题是:当我启动与远程服务器的 SSL 连接时,如何获得使用的密钥交换和身份验证协议?
【问题讨论】:
标签: java sockets ssl network-programming
我知道返回公钥类型的方法.getPublicKey()。但是,这个函数并没有说明使用了哪种类型的密钥交换(EDH 或 RSA)。如果我是对的,它只返回公钥的类型。我的问题是:当我启动与远程服务器的 SSL 连接时,如何获得使用的密钥交换和身份验证协议?
【问题讨论】:
标签: java sockets ssl network-programming
我假设.getPublicKey()是Certificate的方法
您可以使用PublicKey#getAlgorithm() 来查找算法
字符串 getAlgorithm()
返回此键的标准算法名称。例如,“DSA” 将表明此密钥是 DSA 密钥。请参阅 Java 中的附录 A 密码体系结构 API 规范和参考 有关标准算法名称的信息。
【讨论】:
从SSLSocket 或SSLEngine,首先获取SSLSession,它将为您提供有关当前 SSL/TLS 会话的一些信息。
如果您使用getCipherSuite(),您将获得密码套件名称,其中包含密钥交换类型(和加密算法)。在 Oracle JRE 中实现的密码套件在 SunJSSE provider documentation 中列出。您可以在TLS specification 中找到命名约定:TLS_ 之后的第一部分(或旧名称的SSL_)和_WITH_ 之前的第一部分将告诉您密钥交换算法(DHE_DSS、DHE_RSA、@ 987654334@,DH_DSS,DH_RSA,NULL或RSA):一个比较简单的正则表达式应该可以提取出相关信息。
(你提到了getPublicKey(),但你没有说你在哪里调用它。它必须适用于服务器的证书,也从SSLSession获得。)
【讨论】:
getProtocol() 之外,我可以通过其他方式获得它吗?
getProtocol()之外没有其他方法,但应该足够了。
getProtocol(),这是我知道的方法。我想知道这条信息是否可以被另一个函数提取?