我的 Web 服务器需要与防火墙后面的第三方服务器集成。为了通过防火墙,所有请求都必须来自同一 IP 地址并通过 SSL 进行身份验证。因此,我设置了一台机器,该机器应该充当代理,并通过 SSL 将所有流量转发到第三方服务器。
我使用证书和匹配的密钥文件设置了代理,并且可以使用证书和密钥文件通过 CURL 成功向第三方服务发出请求。我在 Apache 上设置了一个虚拟主机来传递这些请求,但一直收到错误消息,提示与远程服务器的 SSL 握手失败。我在 Apache 日志中看到以下错误消息:
代理客户端证书回调:(:443)下游服务器需要客户端证书,但均未配置 [2012 年 7 月 29 日星期日 01:40:48] [错误](502)未知错误 502:代理:将请求正文传递至 <第三方 IP>:18443(<第三方 URL>)失败
[2012 年 7 月 29 日星期日 01:40:48] [错误] [客户端] 代理:与远程服务器进行 SSL 握手时出错,由 / 返回
我的 apache 虚拟主机配置如下:
<VirtualHost *:18443>
ServerName <Proxy IP>
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /etc/apache2/ssl/my_server.pem
SSLCertificateKeyFile /etc/apache2/ssl/my_server.key
SSLProxyCACertificatePath /etc/ssl/certs
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / https://<3rd party server address>:18443
ProxyPassReverse / https://<3rd party server address>:18443
</VirtualHost>
谢谢!任何帮助都非常感谢!
答案1
您需要配置 Apache 以使用该证书文件作为其代理后端的身份验证机制。
将.pem
和合并.key
为一个文件,并使用以下命令指向它:
SSLProxyMachineCertificateFile /path/to/combined.pem
答案2
我认为他真正想要的是一个 Apache,它将 SSL 请求代理到端点服务器(大概是应用程序服务器),执行 SSL 客户端证书认证...
SSLProxyMachineCertificateFile 在这种情况下不会帮助你,因为这个文件包含一个证书,apache 服务器通过该证书向应用程序服务器进行身份验证...你不希望这样:你希望调用客户端使用他的证书
Apache 应该可以将其获得的证书信息传递到应用服务器,例如通过 AJP,但到目前为止我还没能做到这一点。如果我能让它工作,我会尝试更新这个答案……
答案3
我遇到了同样的错误。配置的对等名称与当前指令不匹配可能有问题ProxyPass
。实际上,我通过 localhost 访问服务。以下配置行对我有用:
SSLProxyEngine on
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
ProxyPass "/api/" "https://localhost:18443/api/"
(感谢来自@ajmurmann 的评论)
但消息Proxy client certificate callback: (:443) downstream server wanted client certificate but none are configured
仍然存在于错误日志中,但请求正在运行。