在安装了 OpenSSL 1.1.1b 的情况下使用 TLSv1.3 时 Apache 报告 "Illegal protocol"

标签 apache ssl openssl centos7 tls1.3

我正在尝试测试 TLSv1.3 支持,但 Apache 无法启动 systemctl status httpd...

的以下输出
systemd[1]: Starting The Apache HTTP Server...
httpd[6001]: AH00526: Syntax error on line 100 of /etc/httpd/conf/httpd.conf:
httpd[6001]: SSLProtocol: Illegal protocol 'TLSv1.3'
systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start The Apache HTTP Server.
systemd[1]: Unit httpd.service entered failed state.
systemd[1]: httpd.service failed.

我在 EC2 上使用 Amazon Linux 2,它仅限于 OpenSSL 1.0.2k,所以我手动下载并编译了 OpenSSL 1.1.1b,并将其安装在 /usr/local/openssl/ 保持原样。为了确保继续使用新的,我采取了以下步骤......

  1. 创建/etc/ld.so/conf.d/openssl.conf,内容为/usr/local/openssl/lib,然后运行ldconfig -v 更新它。

  2. 使用以下内容创建了 /etc/profile.d/openssl.sh...

    #Set OPENSSL_PATH
    OPENSSL_PATH="/usr/local/openssl/bin"
    export OPENSSL_PATH
    PATH=$PATH:$OPENSSL_PATH
    export PATH
    

    ... 并运行 source/etc/profile.d/openssl.sh 来更新它。

我可以确认 which openssl 正确指向 /usr/local/openssl/bin/openssl,并且使用 支持 TLSv1.3/usr/local/openssl/bin/openssl 密码 -V -tls1_3 -s...

0x13,0x02 - TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
0x13,0x01 - TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD

运行 openssl version -a 产生以下...

OpenSSL 1.1.1b  26 Feb 2019
built on: Wed May 15 15:07:48 2019 UTC
platform: linux-x86_64
options:  bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/openssl"
ENGINESDIR: "/usr/local/openssl/lib/engines-1.1"
Seeding source: os-specific

我目前正在使用 Apache v2.4.39,它应该支持 TLSv1.3,并且我的 httpd.conf 中的 SSL 相关指令设置如下:

### SSL CONFIGURATION

# Session settings
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLProxyProtocol -all +TLSv1.3 +TLSv1.2
SSLCipherSuite    TLSv1.3   TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
SSLCipherSuite    SSL       ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off

# OpenSSL Configuration Commands
SSLOpenSSLConfCmd DHParameters /etc/ssl/dhparam.pem
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1

# Pseudo Random Number Generator (PRNG):
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin

# SSL Crypto Device
SSLCryptoDevice builtin

# HSTS / Header Strict Transport Security
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff

# Online Certificate Status Protocol (OCSP) Stapling
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

最后,我尝试删除 Apache(通过 Yum)并重新安装它(通过 Yum),但这似乎没有效果。

我对从源代码编译还是比较陌生,所以我不确定什么时候需要它,除了像我们使用 OpenSSL 版本的情况,所以我不确定我撞墙的原因是否是我需要从源代码重新编译 httpd 并手动定位新的 OpenSSL 位置还是什么?

如有任何帮助,我们将不胜感激!

最佳答案

您安装的 Apache 版本链接到系统 OpenSSL 库,即 OpenSSL 1.0.2k。该库不支持 TLS 1.3,这也意味着配置 TLS 1.3 所需的必要功能不可用,因此无法从 Apache 使用。

如果您只安装 TLS 1.3,这不会改变。首先,Apache 会继续使用原路径安装的库。即使您替换此库,Apache 也无法使用 TLS 1.3 特定功能,因为它一开始并不知道这些功能可用。

相反,Apache 需要针对新的 OpenSSL 版本进行重建,以便了解 API 中的更改并使用它。使用 yum 进行简单的删除和重新安装不会导致此类重建,而只会重新安装与系统 OpenSSL 版本链接的版本。

关于在安装了 OpenSSL 1.1.1b 的情况下使用 TLSv1.3 时 Apache 报告 "Illegal protocol",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56172724/

相关文章:

apache,允许文件名带有 '?'

python : email sending failing on SSL read

linux - OpenSSL 中的 EVP_DecryptFinal

c# - 如何通过 C# 代码获取证书的到期日期?

c - 当函数有整数作为参数时,如何传递字符串作为参数?

ssh - 启动 SSH session 时 FIPS 完整性验证测试失败

php - pgsql 扩展未加载

PHP 脚本在超过 60 秒时执行两次

apache - htaccess if 语句

azure - Powershell Azure : Could not create SSL/TLS secure channel