我正在尝试使该设置正常工作:
- 反向代理:启用 SSL 并使用 Let's Encrypt 证书(reverse-proxy.com)面向互联网。
- 目标:使用内部证书链 (target.internal) 通过启用 SSL 的反向代理访问的站点。
因此连接应该是:
- 客户端与反向代理的 TLS 握手
- 反向代理到目标 TLS 握手 [失败]
我做了什么好事:
- 将我的根 CA 证书添加到代理服务器
- 将证书、密钥和链添加到目标
openssl s_client -connect target.internal:443 -prexit -CAfile /var/certs/root-ca.crt
从反向代理尝试成功
但是 Apache 失败了,因为当尝试连接到“target.internal”时,它想在目标证书中查找主机名“reverse-proxy.com”,而目标证书是为“target.internal”制作的。
我的日志中有这个错误:
Cert does not match for name 'reverse-proxy.com'
成功从“root-ca.crt”遍历证书链到“target.internal.crt”后,它会打印此内容。
我不明白为什么 Apache 不寻找为“target.internal”制作的证书。
有人有想法吗?谢谢。
编辑 :
Listen 0.0.0.0:443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel trace1
SSLEngine on
SSLProxyEngine on
SSLProxyCACertificateFile /var/certs/root-ca.crt
SSLProtocol -all +TLSv1.2
SSLCipherSuite HIGH:!SSLv3:!kRSA:!kECDH:!ADH:!DSS
SSLCertificateFile /etc/letsencrypt/live/reverse-proxy.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/reverse-proxy.com/privkey.pem
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ServerName reverse-proxy.com
SSLCertificateChainFile /etc/letsencrypt/live/reverse-proxy.com/chain.pem
ProxyPreserveHost On
RewriteEngine On
RewriteRule ^/stuff/(.*)$ https://target.internal/$1 [P]
ProxyPassReverse /stuff/ https://target.internal/
</VirtualHost>