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

bab*_*est 7 openssl

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

jww*_*jww 7

有没有办法在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);
Run Code Online (Sandbox Code Playgroud)

你可以SSL*用:

int rc = SSL_set_cipher_list(ssl, "ALL:!NULL-MD5:!NULL-SHA");
assert(0 != rc);
Run Code Online (Sandbox Code Playgroud)

在上面,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);
Run Code Online (Sandbox Code Playgroud)

你可以用以下方式做到SSL*:

int rc = SSL_set_cipher_list(ssl, "ALL:!EXP");
assert(0 != rc);
Run Code Online (Sandbox Code Playgroud)

你可以看到"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...
Run Code Online (Sandbox Code Playgroud)

您可以使用以下公式计算密码套件的数量:

$ openssl ciphers 'ALL:!EXP' | tr ':' ' ' | wc -w
     124
Run Code Online (Sandbox Code Playgroud)

这告诉你ClientHello,由于124个密码套件,你将使用至少248个字节.理想情况下,您应该宣传您真正想要的16个左右的套房.


您通常"HIGH"只使用密码套件.它排除了"MEDIUM","LOW""EXP".这是我的电话有时看起来的样子:

int rc = SSL_CTX_set_cipher_list(ctx, "HIGH:!ADH:!MD5:!RC4:!SRP:!PSK:!DSS");
assert(0 != rc);
Run Code Online (Sandbox Code Playgroud)

请务必排除匿名gear(!ADH),因为默认情况下包含它.!MD5!RC4被使用,因为它们是弱/人受伤.!SRP,!PSK!DSS,用于进一步修剪密码列表,因为它们通常不被使用.

你也可以用a 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;
}
Run Code Online (Sandbox Code Playgroud)