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