证书买回来或者免费签下来,看着压缩包里一堆文件就开始犯迷糊,不知道哪个该传、传到哪儿去,这是很多站长第一次上HTTPS时的真实状态。其实部署SSL本身并不复杂,难的是细节没踩对:文件选错了,用户会看到证书链不完整的警告;权限放得太松,等于把私钥摊在服务器上;配置写完不验证,自己看着是绿锁,别人访问还在弹风险提示。这篇就按最笨也最稳的三步走一遍,先把该传的两个文件认清楚,再改Nginx配置,最后验证并补上80端口的跳转。

先认文件:证书包里该传的到底是哪两个
不管你从哪里拿到的证书,包里通常会有一堆后缀相似的文件,真正要传上服务器的只有两个。一个是fullchain.pem,里面装的是站点证书加上中间证书,缺了中间证书,桌面浏览器可能看着正常,手机上却会提示不受信任;另一个是privkey.pem,也就是私钥,这东西泄露了等于别人能冒充你的域名,比证书本身还金贵。有些服务商给的文件名不一样,可能叫域名.crt配域名.key,或者单独给一个bundle.crt,名字不重要,看内容才对,实在分不清就翻服务商的部署说明,以官方页面写的为准,别靠猜。
第一步:上传到/etc/nginx/ssl/并执行chmod 600
习惯上我会单独建一个目录放证书,命令是mkdir -p /etc/nginx/ssl/,然后用scp或者面板自带的文件管理器把两个文件传进去,改名统一成域名相关的名字,方便以后续期时替换。传完第一件事就是收紧权限,执行chmod 600 privkey.pem,需要时再配合chown root:root把属主定死。为什么这么讲究?因为私钥一旦是644,同一台机器上任何能读文件的人都能把它拷走。ls -l看一眼,只要显示成-rw——-就对了。还有条铁律:证书文件千万别放在网站根目录下面,那样等于直接开下载,搜索引擎都可能给你抓走。
第二步:在server段挂上证书,协议只留TLSv1.2和TLSv1.3
接下来改Nginx的配置文件,站点配置一般在nginx.conf里,或者conf.d、sites-available这类目录下的单独文件。找到监听443的那个server段,加两行:ssl_certificate指向fullchain.pem的绝对路径,ssl_certificate_key指向privkey.pem的绝对路径,路径别写相对路径,容易因为工作目录不同而不生效。然后把协议版本收一收,ssl_protocols只保留TLSv1.2和TLSv1.3,老的TLSv1和TLSv1.1早就被主流浏览器放弃,留着不解决问题还添风险。改之前记得先备份,cp一份配置文件放旁边,回滚只要几秒钟。
这一步最容易踩的三个坑
第一个坑是路径对不上,尤其证书续期后新文件名变了,配置还指着旧文件,Nginx启动直接失败;第二个坑是只写了站点证书,没带中间证书,微信内置浏览器和一些接口调用就会报错,回头查半天发现是文件选错;第三个坑是同一台服务器上跑了几个站点,只给默认站点配了证书,访问另一个域名照样弹警告,每个server段都得单独配,或者用同一张能覆盖这些域名的证书。另外提醒一句,server_name写的域名必须和证书签发的域名对得上,对不上就是白配。
第三步上半场:先nginx -t,通过了再nginx -s reload
配置文件改完别急着重启,先跑nginx -t做语法体检,输出里出现syntax is ok和test is successful,才算真的没问题。这一步不过,说明某个路径写错了、少了分号或者括号没配对,照着报错的行号回去改,改完再测一遍,测到过为止。通过了之后用nginx -s reload平滑重载,它会在新进程起来之后再慢慢退掉老进程,正在访问的用户基本无感,比直接重启服务温和得多。如果你用的是面板或者容器环境,面板上的重载按钮和systemctl reload nginx是一个效果,挑顺手的来。
第三步下半场:用openssl s_client看证书链全不全
重载完别只看浏览器那个绿锁,那个绿锁有时候会骗人。更靠谱的办法是敲一条命令:openssl s_client -connect www.example.com:443 -servername www.example.com,把域名换成你自己站点的。看输出里的Certificate chain部分,正常情况编号0是站点证书,下面还会跟着1、2这样的中间证书,一路能接到根证书;如果只孤零零一条0,说明链没配全,多半是把单证书文件当成fullchain用了。再扫一眼Verify return code,显示0就代表校验通过。这里的-servername不能省,同一台机器上挂了多个域名时,全靠它指定要检哪个站。
最后一步:80端口用return 301跳到https
证书装好了,还得让走80端口的老访问自动落到https上,否则用户输个不带协议的域名,照样进的明文页面。做法是在监听80的那个server段里写一行return 301 https://$host$request_uri,用$host和$request_uri拼完整地址,能把后面的路径和参数原样带过去;只跳到首页的写法看着省事,实际上会把栏目页、文章页全丢到首页,对收录是实打实的伤害。改完再跑一次nginx -t和reload。还要确认没有跳转死循环,443的server段里别再往回跳到80。
收尾自查:这几件事顺手做了,省得回头返工
最后补几件事。第一,把网站地址、后台地址、内链和图片引用都换成https,页面里只要还混着一个http资源,浏览器那把锁就会变黄或者干脆不显示,这叫混合内容,排查起来最费时间;第二,证书有有效期,免费证书通常三个月一签,自动续期脚本要确认续完之后会重新加载配置,否则续了等于没续;第三,配置文件改动前留备份,服务器上哪天多个人一起改,能快速比对;第四,用手机流量再访问一次,运营商网络和公司内网的表现有时不一样。
三步走完,其实核心就一句话:文件传对、权限收紧、配置改准、验证到位。第一次配可能要多试两遍,报错了也别慌,Nginx给的报错信息挺实在,照着行号找基本都能定位。等这套流程走顺了,以后换服务器、续期证书、上新站,都是复制配置改个域名的事儿。基础功打牢了,做站的后半程才不会被这些琐事反复打断。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!