编译带FIPS模块的OpenSSL时,如何限制指定加密套件与旧TLS协议?
问题分析与解决办法
首先,咱们拆解你遇到的两个核心问题:编译参数未生效,以及如何选择性控制加密套件。
一、为什么你的编译参数没生效?
你当前的编译命令存在几个关键问题,导致禁用规则没起作用:
TLS协议禁用参数不全
OpenSSL 1.0.2h中,no-tls1仅禁用TLS 1.0,要禁用TLS 1.1需要额外加no-tls1_1——这就是为什么你还能使用TLSv1.1连接的原因。加密套件禁用参数不完整且路径有误
- 你用了
no-dh,但这只是禁用静态DH算法,要禁用DHE(临时密钥交换的DH)需要加no-dhe; - 进入OpenSSL源码目录的命令写错了:
cd /openssl-1.0.2h应该是cd ../openssl-1.0.2h(从FIPS目录退回上级再进入OpenSSL目录),否则会找不到源码目录,相当于没正确编译关联FIPS的版本; - 没有指定FIPS库的路径,导致OpenSSL编译时没正确加载FIPS模块的安全限制,很多禁用规则被忽略。
- 你用了
未清理旧编译残留
如果之前编译过OpenSSL,旧的目标文件和配置会残留,新的编译参数可能不会覆盖生效,必须先执行make clean。
二、修正后的完整编译步骤
按以下步骤重新编译,确保所有限制生效:
1. 下载并解压源码(你的这部分是对的,保持不变)
root@cc3:/home/openssl# wget https://openssl.org/source/openssl-1.0.2h.tar.gz root@cc3:/home/openssl# wget https://openssl.org/source/openssl-fips-2.0.12.tar.gz root@cc3:/home/openssl# tar -xvf openssl-fips-2.0.12.tar.gz root@cc3:/home/openssl# tar -xvf openssl-1.0.2h.tar.gz
2. 安装FIPS模块(默认安装到/usr/local/ssl/fips-2.0)
root@cc3:/home/openssl# cd openssl-fips-2.0.12 && ./config -d && make && make install
3. 编译带FIPS限制的OpenSSL
# 退回上级目录,进入OpenSSL源码目录 root@cc3:/home/openssl/openssl-fips-2.0.12# cd ../openssl-1.0.2h # 清理旧编译文件 root@cc3:/home/openssl/openssl-1.0.2h# make clean # 正确配置参数,指定FIPS库路径 root@cc3:/home/openssl/openssl-1.0.2h# ./config no-ssl2 no-ssl3 no-tls1 no-tls1_1 no-ecdhe no-dhe no-dsa no-des no-dh --prefix=/home/openssl/local --with-fipslibdir=/usr/local/ssl/fips-2.0/lib fips # 重新生成依赖并编译安装 root@cc3:/home/openssl/openssl-1.0.2h# make depend && make && make install
三、验证配置是否生效
编译完成后,用以下命令验证:
检查禁用的协议:
/home/openssl/local/bin/openssl ciphers -V | grep TLSv1 /home/openssl/local/bin/openssl ciphers -V | grep TLSv1.1如果没有输出,说明TLS 1.0和1.1已被禁用。
检查禁用的加密套件:
/home/openssl/local/bin/openssl ciphers 'ALL:eNULL'输出中不应包含任何
ECDHE-、DHE-、DSA-、DES-、DH-开头的套件。用s_client测试协议限制:
/home/openssl/local/bin/openssl s_client -connect example.com:443 -tls1应该返回类似
Protocol not available的错误,说明TLS 1.0已无法使用。
四、选择性禁用AES/RSA套件(比如禁用AES256-SHA保留AES128-SHA)
编译时禁用整个AES/RSA算法是不可行的(会把所有相关套件都删掉),你需要通过加密套件字符串来精准控制,而不是编译参数:
编译时保留AES和RSA:确保编译命令中没有
no-aes、no-rsa这类参数(你的当前命令本来就没加,所以没问题)。使用时指定允许的套件:
- 直接用
openssl s_client测试:/home/openssl/local/bin/openssl s_client -connect example.com:443 -cipher 'AES128-SHA' - 如果是在应用程序(比如Nginx)中配置,设置
ssl_ciphers指令:ssl_ciphers 'AES128-SHA:HIGH:!AES256-SHA:!ECDHE-*:!DHE-*'; - 也可以修改OpenSSL的默认配置文件
/home/openssl/local/ssl/openssl.cnf,在[default_conf]下添加:
这样所有使用该OpenSSL库的程序都会默认遵循这个套件规则。ssl_default_cipherlist = AES128-SHA:HIGH:!AES256-SHA:!ECDHE-*:!DHE-*
- 直接用
内容的提问来源于stack exchange,提问作者Hussain Ali Akbar
相关产品推荐
相关产品推荐

