我需要设置一个具有双向 SSL 验证的正向代理。我在 Debian 上使用 Apache 2.4.10 取得了很大进展,但由于证书 CN 与错误的名称进行了比较,因此失败了。我搜索并阅读了每个提到类似内容的页面,但我找不到解决方案。
设置:
- tomcat 服务器正在运行http://本地主机:8080使用基于名称的虚拟主机
- 当触发时,每个虚拟主机都会发送请求到https://externalserver.com:443/uri
- SSL 连接应提供属于 vhost 的证书,并验证外部服务器的证书
我已经在 Apache 2.4.10 中为每个 tomcat vhost 设置了一个虚拟主机,配置如下:
<虚拟主机 *:80> 服务器名称 domain1.example.com SSLProxyEngine 开启 ProxyVia 开启 SSLProxyMachineCertificate文件 /proxysetup/certs/domain1.example.certandkey.pem # 服务器证书验证 SSLProxyCACertificatePath /proxysetup/ca SSLProxyCARevocation检查叶 SSLProxyCARevocationPath /proxysetup/crl SSLProxyVerify 要求 SSLProxyVerifyDepth 4 SSLProxyCheckPeerName 关闭 SSLProxyCheckPeerCN 开启 SSLProxyCheckPeerExpire 已打开 ProxyPass /外部 https://externalserver.com/ ProxyPassReverse /外部 https://externalserver.com/ <代理“*”> 命令拒绝、允许 允许所有人 </代理> 日志级别调试 错误日志 /proxysetup/logs/domain1.example-error-80.log CustomLog /proxysetup/logs/domain1.example-access-80.log 合并 </虚拟主机>
当我发起请求时(http://domain1.example.com/external/someuri)我看到 SSL 握手正在进行,但失败并出现以下错误
SSL Proxy: Peer certificate CN mismatch: Certificate CN: EXTERNALSERVER.COM Requested hostname: domain1.example.com
然后连接就关闭了。
在执行此检查之前,添加ProxyPerserveHost off
握手就会停止。
需要做什么才能成功验证证书?
更新
我设法通过将配置更改为以下内容来实现它:
<虚拟主机 *:80> 服务器名称 domain1.example.com SSLProxyEngine 开启 SSLProxyMachineCertificate文件 /proxysetup/certs/domain1.example.certandkey.pem # 服务器证书验证 SSLProxyCACertificatePath /proxysetup/ca SSLProxyCARevocation检查叶 SSLProxyCARevocationPath /proxysetup/crl SSLProxyVerify 要求 SSLProxyVerifyDepth 4 SSLProxyCheckPeerName 关闭 SSLProxyCheckPeerCN 关闭 SSLProxyCheckPeerExpire 已打开 ProxyPass /external/ https://externalserver.com/ ProxyPassReverse /external/ https://externalserver.com/ 代理密码 / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ <代理“*”> 要求所有已授予 </代理> <代理“* / external /”> # 仅允许本地请求 # 并且仅当服务器证书包含正确的 FQDN 要求全部拒绝 需要本地 SSLRequire %{SSL_SERVER_S_DN_CN} 在 {"externalserver.com"} </代理> 日志级别调试 错误日志 /proxysetup/logs/domain1.example-error-80.log CustomLog /proxysetup/logs/domain1.example-access-80.log 合并 </虚拟主机>
更新 2
仍然有一个错误:
- 当我改变
SSLRequire %{SSL_SERVER_S_DN_CN} 在 {"externalserver.com"}
到
SSLRequire %{SSL_SERVER_S_DN_CN} 在 {"somethingelse.com"}
我仍然可以连接。即使添加SSLOptions +StrictRequire
- 当我设置
SSLProxyCheckPeerName on
服务器 (externalserver.com) 的证书与 domain1.example.com 匹配。我希望它与“externalserver.com”匹配
是我做错了什么还是我偶然发现了一个错误?