带有openssl 1.1.1的Apache 2.4.37:无法执行握手后身份验证

时间:2018-10-30 10:41:13

标签: apache authentication ssl openssl tls1.3

我将apache更新至最新版本2.4.37,并将openssl升级至1.1.1,现在,当客户端进行身份验证时,我仅在Firefox 63上会收到此错误,而在Chrome浏览器中则没有:

[ssl:error] AH: verify client post handshake, referer: https://******/login
[ssl:error] AH10158: cannot perform post-handshake authentication, referer: https://******/login
[ssl:error]SSL Library Error: error:14268117:SSL routines:SSL_verify_client_post_handshake:extension not received

我使用wireshark尝试查找问题,并且我了解Firefox使用TLS 1.3,而Chrome使用TLS 1.2。实际上,如果我将FF中的TLS最大版本设置为TLS 1.2,则可以正常工作。

我想获得TLS 1.3兼容性,或者如果无法实现,则要强制在我的Apache配置中,客户端始终使用TLS 1.2,但我没有::(

这是我的Apache vhost配置文件:

[...]

SSLEngine on
SSLCertificateFile      /etc/apache2/ssl/server.crt
SSLCertificateKeyFile   /etc/apache2/ssl/server.key
SSLCertificateChainFile /etc/apache2/ssl/intermediate.crt
SSLCACertificateFile /etc/apache2/ssl/ca.pem
SSLVerifyDepth 3
SSLProtocol TLSv1.2
SSLHonorCipherOrder on

<Directory /var/www/html/>
    Options -Indexes +FollowSymLinks -MultiViews
    AllowOverride All
    Order deny,allow
    Allow from 10.55.12.0/24
    Deny from all
</Directory>

<Files "login-ssl.php">
    SSLVerifyClient optional
    SSLOptions +StdEnvVars +StrictRequire
</Files>

[...]

有人可以帮我吗?

谢谢。


已编辑

我找到了解决方案。 SSLProtocol指令应位于/etc/apache2/mods-enabled/ssl.conf中。

3 个答案:

答案 0 :(得分:3)

问题是Firefox不支持TLS 1.3握手后身份验证。我已通过https://bugzilla.mozilla.org/show_bug.cgi?id=1511989

向Firefox报告了此问题

我不是在这里建议解决方法或修复;我只是告诉其他访问该页面的人(在搜索结果中此错误消息的出现率很高),这是什么情况,以及在Firefox致力于解决此问题时在哪里可以找到最新信息。

答案 1 :(得分:2)

如果这对其他人有帮助,那么对于我在Windows上使用 Apache HTTP 2.4.41 进行的反向代理测试配置,我只想通过客户端保护 balancer-manager URI 我使用 OpenSSL 和CA证书,由CA签名的服务器证书和由CA签名的客户端证书生成的证书身份验证,将P12导入了我的浏览器。

对于要代理的其他后端URL(启用AJP的Spring Boot并在2个不同的端口集上运行相同的应用程序以通过Apache HTTP测试平衡),配置将不执行任何客户端证书身份验证。

  1. 正在访问https://myhostname.com并访问我的后端 通过平衡器,返回预期的响应。
  2. 访问https://myhostname.com/balancer-manager应该可以 提示我选择我之前导入的客户端证书, 但在Chrome 80.0上给出了此错误(并且不适用于其他 浏览器)。

禁止访问您无权访问此资源。原因: 无法执行握手后身份验证。

在Apache错误日志中,它显示:

SSL库错误:错误:14268117:SSL 例程:SSL_verify_client_post_handshake:未收到扩展名

在Apache访问日志中,它显示:

获取/ balancer-manager HTTP / 1.1“ 403199

httpd.conf 中虚拟主机配置的非工作配置如下:

<VirtualHost *:443>

    ServerName myhostname.com
    ServerAlias myhostname.com

    SSLEngine on
    SSLCipherSuite ALL:!EXP:!eNULL:!aNULL:!MD5:-LOW:-RC4:-SSLv2:+HIGH:+MEDIUM

    #no certificate authentication required except balancer manager
    SSLVerifyClient none
    SSLVerifyDepth 5
    SSLProtocol all -SSLv3
    SSLCertificateFile "path/to/server/certificate"
    SSLCertificateKeyFile "path/to/server/key"
    SSLCACertificateFile "path/to/CA/certificate"

    <Location "/balancer-manager">
            SSLVerifyClient require
            SetHandler balancer-manager
            Require host myhostname.com
    </Location>


    <Proxy balancer://cluster>
        BalancerMember  ajp://localhost:9090/ loadfactor=25 timeout=1
        BalancerMember  ajp://localhost:9091/ loadfactor=75 timeout=1
        ProxySet lbmethod=byrequests
    </Proxy>

    ProxyPreserveHost off

    ProxyRequests Off
    ProxyPass         /  balancer://cluster/  stickysession=JSESSIONID
    ProxyPassReverse  /  balancer://cluster/  stickysession=JSESSIONID

</VirtualHost>

要解决此问题,请将 SSLProtocol 指令更改为使用:

SSLProtocol -all +TLSv1.2

另请参阅这些链接

  1. Enable TLS in Apache

  2. TLS-1-2

我使用TLS 1.2进行测试(TLS 1.1也可以使用,但建议使用TLS 1.2或更高版本)。

注意: Apache 2.4.38或更高版本支持TLS v1.3。您 必须在SSL设置中启用TLS 1.3之前升级Apache软件包。

*

答案 2 :(得分:0)

这对我有用!

使用以下命令打开Linux目录

sudo nautilus

然后导航至

  

/etc/apache2/mods-enabled/ssl.conf

打开ssl.conf,您会找到类似的东西

  

#要启用的协议。

     

#可用值:全部,SSLv3,TLSv1,TLSv1.1,TLSv1.2

     

不再支持#SSL v2

     

SSLProtocol all -SSLv3

只需将TLSv1.3替换为SSLv3,如下所示:

  

SSLProtocol all -TLSv1.3

然后使用以下命令重启apache服务器

sudo service apache2 restart 它将正常工作。