网站加了HTTPS还是不安全?常见配置错误排查指南
“我的网站加了HTTPS,为什么浏览器还是说不安全?”这是很多站长遇到过的困惑。
问题往往不在证书本身,而在配置。 一个配置不当的HTTPS网站,安全性可能还不如HTTP。
常见的HTTPS配置错误
错误一:混合内容(Mixed Content)
网站通过HTTPS加载,但页面里混入了HTTP资源(图片、JS、CSS)。浏览器会认为页面不完整加密,地址栏小锁变成警告图标。
典型表现:首页是HTTPS,但某张图片用了 http:// 开头的URL,控制台报错”Mixed Content”。
解决办法:
- •把所有HTTP资源改成HTTPS
- •用相对协议
//example.com/img.jpg - •添加CSP头强制升级:
upgrade-insecure-requests
错误二:证书链不完整
服务器只配置了域名证书,没配置中间证书。浏览器无法建立完整的信任链,提示”证书无效”。
典型表现:电脑浏览器正常,手机浏览器报错;或Chrome正常,Firefox报错。
解决办法:把中间证书拼接到域名证书后面,生成fullchain.crt:
cat domain.crt intermediate.crt > fullchain.crt
Nginx配置用 ssl_certificate fullchain.crt 而不是单独的domain.crt。
错误三:HTTP没有301跳转到HTTPS
HTTP和HTTPS都能访问,用户可能通过HTTP进入,等于没加密。
解决办法:Nginx配置301跳转:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
错误四:用了过时的加密算法
证书没问题,但服务器配置了弱加密算法(RC4、SHA-1、SSLv3等),浏览器会警告。
解决办法:Nginx配置现代加密套件:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
错误五:HSTS没配置
HSTS(HTTP Strict Transport Security)告诉浏览器”以后只通过HTTPS访问本站”,防止SSL剥离攻击。
解决办法:添加响应头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
如何检测HTTPS配置
在线检测工具
SSL Labs(推荐):访问 ssllabs.com/ssltest,输入域名检测。会给你的HTTPS配置打分(A+到F),并指出所有问题。
MySSL:国内检测工具,访问 myssl.com,中文界面,报告详细。
命令行检测
# 检测证书链
openssl s_client -connect example.com:443 -servername example.com
# 检测支持的协议和加密套件
nmap --script ssl-enum-ciphers -p 443 example.com
# 检测HSTS头
curl -I https://example.com | grep -i strict
一个合格的HTTPS配置应该具备
1. 有效的SSL证书:未过期、域名匹配、证书链完整
2. 强制HTTPS跳转:HTTP访问自动301到HTTPS
3. 现代加密套件:禁用SSLv3、TLSv1.0、TLSv1.1,启用TLSv1.2和TLSv1.3
4. HSTS头:max-age至少31536000(1年)
5. 无混合内容:所有资源通过HTTPS加载
6. OCSP Stapling:启用OCSP装订,提升握手速度
参考配置:Nginx完整HTTPS
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/fullchain.crt;
ssl_certificate_key /path/to/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
# 其他配置...
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
结语
加HTTPS不是装个证书就完事,配置细节决定安全性。用SSL Labs检测一下你的站,目标A+评级才算是合格的HTTPS。