如何编译含自定义旧密码套件的OpenSSL 1.0.2u解决无共享密码错误
解决OpenSSL 1.0.2u自定义密码套件不生效问题
问题背景
在树莓派64位系统编译OpenSSL 1.0.2u,启用SSLv2、TLSv1.0等旧协议并添加指定密码套件后,执行openssl ciphers -v看不到新增套件,Python SSL服务器连接时出现no shared cipher error。使用的编译命令如下:
tar -xvzf openssl-1.0.2u.tar.gz cd openssl-1.0.2u ./config enable-ssl2 enable-ssl3 enable-weak-ssl-ciphers -Wl,-rpath,/usr/local/ssl/lib --prefix=/usr/local/ssl make -j$(nproc) sudo make install
需要添加的密码套件列表:
legacy_ciphers = ( "TLS_DHE_DSS_WITH_RC4_128_SHA:" "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:" "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:" "TLS_RSA_WITH_3DES_EDE_CBC_SHA:" "TLS_RSA_WITH_RC4_128_SHA:" "TLS_RSA_WITH_RC4_128_MD5:" "TLS_DHE_RSA_WITH_DES_CBC_SHA:" "TLS_DHE_DSS_WITH_DES_CBC_SHA:" "TLS_RSA_WITH_DES_CBC_SHA:" "SSL2_DES_192_EDE3_CBC_WITH_MD5:" "SSL2_RC2_128_CBC_WITH_MD5:" "SSL2_RC4_128_WITH_MD5:" "SSL2_DES_64_CBC_WITH_MD5:" "TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA:" "TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA:" "TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA:" "TLS_RSA_EXPORT1024_WITH_RC4_56_SHA:" "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA:" "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA:" "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA:" "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5:" "TLS_RSA_EXPORT_WITH_RC4_40_MD5:" "SSL2_RC2_128_CBC_EXPORT40_WITH_MD5:" "SSL2_RC4_128_EXPORT40_WITH_MD5:" "SSL2_RC4_64_WITH_MD5" )
仅修改s2_lib.c添加套件条目后未生效,需按以下步骤调整:
解决方案步骤
1. 完整定义密码套件条目
OpenSSL 1.0.2u中,SSLv2和TLS/SSLv3的密码套件分别在不同文件维护:
- SSLv2套件:在
s2_lib.c的ssl2_ciphers数组中添加条目,格式需与已有条目完全一致(注意逗号、括号等语法),示例:
// 在ssl2_ciphers数组末尾(终止条目{0}之前)添加 { 1, "SSL2_RC4_64_WITH_MD5", 0x000010, SSL_kRSA, SSL_aRSA, SSL_RC4, SSL_MD5, SSL_SSLV2, SSL_NOT_DEFAULT | SSL_EXPORT, 0, 64, 128, }, { 1, "SSL2_RC4_128_EXPORT40_WITH_MD5", 0x000008, SSL_kRSA, SSL_aRSA, SSL_RC4, SSL_MD5, SSL_SSLV2, SSL_NOT_DEFAULT | SSL_EXPORT, 0, 40, 128, },
- TLS/SSLv3套件:在
ssl_ciph.c的ssl3_ciphers数组中添加对应TLS套件的条目;如果原有ciphers.h中未定义对应套件宏,需手动补充定义。
2. 确保套件被纳入可调用列表
修改ssl_ciph.c中的ssl3_default_cipher_list,将新增套件加入默认列表;或者后续使用时通过命令行/代码显式指定密码套件字符串,避免依赖默认列表。
3. 清理旧编译产物后重新编译
残留的旧编译文件会导致修改不生效,执行以下命令重新编译:
cd openssl-1.0.2u make clean make distclean ./config enable-ssl2 enable-ssl3 enable-weak-ssl-ciphers -Wl,-rpath,/usr/local/ssl/lib --prefix=/usr/local/ssl make -j$(nproc) sudo make install
4. 验证自定义OpenSSL是否生效
设置环境变量确保调用的是编译后的版本:
export PATH=/usr/local/ssl/bin:$PATH export LD_LIBRARY_PATH=/usr/local/ssl/lib:$LD_LIBRARY_PATH
执行以下命令验证:
# 检查OpenSSL版本,确认是自定义编译的1.0.2u openssl version # 列出SSLv2支持的所有套件 openssl ciphers -v -ssl2 # 列出TLSv1.0支持的所有套件 openssl ciphers -v -tls1
如果能看到新增的套件,说明编译生效。
5. Python中使用自定义OpenSSL的配置
Python默认使用系统自带的OpenSSL库,需确保Python链接的是编译后的自定义版本:
- 可重新编译Python,指定链接
/usr/local/ssl下的库; - 或者在Python SSL服务器中显式指定密码套件字符串,同时启用对应旧协议:
import socket import ssl # 初始化上下文,启用TLSv1.0 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) # 强制关闭高版本协议,仅保留SSLv2和TLSv1.0(部分Python版本需手动开启SSLv2) context.options |= ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2 | ssl.OP_NO_TLSv1_3 # 显式指定需要的密码套件列表 context.set_ciphers("TLS_RSA_WITH_RC4_128_MD5:TLS_RSA_WITH_DES_CBC_SHA:SSL2_RC4_128_WITH_MD5:...") # 替换为完整的套件字符串 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 4433)) server_socket.listen(5) while True: client_socket, addr = server_socket.accept() ssl_socket = context.wrap_socket(client_socket, server_side=True) # 后续业务逻辑处理
内容的提问来源于stack exchange,提问作者Werner van der Merwe
相关产品推荐
相关产品推荐

