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

如何在openssl中禁用特定密码套件?,openssl,Openssl,我想保护我的服务器免受畸形攻击,所以我想禁用所有使用Openssl导出级RSA密钥的密码套件。有没有办法禁用openssl中的特定密码套件?如果是,我该怎么做 有没有办法禁用openssl中的特定密码套件?如果是,我该怎么做 要回答禁用特定密码套件的直接问题,请将其从传递到SSL\u CTX\u set\u cipher\u list或SSL\u CTX\u set\u cipher\u list的密码套件列表中删除: int rc = SSL_CTX_set_cipher_list(ctx,

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

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

要回答禁用特定密码套件的直接问题,请将其从传递到
SSL\u CTX\u set\u cipher\u list
SSL\u CTX\u set\u cipher\u 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);
int rc = SSL_set_cipher_list(ssl, "ALL:!EXP");
assert(0 != rc);
在上面的例子中,
NULL-MD5
SSL\u RSA\u和\u NULL\u MD5
NULL-SHA
SSL\u RSA\u和\u NULL\u SHA
。您可以从命令中获取映射列表


您还可以使用
禁用导出密码!EXP

int rc = SSL_CTX_set_cipher_list(ctx, "ALL:!EXP");
assert(0 != rc);
您可以通过以下方式在
SSL*
上执行此操作:

int rc = SSL_set_cipher_list(ssl, "ALL:!NULL-MD5:!NULL-SHA");
assert(0 != rc);
int rc = SSL_set_cipher_list(ssl, "ALL:!EXP");
assert(0 != rc);

您可以看到“ALL:!EXP”等同于OpenSSL命令的内容(请注意单引号,这样shell就不会获得bang):

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

$ openssl ciphers 'ALL:!EXP' | tr ':' ' ' | wc -w
     124
这表明由于124个密码套件,您的
ClientHello
将使用至少248个字节。理想情况下,你应该为你真正想要的16套左右的套房做广告


您通常仅使用
“高”
配置密码套件。它不包括
“中等”
“低”
“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\u set\u cipher\u列表
执行相同的操作

如果在服务器上调用
SSL\u CTX\u set\u cipher\u list
SSL\u set\u cipher\u 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;
}

了解如何在编译时禁用一个/多个特定的密码套件也很重要。也就是说,“密码套件列表”在哪里?这些更改应该发生在哪里?