ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

宝塔面板SSL证书部署实战:从域名解析到HTTPS全面配置

宝塔面板SSL证书部署实战:从域名解析到HTTPS全面配置 1. 建站前的准备域名解析与宝塔面板的初始化先说结论要用宝塔面板给网站部署SSL证书第一步永远不是打开面板点“申请证书”而是先把域名解析到位、把站点建出来。很多人第一次搞HTTPS上来就点申请结果证书列表里报红一片最后发现是域名根本没解析到服务器IP上白折腾一晚上。1.1 域名解析A记录和解析生效的判断域名解析本质上就是把域名和服务器IP绑定。宝塔面板装好之后面板首页会显示这台服务器的公网IP你需要去域名服务商的控制台阿里云、腾讯云、Namecheap等都行添加一条A记录记录类型A主机记录代表根域名和 www代表 www 子域名记录值你的服务器公网IPTTL默认即可一般选600秒或自动解析生效时间通常在几分钟到几小时之间快的时候一两分钟。判断是否生效最快的方式不是等而是在本机命令行敲一下ping 你的域名如果返回的IP和服务器公网IP一致说明解析已经生效。也可以用在线工具比如多地ping工具看看全国节点的解析情况。注意很多云厂商的服务器默认安全组没有放行80和443端口导致域名解析没问题但网站就是打不开。如果申请证书时一直提示验证失败先检查安全组和宝塔面板里的端口放行列表确认80端口对外可访问。1.2 宝塔面板添加站点前需要理解的事宝塔面板现阶段有免费版和付费专业版本篇文章要用的“添加站点”“申请Let‘s Encrypt证书”“配置SSL”这些功能免费版完全够用不需要购买任何付费插件就能完成HTTPS部署全流程。这只是我的实际经验不是劝你升级付费免费版做到这个程度已经非常稳定。打开面板左侧菜单点“网站”再点“添加站点”。这里有几个关键配置项域名填你的域名比如example.com紧接着可以加www.example.com一起绑定。宝塔会自动把两个域名都配置进Nginx站点的server_name里。是否需要两个都填取决于你希望用户访问www还是根域名。我的习惯是两个都绑后期靠301跳转统一到一个主域名。根目录默认是/www/wwwroot/你的域名不用改。后面网站的源文件都会放这里。FTP日常不推荐创建FTP账号直接用面板文件管理器或SFTP更安全。如果团队协作需要上传文件建议创建一个受限FTP账号只给站点目录的权限。数据库如果网站需要数据库比如WordPress、ThinkPHP应用这里可以顺便创建MySQL数据库。纯静态网站可以不建。PHP版本宝塔面板可以给每个站点单独指定PHP版本。如果网站是 WordPress 这类PHP应用选一个合适的PHP版本比如PHP 7.4或8.1如果是纯HTML静态站选择“纯静态”即可。这些选项后面都可以在站点设置里改所以第一次不用太纠结核心是先把域名和站点目录绑定上。1.3 删除默认站点避免证书申请的隐性冲突这里有个非常容易被忽略的坑。宝塔面板安装完成后会在Nginx里生成一个默认站点IP访问或未绑定的域名访问时会落到这个默认站点上。如果你自己的域名已经解析过来了也在面板添加了站点但新站点还没有上传内容此时用浏览器访问域名看到的可能是默认站点的页面。这个默认站点存在本身问题不大但在某些证书验证场景下会造成干扰尤其是你用DNS验证申请证书时如果验证服务器访问到的内容和预期不一致会直接导致验证失败。所以我的习惯是新装面板之后第一件事就是把默认站点删掉然后在站点设置里把“默认站点”选项指到自己的站点或者干脆留空。实操小技巧宝塔面板“网站”页面的“默认站点”设置选项位置在右上角点进去可以把默认站点指定为你的业务站点。这样做的好处是任何未绑定的域名或被恶意解析到该IP的域名访问时不会暴露无关页面对SSL验证和安全性都有帮助。2. SSL证书的分类与免费证书选型在动手申请证书之前有必要弄清楚免费证书到底免费在哪儿、和收费证书差在哪儿。这样你在选择时就不会被“免费的一定不行”这种想法误导也能在面试或写方案时讲清楚原理。2.1 SSL/TLS的作用机制简析SSL证书严格说是TLS证书但大家习惯叫SSL做的事情本质上是两件加密传输和身份验证。加密传输浏览器和服务器之间传输的数据用对称加密算法加密即使被中间人截获也读不出明文。对称加密的密钥则是通过非对称加密公钥/私钥在握手阶段协商出来的。身份验证证书里包含域名信息和CA证书颁发机构的数字签名浏览器收到证书后会校验这个签名是否来自受信任的CA以及证书上的域名是否和当前访问的域名一致。这个机制解决的核心问题叫“中间人攻击”。没有证书的HTTP协议数据在网络上以明文方式传输任何一跳的网络节点都能看到完整内容。加了证书之后即使数据被截获没有私钥也解不开。2.2 证书类型DV、OV和EV的区别按验证级别SSL证书分为DV域名验证、OV组织验证和EV增强验证三种类型验证内容签发速度地址栏特征适合场景DV证书仅验证域名所有权几分钟到几小时小锁标志个人网站、中小站点OV证书验证域名企业真实信息1-5个工作日小锁标志企业官网、电商平台EV证书验证域名企业信息法律文件3-10个工作日公司名称显示在地址栏银行、支付平台免费证书基本都是DV级别因为自动化验证成本低CA可以免费或低价提供。对于绝大多数个人博客、企业展示站、中小型业务系统DV证书在加密强度上和OV/EV没有任何区别区别只在“验证了谁”。如果你运营的是需要用户信任度极高的交易平台可以考虑付费OV/EV证书如果只是想加密传输、过等保要求、让浏览器不报红免费DV证书完全满足需求。2.3 为什么运营商免费证书推荐Let‘s Encrypt现在市面上免费证书的来源主要有两种渠道Let’s Encrypt社区CA以及云厂商的免费DV证书比如阿里云、腾讯云每年都可以申请的免费证书。Let‘s Encrypt的优势在于完全免费没有一年一限制的套路90天自动续期。标准化程度高基于ACME协议宝塔面板原生支持申请和续期都能自动化。兼容性广所有主流浏览器和操作系统都信任它的根证书。支持泛域名证书一张证书管所有子域名。云厂商的免费证书虽然也能用但通常有效期只有一年到期后需要手动重新申请、下载、部署路径繁琐而且不支持泛域名。我的实践建议日常站点用Let’s Encrypt通过宝塔面板自动续期省心程度高很多。2.4 单域名、多域名与泛域名证书的选择逻辑申请证书时会看到“单域名”“多域名”“泛域名”这几个选项对应的英文是Single Domain、Multi-DomainSAN、Wildcard。单域名证书只保护一个域名比如只保护www.example.com根域名example.com不在覆盖范围内。多域名证书一张证书里包含多个域名如example.com、www.example.com、blog.example.com每个域名单独计算配额。泛域名证书保护*.example.com所有二级子域名但不包含根域名部分CA支持根域名的组合。对于个人站点最省心的方案是申请包含根域名和www的证书或者直接申请泛域名证书。比如你的主域名是example.com又开了shop.example.com和app.example.com这两个子站一张泛域名证书就能全部覆盖不用每个子站单独申请。Let‘s Encrypt在宝塔面板里申请时勾选“域名”时填*.example.com和example.com两个即可。3. 证书申请实操Lets Encrypt与云厂商证书双路径接下来是整篇文章的操作核心。我会分两条路线来写一条是宝塔面板里直接申请的Lets Encrypt证书适合绝大多数场景另一条是云厂商控制台上申请的免费证书再导入到宝塔里适合需要“云厂商品牌背书”或特殊合规要求的场景。3.1 路径一宝塔面板自动申请Let‘s Encrypt证书宝塔面板对Lets Encrypt支持已经非常成熟操作流程基本是图形化点击。第一步进入“网站”页面找到你要配置的站点点击右侧的“设置”切换到“SSL”标签页。第二步在SSL页面顶部选择“Let‘s Encrypt证书”这一项。这里有几个关键配置域名勾选你需要签发证书的域名我建议把example.com和www.example.com都勾上一张证书覆盖两个域名。验证方式宝塔提供了DNS验证和文件验证两种一般默认文件验证即可。文件验证的原理是CA的验证服务器会访问http://你的域名/.well-known/acme-challenge/xxxx来确认文件内容是否匹配所以要求服务器的80端口必须能正常访问并且站点目录可写。勾选“自动续期”和“强制HTTPS”这两个都建议勾上。自动续期会在证书到期前自动续签强制HTTPS会把所有HTTP请求301跳转到HTTPS。第三步点击“申请”按钮。等待时间通常在10秒到2分钟之间。申请成功后页面会弹出证书列表显示证书的域名、签发日期、到期日期等信息。申请失败时最常见的原因是80端口被安全组拦截、站点目录不可写、或者域名解析还未生效。排查方法是在浏览器直接访问http://你的域名/.well-known/acme-challenge/test.txt随便放一个测试文件如果能正常访问说明路径没问题。3.2 路径二云厂商免费证书的申请与导入如果你因为某些原因不想用Lets Encrypt比如内网服务器无法访问Lets Encrypt验证服务器或者客户指定要国内CA签发的证书可以走云厂商的免费证书通道。以阿里云为例整体流程是登录阿里云控制台找到“数字证书管理服务”原SSL证书服务。在“免费证书”页面点击“创建证书”每年可以领取一定数量的免费DV证书额度。在证书列表里点击“申请”填写要绑定的域名比如example.com。选择验证方式。阿里云免费证书通常用DNS验证你需要在域名解析里加一条TXT记录记录类型选TXT主机记录和记录值按页面提示填。添加完成后点“验证”等待CA确认通过。审核通过后证书状态变为“已签发”点击“下载”。服务器类型选“Nginx”会得到一个压缩包里面有.pem和.key两个文件。回到宝塔面板在“SSL”标签页选择“其他证书”把.pem内容复制到“证书(公钥)”框把.key内容复制到“私钥”框点击“保存”。这个路径的坑主要在DNS验证环节。TXT记录添加后不是立刻就生效通常要等1-10分钟。如果验证失败不要急着反复提交先用命令行确认TXT解析是否成功nslookup -typeTXT _dnsauth.example.com如果返回的记录值和阿里云要求的一致说明解析没问题再回控制台重新验证。实操心得从云厂商申请的证书有效期通常是一年到期后需要手动重新申请、下载、导入。建议在手机日历或服务器监控里设置到期提醒避免证书过期导致网站突然打不开。3.3 证书申请完成后的关键动作强制HTTPS与HTTP/2证书配置好之后还有几个动作必须做不然HTTPS只能算“半成品”。在宝塔SSL页面证书部署成功后“强制HTTPS”的开关建议打开。开启后用户访问http://example.com会被301跳转到https://example.com避免网站出现“有锁也有没锁”的混合内容问题。紧接着切到“网站”页面的“配置文件”标签检查Nginx配置里的监听端口。正确的HTTPS站点配置应该长这样server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name example.com www.example.com; root /www/wwwroot/example.com; ssl_certificate /www/server/panel/vhost/cert/example.com/cert.pem; ssl_certificate_key /www/server/panel/vhost/cert/example.com/privkey.pem; }这里面listen 443 ssl http2表示启用HTTP/2协议。HTTP/2能显著提升HTTPS下的页面加载速度因为它在同一个连接上多路复用并行传输多个请求减少握手和往返延迟。宝塔面板默认会生成这一行配置不需要额外改动。如果老版本没有http2手动加上即可。启用之后记得保存配置然后在宝塔“网站”页面点“重载”或“重启”Nginx使配置生效。配置文件修改有语法错误时点保存会直接报红提示根据提示调整。4. 部署验证与常见报错排查全记录很多人在配置完SSL后用浏览器打开觉得“能访问就不管了”这其实不够严谨。下面列出的验证方法和排查记录都是我在实际维护中反复用到的高频操作。4.1 验证HTTPS是否真正生效的三种方法方法一浏览器地址栏观察。配置成功后访问网址地址栏左侧会出现小锁标志点击能看到“连接是安全的”或者“证书有效”的信息。如果浏览器提示“不安全”或者被拦截说明配置还没完成。方法二命令行直接看证书详情。用curl命令最直接curl -I https://example.com返回的响应头里如果有HTTP/2 200或HTTP/1.1 200说明HTTPS已经生效。若要查看证书具体有效期可以用echo | openssl s_client -servername example.com -connect example.com:443 2/dev/null | openssl x509 -noout -dates输出结果会显示notBefore生效时间和notAfter到期时间一眼就能看出证书何时过期。方法三用在线工具做全链路检测。比如使用SSL Labs的SSL Server Test输入域名就能得到A到T的评级同时会检查证书链是否完整、协议版本、加密套件强度、是否存在已知漏洞。我建议上线后至少测一次目标是拿到A级评分。4.2 高频报错SSL连接错误、证书验证失败类下面是实际运维中遇到最多的几类问题按照“现象-排查-解决”的方式整理成速查表现象可能原因解决思路浏览器提示“您的连接不是私密连接”证书链不完整、证书与域名不匹配、服务器时间不准检查证书是否绑定当前访问的域名用curl--verbose查看证书链校准服务器系统时间申请证书提示“验证失败file”80端口不通、站点目录不可写、验证文件无法访问放行安全组80端口确认站点根目录有写入权限浏览器直接访问验证路径看是否可访问提示“no required ssl certificate was sent”Nginx配置中误开客户端证书验证或反向代理指向了需要证书的上游服务检查ssl_verify_client配置是否误设反代场景检查上游证书配置提示“an error occurred during ssl communication”端口443被占用、证书文件格式错误、SSL协议不匹配检查Nginx日志error.log检查证书是否包含完整证书链确认443端口未被其他服务占用提示“ssl/tls协议信息泄露漏洞(cve-2016-2183)”漏洞扫描报风险服务器仍启用了TLS 1.0/1.1弱协议修改Nginx配置只保留TLS 1.2和1.3证书续期失败DNS验证TXT记录不存在、目录权限异常、续期脚本执行失败查看宝塔计划任务日志确认DNS验证是否通过检查站点目录权限手机上访问提示“证书错误”而电脑正常证书链不完整或本机缓存了旧证书清理浏览器缓存重新导入完整证书链检测到目标站点存在javascript框架库漏洞站点前端引用了带已知漏洞的JS框架版本升级前端框架到安全版本或移除无用JS库4.3 关闭不安全的TLS 1.0/1.1协议域名漏洞扫描报告里经常会出现CVE-2016-2183SSL/TLS协议信息泄露漏洞和“启用不安全的TLS1.0协议”这类风险。这其实不是证书本身的问题而是服务器Nginx层面仍然允许客户端用老旧的TLS 1.0/1.1版本进行握手。TLS 1.0和1.1是上世纪90年代末设计的协议算法强度不够早在2020年左右就被各大浏览器弃用。修复方法是修改Nginx的SSL配置。在宝塔面板“网站”-“设置”-“配置文件”里找到类似这样的段落ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;改成ssl_protocols TLSv1.2 TLSv1.3;保存后重载Nginx。改完之后再用漏洞扫描器扫一遍这个告警就会消失。注意如果站点的用户群体里有人还在用非常老的浏览器比如IE8以下禁用TLS 1.0/1.1会导致他们无法访问但现在的浏览器和系统环境里这个影响已经可以忽略不计。4.4 证书续期的自动化机制与手动检查方法Lets Encrypt证书有效期是90天这意味着每季度要续期一次。手动续期容易忘宝塔面板的处理方式是自动续期。这个自动续期依赖计划任务可以在宝塔的“计划任务”里看到一条类型为“Shell脚本”的任务内容大致是/usr/bin/python /www/server/panel/class/acme_v2.py --renew正常情况下宝塔会在证书到期前自动续期不需要人工干预。但为了万无一失建议每个月手动检查一次echo | openssl s_client -servername example.com -connect example.com:443 2/dev/null | openssl x509 -noout -dates如果到期日期接近30天内但自动续期仍然没触发可以检查计划任务执行日志常见原因是DNS解析异常或站点目录权限被改动。4.5 一个特殊场景反向代理与Nginx配置冲突如果你用宝塔的“反向代理”功能把一个站点反代到内网应用比如Tomcat或Node.js服务SSL证书是配置在最外层Nginx上的。这种情况经常会遇到“请求已被站点的安全策略拦截”或上游证书验证失败的问题。排查思路先确认内网应用的监听协议是HTTP还是HTTPS。如果内网应用本身就是HTTPS但你没有给上游地址做证书信任处理Nginx转发时会报证书验证失败需要关闭上游证书验证不推荐或者导入上游证书。检查反代配置里的proxy_ssl_server_name on;和proxy_ssl_name是否匹配上游域名。如果应用本身有自己的证书但在内网环境无法联网验证SSL握手也会出问题。最简单可靠的做法是内网应用监听HTTP由最外层Nginx统一终结HTTPS这样只有一层证书逻辑清晰排查也方便。“镜像站点”这类场景也经常踩同样的坑——比如你用一个站点镜像了另一个站点的内容反代配置和证书配置容易张冠李戴域名和证书不匹配的报错立刻出现。我处理过几次最后都统一改成“外层Nginx终结SSL内网HTTP源站”的架构再没有出过证书类问题。5. 多站点与后续扩展建议一个服务器上往往不止一个站点。宝塔面板可以给每个站点独立配置证书不同站点用不同证书互不干扰。也有一些场景需要全站统一证书比如所有子域共用一张泛域名证书此时只需在每个站点的SSL配置里选择同一张证书即可。扩展建议方面如果你把站点迁移到了CDN或负载均衡后面证书应该配置在边缘节点上源站可以使用自签名证书或者直接通过内网HTTP通信减少证书配置的复杂度和私钥泄露风险。如果使用CDN需要注意CDN的SSL证书和源站证书可以不同但回源方式要设置正确否则会出现边缘证书正常但源站握手失败的问题。我最后分享一个实际操作中的经验上线HTTPS后不要急着关闭HTTP端口至少保留一个月的HTTP访问日志观察。很多老用户的书签和外部链接仍然是HTTP形式强制跳转没问题但如果HTTP服务本身有异常用户会直接遇到连接失败。保留HTTP跳转能让你从访问日志里捕捉到那些被浏览器拦截或跳转失败的真实用户请求方便平滑过渡。另外证书私钥文件一定要想办法备份且严格控制访问权限私钥泄露等同于HTTPS形同虚设这个底线不能破。
返回列表