Apache:cURL:ssl3_get_record:apache2 ssl 的版本号错误

Posted

技术标签:

【中文标题】Apache:cURL:ssl3_get_record:apache2 ssl 的版本号错误【英文标题】:Apache: cURL: ssl3_get_record:wrong version number for apache2 ssl 【发布时间】:2019-10-13 19:13:16 【问题描述】:

我有一台同时运行 2 个 Magento 站点的服务器。站点 1 在 SSL 下运行良好,而站点 2 在我访问时返回错误。

我尝试使用 cURL 测试网站:

curl -v https://example2-domain.com/

cURL 抛出此错误:

*   Trying 97.74.223.135...
* TCP_NODELAY set
* Connected to example2-domain.com (97.74.233.135) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* (304) (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* stopped the pause stream!
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

这是供参考的 Apache VirtualHost 块:

<VirtualHost 97.74.233.135:8080>
    ServerName www.example-domain.com
    ServerAlias example-domain.com
    DocumentRoot /home/example/public_html
    DirectoryIndex index.php
    ServerAdmin webmaster@example-domain.com
    UseCanonicalName Off
    ScriptAlias /cgi-bin/ /home/example/public_html/cgi-bin/
    <Directory /home/example/public_html>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost 97.74.233.135:8080>
    ServerName example-domain2.com
    DocumentRoot /home/example2/public_html
    DirectoryIndex index.php
    ServerAdmin webmaster@example-domain2.com
    UseCanonicalName Off
    ScriptAlias /cgi-bin/ /home/example2/public_html/cgi-bin/
    <Directory /home/example2/public_html>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost 97.74.233.135:443>
    ServerAdmin webmaster@example-domain.com
    ServerName www.example-domain.com
    LogLevel warn
    ErrorLog /var/log/apache2/example-domain.com-ssl-error.log
    CustomLog /var/log/apache2/example-domain.com-ssl-access.log combined
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:6081/
    ProxyPassReverse / http://127.0.0.1:6081/
    RequestHeader set X-Forwarded-Port "443"
    RequestHeader set X-Forwarded-Proto "https"
    SSLEngine On
    SSLCertificateFile /ssl/example-domain.crt
    SSLCertificateKeyFile /ssl/example-domain-key.txt
    SSLCertificateChainFile /ssl/example-domain.ca-bundle
</VirtualHost>

<VirtualHost 97.74.233.135:443>
    ServerAdmin webmaster@example-domain2.com
    ServerName example-domain2.com
    LogLevel warn
    ErrorLog /var/log/apache2/example-domain2.com-ssl-error.log
    CustomLog /var/log/apache2/example-domain2.com-ssl-access.log combined
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:6081/
    ProxyPassReverse / http://127.0.0.1:6081/
    RequestHeader set X-Forwarded-Port "443"
    RequestHeader set X-Forwarded-Proto "https"
    SSLEngine On
    SSLCertificateFile /ssl/example-domain2.com.crt
    SSLCertificateKeyFile /ssl/example-domain2-key.txt
    SSLCertificateChainFile /ssl/example-domain2.ca-bundle
</VirtualHost>

如果您想知道端口 6081 上是什么,Varnish 已配置为位于该端口上。

有人可以告诉我为什么会发生这种情况吗?谢谢!

【问题讨论】:

这通常表明服务器没有响应任何预期的 TLS 数据。你检查过apache日志吗?可能是您指向一些不存在的文件,因此 apache 无法设置 TLS 连接?这可能是您用示例名称替换实际主机名的情况,但example-domain2.comSSLCertificateFile 属性包含一个额外的.com - 即。 /ssl/example-domain2.com.crtwww.example.domain.com 配置不包含.com - 即。 /ssl/example-domain.crt 我已经检查了证书文件的路径及其对应的名称,一切都井井有条。困扰我的是他们的 VirtualHost 块是完全一样的,除了文件名和路径,但另一个不起作用。 【参考方案1】:

原来,域首先指向了错误的服务器!这就是显示错误的原因。将域的A记录指向正确的服务器后,所有配置都正确。

【讨论】:

【参考方案2】:

在为网站设置 SSL 时,我在 Ubuntu 20.04 上使用 Apache2 网络服务器时遇到了同样的问题。

每次我运行 curl 请求时:

curl https://corebanking.test.vggdev.com

curl https://my-website.com:443

我得到错误:

curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

我检查了网站 (my-website.conf) 的配置文件,看起来还不错。

这是我修复它的方法

我发现/etc/apache2/sites-enabled 目录中没有网站的配置文件 (my-website.conf)。所以没有启用配置。

我所要做的就是将my-website.conf 符号链接到/etc/apache2/sites-enabled 目录:

sudo ln -s /etc/apache2/sites-available/my-website.conf /etc/apache2/sites-enabled/my-website

接下来,我列出了/etc/apache2/sites-enabled 目录的内容,以确保网站的配置文件(my-website.conf)在那里:

ls /etc/apache2/sites-enabled/

最后,我重新启动了 apache2 网络服务器:

sudo systemctl restart apache2

就是这样。

我希望这会有所帮助

【讨论】:

【参考方案3】:

在我的例子中,我的 NAT 配置指向了错误的内部端口。 UI 允许使用逗号分隔符写入源/dist 端口,但它不是关联的(source=80,443 和 dest=80,443 将所有数据包重定向到 80)。

在这种情况下,Apache 配置是有效的,访问日志会跟踪请求,但没有关于端口配置问题的更多信息。响应是错误请求的代码 400:

x.x.x.x - - [25/Aug/2021:09:06:23 +0000] "\x16\x03\x01\x02" 400 0 "-" "-"

奖励:为了更轻松地调试 TLS,我使用 openssl s_client 而不是 curl 来检查 SSL 配置

openssl s_client -connect example2-domain.com:443

【讨论】:

以上是关于Apache:cURL:ssl3_get_record:apache2 ssl 的版本号错误的主要内容,如果未能解决你的问题,请参考以下文章

Apache:cURL:ssl3_get_record:apache2 ssl 的版本号错误

php curl 适用于 cli 但不适用于 apache

Apache HTTPClient POST 到 REST 服务的方式与 cURL 不同

在 Win10 / Apache 2.4 / PHP 7.0.10 x64 下未加载 cURL

使用 CURL 添加请求时间戳

apache kafka MM2 curl命令