[特别字符] HTTPS设置全攻略:从原理到实战,让你的网站秒变安全小卫士!

[复制链接]
发表于 2025-9-1 09:40:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
为什么现在所有网站都要用HTTPS,HTTP不是挺好用的吗?我当时就笑了,这就像问为什么出门要锁门一样。今天就来聊聊HTTPS这个话题,从原理到现实设置,包管让你看完就能上手。
说起HTTPS,我记得刚开始做运维那会儿,各人对SSL证书还挺陌生的,以为这玩意儿又贵又麻烦。现在回头看,真是期间变了,不消HTTPS的网站浏览器都会标红警告,用户看到就跑了。
HTTPS到底是个啥东西

简单说,HTTPS就是HTTP穿了件防弹衣。你知道HTTP吧,就是我们平时访问网站用的协议,但它有个致命问题——裸奔。所有数据都是明文传输,就像在大街上喊话一样,谁都能听到。
我之前碰到过一个案例,某个电商网站用的HTTP,结果用户在咖啡厅连WiFi购物时,暗码被人截获了。这事儿闹得挺大,末了老板拍桌子要求全站HTTPS。
HTTPS在HTTP基础上加了SSL/TLS层,这个SSL就像个翻译官,把你要说的话先加密,传到对方那里再解密。即使有人在中间偷听,听到的也是一堆乱码。
具体工作流程是这样的:

  • 客户端(浏览器)向服务器发起连接请求
  • 服务器返回SSL证书,证书里包罗公钥
  • 客户端验证证书是否可信
  • 验证通事后,客户端天生一个随机密钥,用服务器公钥加密发送
  • 服务器用私钥解密得到这个密钥
  • 之后双方就用这个密钥进行对称加密通信
这个过程叫SSL握手,听起来复杂,其实就几毫秒的事儿。
为什么非要用HTTPS不可

除了安全性,还有几个现实原因让你不得不消:
搜索引擎偏幸
Google早就明确表示,HTTPS是排名因素之一。百度虽然没明说,但你看看现在排前面的网站,根本都是HTTPS。不消的话,SEO就输在起跑线上了。
浏览器警告
Chrome、Firefox这些主流浏览器,看到HTTP网站就会表现"不安全"标识。用户看到这个,心里就犯嘀咕,还会继承访问吗?
功能限制
许多新的Web API,比如地理位置、摄像头访问等,浏览器强制要求HTTPS环境。不消的话,这些功能就别想了。
我有个朋侪做了个在线照相的网站,结果由于没用HTTPS,摄像头功能在Chrome上根本用不了,用户投诉一大堆。
免费SSL证书哪里搞

以前SSL证书动辄几千块,现在免费的一大把,主要有这几个渠道:
Let’s Encrypt
这是最着名的免费SSL证书提供商,Mozilla、Google等大厂支持的。证书有效期3个月,但可以自动续期。我现在大部分项目都用这个。
阿里云免费证书
阿里云每年提供20个免费的单域名证书,申请简单,得当小项目。不过现在限制比以前严了。
腾讯云免费证书
和阿里云雷同,也有免费额度,界面做得还不错。
Cloudflare
如果你用Cloudflare的CDN服务,SSL证书是免费包罗的,而且设置超简单。
我个人推荐Let’s Encrypt,虽然设置稍微复杂点,但胜在稳固可靠,而且没有数量限制。
Let’s Encrypt证书申请实战

申请Let’s Encrypt证书最常用的工具是Certbot,安装很简单:
  1. # CentOS/RHEL
  2. yum install certbot
  3. # Ubuntu/Debian  
  4. apt-get install certbot
  5. # 或者用snap安装(推荐)
  6. snap install --classic certbot
复制代码
申请证书有几种方式,我常用的是webroot模式:
  1. certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
复制代码
这个命令会在你的网站根目录下创建验证文件,Let’s Encrypt通过访问这个文件来验证域名所有权。
如果你的网站还没上线,可以用standalone模式:
  1. certbot certonly --standalone -d example.com
复制代码
这种方式会临时启动一个Web服务器来完成验证,但必要先停止现有的Web服务。
申请乐成后,证书文件会保存在/etc/letsencrypt/live/example.com/目录下:

  • fullchain.pem - 完整证书链
  • privkey.pem - 私钥文件
Nginx设置HTTPS的正确姿势

拿到证书后就要设置Nginx了,这里有不少坑要注意。
基础设置是这样的:
  1. server {
  2.     listen 443 ssl http2;
  3.     server_name example.com www.example.com;
  4.    
  5.     ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  6.     ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  7.    
  8.     # 其他配置...
  9. }
