我想保护我的服务器免受FREAK攻击,因此我想禁用所有使用Openssl的导出级RSA密钥的密码套件。有没有办法在openssl中禁用特定的密码套件?如果是的话,我该怎么做?
答案 0 :(得分:5)
有没有办法在openssl中禁用特定的密码套件?如果是的话,我该怎么做?
要回答禁用特定密码套件的直接问题,请将其从传递给SSL_CTX_set_cipher_list
或SSL_CTX_set_cipher_list
的密码套件列表中删除:
int rc = SSL_CTX_set_cipher_list(ctx, "ALL:!NULL-MD5:!NULL-SHA");
assert(0 != rc);
您可以在SSL*
上执行以下操作:
int rc = SSL_set_cipher_list(ssl, "ALL:!NULL-MD5:!NULL-SHA");
assert(0 != rc);
在上文中,NULL-MD5
为SSL_RSA_WITH_NULL_MD5
,NULL-SHA
为SSL_RSA_WITH_NULL_SHA
。您可以从openssl ciphers
命令获取映射列表。
您还可以使用!EXP
禁用导出密码:
int rc = SSL_CTX_set_cipher_list(ctx, "ALL:!EXP");
assert(0 != rc);
你可以在SSL*
上使用:
int rc = SSL_set_cipher_list(ssl, "ALL:!EXP");
assert(0 != rc);
你可以看到"ALL:!EXP"
等同于OpenSSL命令(注意单引号,所以shell没有抓住爆炸声):
$ openssl ciphers 'ALL:!EXP'
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:
ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:SRP-DSS-AES-256-CBC-SHA:
SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:DH-DSS-AES256-GCM-SHA384...
您可以使用以下代码计算密码套件的数量:
$ openssl ciphers 'ALL:!EXP' | tr ':' ' ' | wc -w
124
由于124个密码套件,它告诉您ClientHello
将使用至少248个字节。理想情况下,您应该宣传真正想要的16个左右套房。
您通常只使用"HIGH"
配置密码套件。它排除了"MEDIUM"
,"LOW"
和"EXP"
。以下是我的电话有时看起来的方式:
int rc = SSL_CTX_set_cipher_list(ctx, "HIGH:!ADH:!MD5:!RC4:!SRP:!PSK:!DSS");
assert(0 != rc);
请务必排除匿名设备(!ADH
),因为它默认包含在内。使用!MD5
和!RC4
因为他们很弱/受伤。 !SRP
,!PSK
和!DSS
用于进一步修剪密码列表,因为它们通常不会被使用。
您也可以使用SSL*
和SSL_set_cipher_list
。
如果您在服务器上调用SSL_CTX_set_cipher_list
和SSL_set_cipher_list
,则会根据证书中的密钥类型进一步修剪密码套件列表。
在上一个区块中,我说 ......我的电话有时看起来像。通常,我喜欢指定我想要使用的16个左右:
string GetCipherSuites()
{
static string ciphers = ""
#if defined(ALLOW_ECDSA)
"ECDHE-ECDSA-AES256-GCM-SHA384:"
"ECDHE-ECDSA-AES128-GCM-SHA256:"
#endif
"ECDHE-RSA-AES256-GCM-SHA384:"
"ECDHE-RSA-AES128-GCM-SHA256:"
#if defined(ALLOW_DSA)
"DHE-DSS-AES256-GCM-SHA384:"
#endif
"DHE-RSA-AES256-GCM-SHA384:"
#if defined(ALLOW_DSA)
"DHE-DSS-AES128-GCM-SHA256:"
#endif
"DHE-RSA-AES128-GCM-SHA256:"
#if defined(ALLOW_DSA)
"DHE-DSS-AES256-SHA:"
#endif
"DHE-RSA-AES256-SHA:"
#if defined(ALLOW_DSA)
"DHE-DSS-AES128-SHA:"
#endif
"DHE-RSA-AES128-SHA:"
#if defined(ALLOW_DSA)
"EDH-DSS-DES-CBC3-SHA:"
#endif
"EDH-RSA-DES-CBC3-SHA:"
#if defined(ALLOW_DSA)
"DH-DSS-DES-CBC3-SHA:"
#endif
"DH-RSA-DES-CBC3-SHA:";
return ciphers;
}