在安装了 OpenSSL 1.1.1b 的情况下使用 TLSv1.3 时 Apache 报告 "Illegal protocol"
Apache reporting "Illegal protocol" when using TLSv1.3 with OpenSSL 1.1.1b installed
我正在尝试测试 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/原封不动。为了确保新的继续使用,我采取了以下步骤...
创建了/etc/ld.so/conf.d/openssl.conf,内容为/usr/local/openssl/lib
,然后 运行 ldconfig -v
更新它。
已创建 /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
,并且使用 /usr/local/openssl/bin/openssl ciphers -V -tls1_3 -s
...
支持 TLSv1.3
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 版本的情况,所以我不确定我是否遇到这个问题wall 是我需要从源代码重新编译 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 版本链接的版本。
我正在尝试测试 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/原封不动。为了确保新的继续使用,我采取了以下步骤...
创建了/etc/ld.so/conf.d/openssl.conf,内容为
/usr/local/openssl/lib
,然后 运行ldconfig -v
更新它。已创建 /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
,并且使用 /usr/local/openssl/bin/openssl ciphers -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 版本的情况,所以我不确定我是否遇到这个问题wall 是我需要从源代码重新编译 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 版本链接的版本。