如何在openssl中禁用特定的密码套件?

时间:2015-03-20 09:10:22

标签: openssl

我想保护我的服务器免受FREAK攻击,因此我想禁用所有使用Openssl的导出级RSA密钥的密码套件。有没有办法在openssl中禁用特定的密码套件?如果是的话,我该怎么做?

1 个答案:

答案 0 :(得分:5)

  

有没有办法在openssl中禁用特定的密码套件?如果是的话,我该怎么做?

要回答禁用特定密码套件的直接问题,请将其从传递给SSL_CTX_set_cipher_listSSL_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-MD5SSL_RSA_WITH_NULL_MD5NULL-SHASSL_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_listSSL_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;
}