You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SSL_CTX_set_cipher_list()不生效,如何禁用OpenSSL服务器弱密码套件?

解决OpenSSL C服务器弱密码套件问题

看起来你踩了OpenSSL密码套件配置的一个常见坑——别着急,咱们一步步排查解决:

1. 确认OpenSSL版本对应的正确函数

如果你的OpenSSL是1.1.0及以上版本,SSL_CTX_set_cipher_list()其实是兼容旧版本的接口,对于TLSv1.2+的场景,推荐用SSL_CTX_set_ciphersuites()来设置,它的优先级更高,也更适配现代TLS协议。

把你原来的替换成这个试试:

// 替换掉原来的SSL_CTX_set_cipher_list调用
if (SSL_CTX_set_ciphersuites(ctx, "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256") != 1) {
    ERR_print_errors_fp(stderr);
    abort();
}

这个列表只包含经过安全验证的现代套件,直接把你提到的NULL-MD5、NULL-SHA这类弱套件排除在外了。

2. 检查代码执行顺序是否正确

一定要确保设置密码套件的代码是在初始化SSL上下文之后,创建任何SSL连接之前执行的,而且后面没有其他代码覆盖这个配置。正确的流程应该是这样:

ctx = InitServerCTX(); /* 初始化SSL上下文 */
// 在这里立刻设置密码套件,别拖到后面
if (SSL_CTX_set_ciphersuites(ctx, "你的安全套件列表") != 1) {
    ERR_print_errors_fp(stderr);
    abort();
}
// 之后再加载证书、密钥,创建socket、处理连接这些操作

3. 用更严格的套件字符串彻底禁用弱项

如果坚持要用SSL_CTX_set_cipher_list(),可以用更精确的筛选字符串,直接把所有弱套件踢出去:

SSL_CTX_set_cipher_list(ctx, "HIGH:!MEDIUM:!LOW:!NULL:!MD5:!SHA1")

这里的HIGH指代高安全级别的套件,后面的!前缀就是排除对应的类别,直接把中等、低安全、空加密、MD5哈希、SHA1哈希的套件全部禁用。

4. 验证配置是否真的生效

配置完后,用openssl命令验证下效果:

openssl s_client -connect 你的服务器IP:端口 -cipher "NULL-MD5"

如果连接失败,说明这个弱套件已经被禁用;要是还能连上,那就要检查是不是有其他代码(比如后续针对单个SSL对象调用SSL_set_cipher_list)覆盖了上下文的设置,或者函数调用有误。

内容的提问来源于stack exchange,提问作者MOHAMED

火山引擎 最新活动