You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编译含自定义旧密码套件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:37:06