我想创建一个TLS套接字连接。我知道TLS有几种交换密钥的方法,例如。 RSA,Diffie-Hellman等。如何强制使用Diffie-Hellman密钥交换而不是其他形式的密钥交换?
我知道如果使用Diffie-Hellman密钥交换,它很容易受到中间人攻击。使用RSA时,我们有服务器身份验证,可以防止MITM。但我担心的一个问题是使用RSA禁止向前保密。
我该怎么办?
答案 0 :(得分:3)
通过选择支持该密钥交换方法的密码套件来指定密钥交换方法。
您可以使用setEnabledCipherSuites
在SSLSocket
(或SSLEngine
)上设置密码套件。
SunJSSE provider documentation中提供了受支持的密码套件表以及默认情况下使用Oracle JRE启用的密码套件表。
匿名密码套件(_DH_anon_
)是易受MITM攻击的软件。
_DH_RSA_
或_DH_DSA_
密码套件还使用RSA或DSA来验证DH密钥交换(不是密钥交换本身),以防止MITM攻击。此外, Ephemeral DH密码套件(包含_DHE_
或_ECDHE_
的椭圆曲线变体)提供完美前向保密。 (无论如何,Sun JSSE提供商都不支持非短暂的_DH_RSA_
或_DH_DSA_
密码套件。)