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




