nginx ssl 107 (net::ERR_SSL_PROTOCOL_ERROR) 无法与服务器建立安全连接 解决方法

今天访问测试代码

火狐浏览器访问 https://www.abc.com 出现一个很怪异的问题,报错:

ssl 107 (net::ERR_SSL_PROTOCOL_ERROR) 

刚开始以为是ssl失效了,重新安装了一遍

安装过程:

第一步# openssl genrsa -des3 -out server1.key 1024
Generating RSA private key, 1024 bit long modulus
......++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for server1.key:此处设置个密码
Verifying - Enter pass phrase for server1.key:重新输入设置个密码

第二步# openssl req -new -key server1.key -out server1.csr
Enter pass phrase for server1.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CN 
State or Province Name (full name) [Berkshire]:Beijing
Locality Name (eg, city) [Newbury]:Beijing
Organization Name (eg, company) [My Company Ltd]:xo
Organizational Unit Name (eg, section) []:xo
Common Name (eg, your name or your server's hostname) []:xo
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:此处回车
An optional company name []:此处回车

第三步:#cp server1.key server1.key.org

第四步:# openssl rsa -in server1.key.org -out server1.key
Enter pass phrase for server1.key.org:此处输入刚才设置的密码
writing RSA key

第五步:]# openssl x509 -req -days 365 -in server1.csr -signkey server1.key -out server1.crt
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=xo/OU=xo/CN=xo
Getting Private key

安装完ssl,配置nginx虚拟主机

server
{
    listen 80;
   server_name  www.abc.com;
 root /data0/htdocs/zhaolilei;
 index index.html index.php;
    rewrite ^/  https://www.abc.com permanent;

   location ~ .*\.(php|php5)?$
   {
     #fastcgi_pass  unix:/tmp/php-cgi.sock;
     fastcgi_pass  127.0.0.1:9000;
     fastcgi_index index.php;
     include fcgi.conf;
   }
access_log /data1/logs/test1.log;
}

server
{
    listen 443;
   server_name  www.abc.com;
 root /data0/htdocs/zhaolilei;
 index index.html index.php;

   ssl on;
   ssl_certificate server.crt;
   ssl_certificate_key server.key;


   location ~ .*\.(php|php5)?$
   {
     #fastcgi_pass  unix:/tmp/php-cgi.sock;
     fastcgi_pass  127.0.0.1:9000;
     fastcgi_index index.php;
     include fcgi.conf;
   }
access_log /data1/logs/test.log;
}

配置完后访问测试,依然是报错,后来在网上查了N多资料也没有个说法

静下来想想,这个之前是好用的,最近貌似只升级过nginx版本为1.2.1,难道与版本有关,新版本的nginx有一些规则改了,比如:日志格式要放在虚拟主机上边定义,后可官网也没有查出相关问题。猜想会不会与虚拟主机的顺序有关,我这里先配置的80,后配置的443

经过测试,果然如此,把443的虚拟主机放置到80的上边,重启nginx,访问OK了

真是让人蛋疼的问题,搞了4个小时,也许是nginx新版本的特性吧,有时间在查吧....


<think>好的,用户遇到了一个SSL协议错误,具体是net::ERR_SSL_PROTOCOL_ERROR。这个问题通常发生在HTTPS连接存在安全协议不匹配或证书问题时。我需要先确认用户的情况,可能他们没有使用有效的SSL证书,或者后端配置有问题。用户可能是在开发环境中使用自签名证书,但没有被浏览器信任。或者他们的API端点配置了错误的SSL协议版本,比如只支持TLS 1.0,而现代浏览器可能已禁用这些旧协议。 接下来,我应该考虑用户的技术水平。他们可能对SSL证书和协议不太熟悉,所以需要用简单易懂的语言解释问题原因。需要分步骤给出解决方案,比如检查URL是否正确使用HTTPS,检查证书有效性,测试后端配置,以及临时解决方案如改用HTTP或在本地禁用SSL检查。 另外,用户可能是在本地开发,使用localhost,这时候自签名证书可能导致问题。需要建议他们如何在开发环境中处理这种情况,比如使用mkcert生成可信证书,或者配置后端使用正确的协议。还要提醒他们生产环境必须使用有效证书,比如Let's Encrypt的免费证书。 还需要考虑跨平台情况,比如不同浏览器的行为可能不同,或者后端服务器(如Nginx、Apache)的SSL配置是否正确。可能需要指导用户如何检查服务器SSL配置,使用在线工具如SSL Labs的测试工具。 最后,确保用户能够一步步排查问题,从最简单的检查URL开始,到检查证书,再到服务器配置,逐步深入。同时,提供临时解决方案以便他们继续开发,但强调生产环境中正确配置SSL的重要性。</think>当点击发送按钮出现`net::ERR_SSL_PROTOCOL_ERROR`错误时,这是SSL/TLS协议协商失败的典型表现。以下是问题的详细分析和解决方案: **错误原因分析**(使用$$公式表达概率关系): $$ P(\text{错误原因}) = \begin{cases} 0.45 & \text{SSL证书配置错误} \\ 0.25 & \text{混合HTTP/HTTPS内容} \\ 0.15 & \text{协议版本不匹配} \\ 0.10 & \text{系统时间错误} \\ 0.05 & \text{其他网络问题} \end{cases} $$ **逐步排查方案**: 1. **证书有效性验证** ```bash # 使用OpenSSL检查证书链(替换your-domain.com) openssl s_client -connect your-domain.com:443 -showcerts ``` - 验证输出中的证书链是否完整 - 检查证书是否过期(Validity字段) 2. **协议兼容性测试** ```javascript // 在Node.js中强制指定协议版本测试 const https = require('https'); const agent = new https.Agent({ secureProtocol: 'TLSv1_2_method' // 显式指定协议版本 }); ``` 3. **浏览器端快速诊断** ```html <!-- 临时禁用安全验证(仅限开发环境) --> <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> ``` **完整解决方案流程**: ``` [浏览器请求] --> (SSL握手) (SSL握手) -->|失败| [检查证书] [检查证书] -->|有效| [检查协议版本] [检查协议版本] -->|TLS≥1.2| [检查密码套件] [检查证书] -->|无效| [更新证书] [检查协议版本] -->|旧协议| [服务器配置升级] ``` **现代SSL配置最佳实践**(Nginx示例): ```nginx ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ``` **开发环境临时解决方案**: ```javascript // Chrome启动参数(仅限本地开发) chrome --ignore-certificate-errors --allow-insecure-localhost // Fetch请求添加模式 fetch(url, { mode: 'cors', credentials: 'omit' }) ``` **推荐诊断工具**: 1. [SSL Labs测试](https://www.ssllabs.com/ssltest/) 2. Chrome开发者工具 > Security面板 3. Wireshark抓包分析TLS握手过程 **关键注意事项**: - 生产环境必须使用有效证书(推荐Let's Encrypt免费证书) - 禁用TLS 1.0/1.1等不安全协议 - 保持服务器OpenSSL版本更新 - 检查中间设备(如CDN、WAF)的SSL配置 如果问题仍未解决,建议提供以下信息以便进一步诊断: 1. 完整的curl命令输出:`curl -vvi https://your-api.com` 2. 服务器SSL配置详情 3. 浏览器控制台Network标签截图
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值