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

How do I disable a particular cipher suite in openssl?

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

Is there a way to disable a particular cipher suite in openssl? If yes, how do i do it?

要回答禁用特定密码套件的直接问题,请将其从传递给 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是因为它们是weak/wounded。 !SRP!PSK!DSS 用于进一步 trim 密码列表,因为它们通常不被使用。

您也可以对 SSL*SSL_set_cipher_list 执行相同的操作。

如果您在服务器上调用 SSL_CTX_set_cipher_listSSL_set_cipher_list,密码套件列表将 trim 根据证书中的密钥类型进一步调整。


在上一个块中,我说 ...我的电话有时看起来如何。通常,我喜欢指定 16 左右我想使用 with:

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;
}