远程apache httpd服务器的SSL握手问题,可在本地运行

时间:2015-08-22 11:17:53

标签: apache ssl https sslhandshakeexception

我遇到了一个奇怪的问题: 我已经在apache中安装/配置了ssl证书/密钥和ca证书等,现在可以从本地机器上的最新chrome / firefox浏览器访问它,并且它们显示证书都很好(全绿锁图标),并且还显示它使用现代密码套件。 请注意,我是通过服务器名本身从本地计算机访问它,而不是从localhost等访问它,而不是通过更改主机文件..也可以从同一网络中的另一台计算机访问它而没有任何问题..

但是当我尝试从不同的远程计算机(不在同一网络中)或通过vpn等访问它时,我得到ssl连接错误。 Firefox表示" Peer报告它遇到内部错误。 (错误代码:ssl_error_internal_error_alert)"。

我在远程机器上使用openssl命令来模仿客户端:

*openssl s_client -connect xyz.com:443 -state -nbio 2>&1*

它显示:

WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Loading 'screen' into random state - done
CONNECTED(00000170)
turning on non blocking io
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:error in SSLv2/v3 read server hello A
write R BLOCK
SSL3 alert read:fatal:internal error
SSL_connect:error in SSLv2/v3 read server hello A
7020:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:.\ssl\s23_clnt.c:762:
- - - 
no peer certificate available
- - - 
No client certificate CA names sent
- - - 
SSL handshake has read 7 bytes and written 307 bytes
- - - 
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
- - - 

我必须使用apache httpd来使用https,并使用fwd请求tomcat,它只使用http,并使用ajp-proxy来实现此目的。

我尝试删除代理配置,重新启动但仍然没有运气 - 在本地计算机上显示" it works "页面,并在远程机器上,相同的ssl连接错误。 apache日志中没有任何内容也与远程计算机的尝试相对应(即它们直到那些日志才会到达)。

但奇怪的是,现有的配置在长时间的非工作期后可以在远程机器上工作30-40分钟(即一段时间)。然后相同的配置再次折腾..无法理解为什么。在整个这段时间内,它始终可以通过本地机器进入/罚款。

这是ssl-conf:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:SSL_RSA_WITH_RC4_128_SHA:HIGH:MEDIUM:!MD5:!RC4
SSLProxyCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:HIGH:MEDIUM:!MD5:!RC4
SSLHonorCipherOrder on 
SSLProtocol all  -SSLv2 -SSLv3
SSLProxyProtocol all -SSLv2  -SSLv3
SSLSessionCache        "shmcb:c:/Apache24/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300
SSLUseStapling On
SSLStaplingCache "shmcb:c:/Apache24/logs/ssl_stapling(150000)"
SSLStaplingStandardCacheTimeout 3600
<VirtualHost *:443>
    DocumentRoot "c:/Apache24/htdocs"
    ServerName www.xyz.com
    ServerAlias xyz.com

    ServerAdmin info@xyz.com
    ErrorLog "c:/Apache24/logs/error.log"
    TransferLog "c:/Apache24/logs/access.log"
    SSLEngine on
    SSLCertificateFile "C:/Apache24/xyz/certs/server.crt"
    SSLCertificateKeyFile "C:/Apache24/xyz/certs/private_key_no_pswd.pem"
    SSLCertificateChainFile "C:/Apache24/xyz/certs/gd_bundle-g2-g1.crt"
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory "c:/Apache24/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
    CustomLog "c:/Apache24/logs/ssl_request.log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    #ProxyRequests Off
    ProxyPreserveHost On
    SSLProxyEngine on
    SSLProxyVerify none 
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off

    <Proxy *>
        #Order allow,deny
        Allow from all
        Deny from none
        Require all granted

        #Deny from all
        #Allow from 127.0.0.0/255.0.0.0 ::1/128

        # Order deny,allow
        # Allow from localhost
        # Require ip 127.0.0.1
    </Proxy>

    ProxyPass   /  ajp://localhost:8009/
</VirtualHost> 

你可以在virtualHost配置中看到很多东西(获得权限被拒绝和其他问题),并尝试了很多东西,直到它从本地机器上运行..

我的环境是: Win-XP sp3(我知道它的旧版本),ApacheLounge httpd-VC-10 v-2.4.x(在端口443上),tomcat-1.6(在8080上)

如果我做错了什么,或者您需要其他任何配置,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:1)

这可以在本地网络中运行,而不是在外面听起来非常像防火墙保护您的网络。另一种可能是同一主机名解析为本地和远程网络中的不同IP地址,因此它尝试从本地和远程访问不同的主机。另一件事可能是主机名解析为IPv4和IPv6地址,但您的服务器仅使用IPv4。如果您在本地网络中只使用IPv4而另一个网络可以执行IPv6,您将看到类似的效果。

要调试此问题,我建议您在本地客户端,远程客户端进行数据包捕获并进行比较。如果来自远程客户端的数据完全到达服务器(或防火墙阻止它),还要检查数据包捕获。

编辑:从注释看起来本地和远程客户端看到同一服务器的不同IP地址。要调试为什么会出现这种情况,请首先检查双方是否实际使用相同的服务器,因为通常您会看到一个使用www.example.com而另一个使用example.com(没有www),但名称有不同的IP地址。如果您确定不是这种情况,请检查真实IP地址应该是什么,然后在名称错误的聚会上查看更多详细信息。这个错误的名称可能是由hosts文件中的条目(来自测试?),缓存条目(更改为DNS take some time to propagate,有时是一天或更长时间)或因为使用了拆分DNS设置引起的。 Split DNS在服务器面向外部和实习的公司中并不少见,他们希望实习生使用内部IP地址和外部客户端来使用外部IP地址。