C++ OpenSSL密码套件配置问题:移除指定套件及末尾255编码排查
解决OpenSSL密码套件配置的两个问题:移除指定套件与末尾255编码的处理
一、正确移除指定密码套件的方法
你之前用-符号尝试移除套件却没成功,核心原因是没搞清楚OpenSSL密码套件字符串里-和!的区别:
-套件名:只是从当前启用的套件列表中临时移除,但该套件仍属于OpenSSL的可用集合,若后续有其他规则触发,可能还会被重新加入。!套件名:完全禁用该套件,无论任何场景都不会出现在最终的套件列表里,这才是彻底移除的正确姿势。
另外还要注意两个配置函数的分工:
SSL_set_ciphersuites:仅负责配置TLS 1.3的密码套件,对TLS 1.2及以下版本的套件不起作用。SSL_set_cipher_list:专门处理TLS 1.2及更早版本的套件配置。
如果需要同时管控不同TLS版本的套件,要分别调用这两个函数。比如你要移除TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,正确写法应该是:
// 配置TLS 1.3套件并排除指定项 SSL_set_ciphersuites(ssl, "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:!TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"); // 配置TLS 1.2及以下套件(按需调整) SSL_set_cipher_list(ssl, "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:!ECDHE-ECDSA-CHACHA20-POLY1305");
二、末尾出现编码255的原因与解决方法
你看到的编码255对应的是TLS_EMPTY_RENEGOTIATION_INFO_SCSV,它不是真正的密码套件,而是OpenSSL自动添加的一个安全重协商标记。这个标记的作用是告知服务器:客户端支持安全的TLS重协商机制,规避旧重协商流程的漏洞。
为什么会自动出现?
OpenSSL默认会在密码套件列表末尾自动注入这个SCSV,哪怕你完全没手动配置它。它不会影响实际的加密握手(服务器不会选择它作为加密套件),但会出现在你输出的套件列表里。
移除它的方法
如果你的业务场景严格要求列表中不能有这个标记,可以通过禁用TLS重协商的选项来实现:
// 在创建SSL对象后,设置禁用重协商的选项 SSL_set_options(ssl, SSL_OP_NO_RENEGOTIATION);
设置后,OpenSSL就不会再把这个255的SCSV添加到套件列表中了。需要注意的是,禁用重协商后,已建立的TLS连接无法再进行重协商操作,如果你的业务不需要这个功能,这个设置是完全安全的。
内容的提问来源于stack exchange,提问作者Kiwi
相关产品推荐
相关产品推荐