复制代码
但这样设置安全性还不敷,必要加强一下:
  1. server {
  2.     listen 443 ssl http2;
  3.     server_name example.com www.example.com;
  4.    
  5.     # SSL证书配置
  6.     ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  7.     ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  8.    
  9.     # SSL安全配置
  10.     ssl_protocols TLSv1.2 TLSv1.3;
  11.     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  12.     ssl_prefer_server_ciphers on;
  13.    
  14.     # SSL会话缓存
  15.     ssl_session_cache shared:SSL:10m;
  16.     ssl_session_timeout 10m;
  17.    
  18.     # HSTS安全头
  19.     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  20.    
  21.     # 其他安全头
  22.     add_header X-Frame-Options DENY;
  23.     add_header X-Content-Type-Options nosniff;
  24.     add_header X-XSS-Protection "1; mode=block";
  25.    
  26.     location / {
  27.         root /var/www/html;
  28.         index index.html index.htm;
  29.     }
  30. }
复制代码
别忘了还要设置HTTP到HTTPS的重定向:
  1. server {
  2.     listen 80;
  3.     server_name example.com www.example.com;
  4.     return 301 https://$server_name$request_uri;
  5. }
复制代码
设置完记得测试一下语法:
  1. nginx -t
复制代码
没问题就重载设置:
  1. nginx -s reload
复制代码
自动续期设置

Let’s Encrypt证书只有3个月有效期,手动续期太麻烦,必须搞自动化。
Certbot提供了续期命令:
  1. certbot renew --dry-run
复制代码
--dry-run参数是测试模式,确认没问题后去掉这个参数。
设置定时任务自动续期:
  1. crontab -e
复制代码
添加这行:
  1. 0 2 * * * /usr/bin/certbot renew --quiet && /usr/sbin/nginx -s reload
复制代码
这样每天凌晨2点会检查证书是否必要续期,如果必要就自动续期并重载Nginx。
我之前就碰到过证书逾期的尴尬,网站忽然不能访问了,用户投诉电话打爆了。从那以后我就特别重视自动续期这块。
常见问题排查

证书链不完整
有时间会碰到移动端访问正常,但某些老设备或软件报证书错误。这通常是证书链设置问题,确保利用fullchain.pem而不是cert.pem。
混淆内容警告
HTTPS页面引用HTTP资源会被浏览器阻止。检查页面中的图片、CSS、JS等资源链接,全部改成HTTPS或相对路径。
性能问题
SSL握手确实会增长一些耽误,但可以通过启用HTTP/2、设置SSL会话缓存等方式优化。现在的服务器性能都不错,影响其实很小。
我记得有次客户抱怨网站变慢了,排查半天发现是SSL设置有问题,没启用会话缓存,每次访问都要重新握手。调解后性能立马规复正常。
证书监控监控很重要

生产环境一定要监控监控证书状态,我一样平常用这几种方式:
命令行检查
  1. echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
复制代码
在线工具
SSL Labs的SSL Test是个不错的在线检测工具,能给出具体的安全评分和发起。
监控监控脚本
写个简单脚本定期检查证书有效期,快逾期时发邮件提醒:
  1. #!/bin/bash
  2. DOMAIN="example.com"
  3. EXPIRE_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
  4. EXPIRE_TIMESTAMP=$(date -d "$EXPIRE_DATE" +%s)
  5. CURRENT_TIMESTAMP=$(date +%s)
  6. DAYS_LEFT=$(( ($EXPIRE_TIMESTAMP - $CURRENT_TIMESTAMP) / 86400 ))
  7. if [ $DAYS_LEFT -lt 30 ]; then
  8.     echo "证书将在 $DAYS_LEFT 天后过期!" | mail -s "SSL证书过期提醒" [email protected]
  9. fi
复制代码
一些优化发起

启用HTTP/2
现在的浏览器根本都支持HTTP/2,能显著提拔性能。在Nginx设置中加上http2就行:
  1. listen 443 ssl http2;
复制代码
设置OCSP Stapling
这个功能可以减少客户端验证证书的时间:
  1. ssl_stapling on;
  2. ssl_stapling_verify on;
  3. ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
  4. resolver 8.8.8.8 8.8.4.4 valid=300s;
复制代码
利用CDN
如果网站访问量大,发起配合CDN利用。Cloudflare、阿里云CDN等都支持SSL,而且能进一步提拔性能。
说到CDN,我之前有个项目,服务器在国外,国内访问很慢。接入CDN后不仅速率快了,SSL设置也简化了不少,一举两得。
总结

HTTPS已经不是可选项,而是必须品了。从安全性、SEO、用户体验各个角度看,都没理由不消。
Let’s Encrypt让SSL证书的门槛降到了零,设置也不复杂,就是要注意自动续期和监控。Nginx的SSL设置看起来参数许多,但大部分都是模板化的,复制粘贴改改域名就能用。
最重要的是要养成好习惯:新项目一开始就设置HTTPS,不要等上线后再改;定期检查证书状态;关注安全更新。
我见过太多由于SSL设置问题导致的故障,大部分都是可以克制的。多花点时间在前期设置上,后面能省许多麻烦。
现在各大云厂商的SSL证书服务也越来越完善,如果不想折腾命令行,直接用云服务也是不错的选择。关键是要举措起来,别再让你的网站裸奔了!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表