我们的networking要求规定所有networkingstream量必须encryption。
networkingconfiguration如下所示:
------------ /-- https --> | server 1 | / ------------ |------------| |---------------|/ ------------ | Client | --- https --> | Load Balancer | ---- https --> | server 2 | |------------| |---------------|\ ------------ \ ------------ \-- https --> | server 3 | ------------
它必须通过客户端证书。
我有一个可以用真实的服务器进行负载平衡的configuration:
<VirtualHost *:8666> DocumentRoot "/usr/local/apache/ssl_html" ServerName vmbigip1 ServerAdmin [email protected] 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>
我需要的是我的负载均衡器中的服务器
BalancerMember https://1.2.3.1:443 BalancerMember https://1.2.3.2:443
但是这不起作用。 我得到SSL协商错误。
即使当我这样做的工作,我将需要通过客户端证书。
任何帮助,将不胜感激。
您只是不能直接与后端节点使用客户端证书,后端节点将请求用户证书,并且负载均衡器将终止来自最终用户的SSL / TLS连接。
客户端证书的SSL / TLS握手要求客户端签署客户端与服务器之间交换的所有握手消息,这意味着客户端必须直接连接到请求客户端证书的实际SSL / TLS服务器。 如果浏览器的SSL / TLS连接只与负载均衡器相同,则负载均衡器是后端节点的客户端。 后端节点将看到不同的握手,这将失败。
有两种可能的解决方法:
使用基于DNS或TCP的负载均衡器(例如ipchains ):在这种情况下,来自浏览器的SSL / TLS连接将直接进入后端节点。 直接的客户端证书authentication将是可能的。
让负载均衡器执行客户端证书authentication,并简单地将该信息传递给后端节点。 这要求后端节点相信负载平衡器已经正确地进行了validation,但是如果后端节点不能信任负载平衡器,则没有意义使用负载平衡器。
mod_proxy_ajp (或mod_jk )可以将客户端证书作为AJP协议的一部分转发,但主要针对Java容器,而AJPstream量无论如何都不encryption。
如果使用mod_proxy_http ,则可以使用mod_header添加额外的头文件,以通过HTTP头文件传递证书,例如使用RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s 。 我不记得确切的细节,但确保这个标题被清除是非常重要的,以便它永远不会来自客户端的浏览器(否则谁可以伪造它)。 无论您在后端节点上运行的任何应用程序都需要能够从该标头获取其身份validation信息(并且相信它已经由负载均衡器validation过)。
除了需要使用mod_sslconfigurationApache SSLProxyCheckPeerCN on普通客户端证书authentication的SSLVerifyClient和SSLCACertificateFile/Path指令之外,还需要configurationSSLProxyCheckPeerCN on和SSLProxyCACertificateFile/Path以将Apache SSLProxyCACertificateFile/Pathconfiguration为SSL / TLS客户端到后端节点(参见关于SSLProxy*指令的mod_proxy文档的介绍)。
如果希望后端服务器确保请求来自负载均衡器,而不是另一个客户端(可以build立直接连接),则可以使负载均衡器也使用客户端证书(使用SSLProxyMachineCertificateFile ),对后端音符进行authentication。 请注意,这可能会使后端的authentication系统不复杂一点:虽然他们获得的实际客户端证书authentication是代理服务器(他们需要像往常一样进行validation),但是这些应用程序就应用程序用户而言,服务器需要configuration为使用基于头的客户端证书。
您的SSLconfiguration看起来不完整。 为了要求客户端证书,您需要添加
SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile <your CA cert file>
请参阅如何强制客户端使用证书进行身份validation以获取详细信息。
不知道这是否是强制性的,但你也缺lessSSLCipherSuite指令。 如果这样做,你可以挑选弱密码,并对BEAST攻击做些什么:
SSLHonorCipherOrder On SSLCipherSuite RC4-SHA:ALL:!ADH:!EXPORT:!LOW:!MD5:!SSLV2:!NULL