error:14090086:SSL routines:SSL3_GET_SERVER_CERTIE

我的操作系统是linux Deepin2014.3, 64bit。采用的xampp-linux-x64-5.6.8-0-installer.run经过一系列配置,

安装的php,YII2.0框架,PHP版本高于5.4,调用这个命令的时候出问题了。

composer global require "fxp/composer-asset-plugin:1.0.0"

弹出这样的问题

Changed current directory to /home/litianci/.composer
./composer.json has been updated
Loading composer repositories with package information
The "https://packagist.org/packages.json" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Failed to enable crypto
failed to open stream: operation failedhttps://packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of dateUpdating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

看问题是SSL的验证问题,网上搜索了很久没有解决.

下面是来自某被墙的网页的快照。没办法,贴网址也无效。

经过原因查找,在验证证书的时候出现问题,是本地ssl判别证书太旧,导致报ssl证书错误

解决方案一、

下载新的ssl本地判别文件

    wget http://curl.haxx.se/ca/cacert.pem

并更名为ca-bundle.crt放置到默认目录。如果该目录不存在可以创建。

     mv cacert.pem ca-bundle.crt  | mv ca-bundle.crt /etc/pki/tls/certs/

或者curl  –cacert cacert.pem 方式指定调用

然后无意中更改了一下xampp-linux-x64-5.6.8-0-installer.run为一个老的版本xampp-linux-x64-1.8.3-5-installer.run,竟然可以使用了,你不妨换换版本的。

我在deepin2014.3,64bit操作系统下测试成功解决该error.

解决方案二、[版本太老,不建议用]

借鉴 http://pkg.phpcomposer.com/ 。感谢分享。

修改~/.composer/config.json,添加

{
    "repositories": [
        {"type": "composer", "url": "http://pkg.phpcomposer.com/repo/packagist/"},
        {"packagist": false}
    ]}

最终是这样子的。

{
    "config": {

    },
    "repositories": [
        {"type": "composer", "url": "http://pkg.phpcomposer.com/repo/packagist/"},
        {"packagist": false}
    ]}

最终测试可以使用。

解决方案三[完美解决]

参考:https://github.com/composer/composer/issues/3346

First: Check certificate file location which will be in default_cert_file key, you will found it in openssl_get_cert_locations() its php openssl function:

找到验证文件在哪里?

这个发现在

/opt/lampp/share/openssl/cert.pem
$ php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /opt/lampp/share/openssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /opt/lampp/share/openssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /opt/lampp/share/openssl/private
    [default_default_cert_area] => /opt/lampp/share/openssl
    [ini_cafile] => 
    [ini_capath] => 
)

Second: Download http://curl.haxx.se/ca/cacert.pem:

$ wget http://curl.haxx.se/ca/cacert.pem

Third: Copy certificate PEM file into default_cert_file location:

$ sudo mv cacert.pem /opt/lampp/share/openssl/cert.pem

My php-cli is under XAMPP and default_cert_file maybe point to some place that is different than this.

Fourth:Restart xampp:

$ sudo /opt/lampp/xampp restart

I hope anything after that should goes fine with you brothers.


转载于:https://my.oschina.net/bubifengyun/blog/469277

