使用 SSL 进行 DNS 转换的 Apache 反向代理

使用 SSL 进行 DNS 转换的 Apache 反向代理

我目前正在迁移到新主机。apache 中大约有 20 个域全部设置为基于名称的 VHost。

我读到了关于 Apache 的反向代理功能作为克服 DNS 停机的一种想法,因为并非所有域名都在我的直接控制之下,而且我不确定域名所有者会多准时地更新它们。

因为这是通过互联网代理敏感数据,所以我一直需要 SSL。

原始服务器上的虚拟主机:

ServerAdmin [email protected]
ServerName abc.domain.com

SSLEngine On
SSLCertificateFile     /path/to/cert
SSLCertificateKeyFile  /path/to/key

SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
UseCanonicalName On
SSLProxyVerify require
SSLProxyCheckPeerName On

ProxyPass / https://1.2.3.4/
ProxyPassReverse / https://1.2.3.4/

目标服务器上的虚拟主机:

ServerAdmin [email protected]
ServerName abc.domain.com

SSLEngine On
SSLCertificateFile     /path/to/cert
SSLCertificateKeyFile  /path/to/key

我的问题在于验证。如果我将 SSLProxyVerify 关闭,一切都会按预期运行。

我已经在新旧服务器上复制了证书 - 显然无论如何我都必须这样做 - 因此两台服务器上的 /path/to/cert 和 key 指向相同的数据。

浏览器显示 500,在原始服务器的错误日志中我看到:

AH02039: Certificate Verification: Error (20): unable to get local issuer certificate

我已经阅读了很多有关该主题的内容,但我仍然不清楚应该如何进行设置。

我认为我应该使用自签名证书和 CA 作为原点到目标的路径,但应该如何配置?证书上的通用名称/主题替代应该是什么?

任何帮助都感激不尽!谢谢!

答案1

我能够使用自签名 CA 和证书自己完成这项工作。

代理服务器必须具有指向生成的 CA 证书的 SSLProxyCACertificateFile。

远程服务器必须使用 SSLCertificateFile 的自签名链以及 SSLCertificateKeyFile 中的客户端证书的密钥文件。

由于我在客户端证书上没有有效的通用名称/SAN,因此代理服务器还必须禁用 SSLProxyCheckPeerName 和 SSLProxyCheckPeerCN,但保持 SSLProxyVerify 设置为需要。

此配置意味着最终用户 -> 代理服务器使用有效证书,而代理服务器 -> 远程服务器使用您的自签名证书。虽然我们不检查通用名称等,但代理服务器将仅接受根据您的自签名 CA 进行验证的响应。

有助于诊断的事项:

  • 将远程服务器上的 VirtualHost 移动到其自己的端口,这样我就可以直接访问它并验证它所提供的证书等。

  • 增加代理服务器上 VirtualHost 的 LogLevel,我使用了 LogLevel ssl:debug,这足以显示日志中正在交换的证书。

相关内容