6 ssl load-balancing apache-2.2
我们的网络要求规定所有网络流量都必须加密。
网络配置如下所示:
------------
/-- https --> | server 1 |
/ ------------
|------------| |---------------|/ ------------
| Client | --- https --> | Load Balancer | ---- https --> | server 2 |
|------------| |---------------|\ ------------
\ ------------
\-- https --> | server 3 |
------------
Run Code Online (Sandbox Code Playgroud)
它必须通过客户端证书。
我有一个配置,可以与清晰的真实服务器进行负载平衡:
<VirtualHost *:8666>
DocumentRoot "/usr/local/apache/ssl_html"
ServerName vmbigip1
ServerAdmin jscheible@goeis.com
DirectoryIndex index.html
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /usr/local/apache/conf/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/server.key
<Proxy balancer://mycluster>
BalancerMember http://1.2.3.1:80
BalancerMember http://1.2.3.2:80
# technically we aren't blocking anyone, but could here
Order Deny,Allow
Deny from none
Allow from all
# Load Balancer Settings
# A simple Round Robin load balancer.
ProxySet lbmethod=byrequests
</Proxy>
# balancer-manager
# This tool is built into the mod_proxy_balancer module allows you
# to do simple mods to the balanced group via a gui web interface.
<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Allow from all
</Location>
ProxyRequests Off
ProxyPreserveHost On
# Point of Balance
# Allows you to explicitly name the location in the site to be
# balanced, here we will balance "/" or everything in the site.
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我需要的是负载平衡器中的服务器
BalancerMember https://1.2.3.1:443
BalancerMember https://1.2.3.2:443
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我收到 SSL 协商错误。
即使我确实让它起作用,我也需要通过客户端证书。
任何帮助,将不胜感激。
您根本无法将客户端证书直接用于请求用户证书的后端节点,并且负载平衡器将“终止”来自最终用户的 SSL/TLS 连接。
带有客户端证书的 SSL/TLS 握手要求客户端在最后对客户端和服务器之间交换的所有握手消息进行签名,这意味着客户端必须直接连接到请求客户端证书的实际 SSL/TLS 服务器。如果浏览器的 SSL/TLS 连接只到达负载均衡器,那么负载均衡器就是后端节点的客户端。后端节点将看到不同的握手,这将失败。
有两种可能的方法来解决这个问题:
使用基于 DNS 或 TCP 的负载平衡器(例如类似ipchains):在这种情况下,来自浏览器的 SSL/TLS 连接将直接转到后端节点。直接客户端证书身份验证将成为可能。
让负载平衡器执行客户端证书身份验证,并将该信息简单地传送到后端节点。这需要后端节点信任负载均衡器才能正确进行验证,但是如果后端节点不能信任负载均衡器,那么使用它就没有意义了。
mod_proxy_ajp(或mod_jk) 可以将客户端证书作为 AJP 协议的一部分转发,但这主要用于 Java 容器,并且 AJP 流量无论如何都不会加密。
如果您使用的是mod_proxy_http,则可以添加一个额外的标头,mod_header以通过 HTTP 标头传递证书,使用类似RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s. 我不记得确切的细节,但确保清除此标头很重要,这样它就不会来自客户端的浏览器(否则可能会伪造它)。您在后端节点上运行的任何应用程序都需要能够从该标头中获取其身份验证信息(并相信它已经由负载平衡器验证)。
除了您需要为 Apache Httpd 上的普通客户端证书身份验证配置的SSLVerifyClient和SSLCACertificateFile/Path指令之外mod_ssl,您还需要将Apache Httpd配置SSLProxyCheckPeerCN on和SSLProxyCACertificateFile/Path配置为后端节点的 SSL/TLS 客户端(请参阅该mod_proxy文件,有关SSLProxy*指令)。
如果您希望后端服务器确保请求来自负载均衡器而不是来自不同的客户端(可以建立直接连接),您也可以让负载均衡器使用客户端证书(使用SSLProxyMachineCertificateFile) , 对后端笔记进行身份验证。请注意,这可能会使后端的身份验证系统变得不那么复杂:尽管他们获得的实际客户端证书身份验证将是代理的身份验证(他们需要像往常一样验证),但那些应用程序上的应用程序就应用程序用户而言,服务器需要配置为使用基于标头的客户端证书。
小智 2
您的 SSL 配置看起来不完整。对于需要客户端证书,您需要添加
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile <your CA cert file>
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅如何强制客户端使用证书进行身份验证。
不确定它是否是强制性的,但您还缺少SSLCipherSuite指令。如果这样做,您可以整理出弱密码并采取措施抵御BEAST攻击:
SSLHonorCipherOrder On
SSLCipherSuite RC4-SHA:ALL:!ADH:!EXPORT:!LOW:!MD5:!SSLV2:!NULL
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19878 次 |
| 最近记录: |