<think>好的,我现在需要解决用户关于TLS握手错误的问题,具体错误是“error:1408F10B:SSL routines:ssl3_get_record:wrong version number”。首先,我得理解这个错误的含义和常见原因。 用户可能遇到了与SSL/TLS连接相关的问题,这个错误通常发生在客户端和服务器之间尝试建立安全连接时。根据错误代码,错误提示指出“wrong version number”,也就是版本号不对。这可能意味着客户端和服务器在TLS协议版本上不兼容。 接下来,我需要回忆一下TLS握手的过程。在握手阶段,客户端会发送ClientHello消息,其中包含支持的TLS版本列表。服务器选择其中一个版本并回复ServerHello。如果服务器不支持客户端提供的任何版本,或者客户端尝试使用过低的版本(比如SSLv3),而服务器已经不再支持,可能会导致此错误。 接下来考虑可能的原因。首先,客户端可能配置了过时的TLS版本,比如SSLv3,而服务器要求更高的版本如TLS 1.2或1.3。另外,也有可能是服务器没有正确配置TLS,或者客户端错误地连接到非SSL端口,比如HTTP而不是HTTPS,导致服务器返回非SSL响应,客户端误以为是SSL数据,从而解析错误版本号。 然后需要思考如何验证这些可能性。用户可以检查客户端使用的TLS版本,例如在OpenSSL命令中指定版本,或者检查代码中的SSL配置。同时,确认连接的端口是否正确,比如443端口用于HTTPS。此外,使用工具如openssl s_client或在线检测工具测试服务器支持的协议版本可能会有帮助。 另外,服务器端的配置也需要检查,确保它支持现代TLS版本,并且没有错误配置。防火墙或中间设备可能干扰了连接,修改了数据包,导致版本号错误。比如,有些安全设备可能会拦截SSL流量,导致不兼容。 最后,解决方案可能包括更新客户端或服务器的TLS配置,使用更现代的协议版本,确保端口正确,检查网络中间设备,以及验证证书配置是否正确。可能需要具体指导用户如何执行这些检查,例如提供openssl命令示例,或者建议查看服务器日志。 需要确保回答清晰,分步骤说明可能的原因和解决方法,帮助用户逐步排查问题。同时,使用中文,避免技术术语过于复杂,让用户容易理解。</think>当你在网络通信中遇到 `TLS handshake error: error:1408F10B:SSL routines:ssl3_get_record:wrong version number` 错误时,通常表示 **客户端与服务器在 TLS 协议版本协商时出现不兼容**。以下是逐步分析与解决方案: --- ### **错误原因分析** 1. **协议版本不匹配** - 客户端尝试使用过时的 TLS/SSL 协议版本(如 SSLv3),而服务器已禁用对旧版本的支持。 - 服务器可能仅支持更高版本的 TLS(如 TLS 1.2、1.3),但客户端未正确配置或未声明支持这些版本。 2. **端口或协议误用** - 客户端可能尝试在非 SSL/TLS 端口(如 HTTP 的 80 端口)上建立加密连接。 - 服务器返回的响应不是合法的 TLS 握手数据(例如返回了普通 HTTP 响应),导致客户端解析失败。 3. **中间设备干扰** - 防火墙、代理或负载均衡器可能修改了流量,破坏了 TLS 握手过程。 --- ### **逐步排查与解决方案** #### **1. 检查客户端配置** - **强制使用现代 TLS 版本** 如果使用 OpenSSL 或类似库,确保客户端声明支持 TLS 1.2+。例如,在 OpenSSL 命令中指定版本: ```bash openssl s_client -connect example.com:443 -tls1_2 ``` - **禁用过时协议** 在代码中显式禁用 SSLv3 和旧版 TLS(以 Python 为例): ```python import ssl context = ssl.create_default_context() context.options |= ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ``` #### **2. 验证服务器配置** - **测试服务器支持的协议** 使用工具检查服务器支持的 TLS 版本: ```bash openssl s_client -connect example.com:443 -tls1_2 openssl s_client -connect example.com:443 -tls1_3 ``` 如果返回 `SSL handshake has read ...` 且成功建立连接,说明服务器支持该版本。 - **在线检测工具** 使用 [SSL Labs Server Test](https://www.ssllabs.com/ssltest/) 分析服务器的 TLS 配置,确保未禁用现代协议。 #### **3. 确认端口和协议** - **检查端口是否正确** TLS/SSL 通常运行在 443 端口。若使用其他端口(如 80),需确认服务器是否在该端口上启用了 TLS。 - **验证协议类型** 如果服务器是 HTTP 服务而非 HTTPS,客户端尝试 TLS 握手会直接失败。例如,对 `http://example.com` 使用 HTTPS 连接会导致此错误。 #### **4. 排查中间设备干扰** - **临时禁用防火墙/代理** 测试在绕过防火墙或代理的情况下是否能成功建立连接。若问题消失,需检查中间设备的配置。 - **抓包分析** 使用 Wireshark 或 `tcpdump` 捕获流量,观察 TLS 握手阶段的数据包: ```bash tcpdump -i any -w capture.pcap port 443 ``` 检查 `ClientHello` 和 `ServerHello` 中的协议版本是否匹配。 #### **5. 其他可能原因** - **证书问题** 虽然此错误直接与协议版本相关,但证书配置错误(如证书链不完整)可能间接导致握手失败。确保服务器证书有效且配置正确。 - **客户端/服务器库版本过旧** 更新客户端或服务器的 SSL/TLS 库(如 OpenSSL、BoringSSL)至最新版本。 --- ### **总结** 该错误的根本原因是 **客户端与服务器未能协商出兼容的 TLS 协议版本**。优先检查以下方面: 1. 客户端强制使用 TLS 1.2+。 2. 服务器支持现代协议且未禁用旧版本。 3. 连接的是正确的 HTTPS 端口(443)。 4. 中间设备未篡改流量。 通过逐步排查,通常可以定位并解决问题。如果问题持续,提供完整的错误日志和抓包数据有助于进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值