宝塔面板添加站点与SSL免费证书申请部署全攻略

宝塔面板添加站点与SSL免费证书申请部署全攻略 先说一个我最近实际遇到的情况。朋友网站上线第三周用户陆续反馈浏览器弹安全警告截图一看地址栏前面挂了个大大的不安全。排查到最后问题出在SSL证书上——他当时在面板里顺手点了个申请证书以为等一会儿就能好结果证书状态一直卡在待验证压根没签发下来。这件事的根子其实不在证书环节而是在添加站点那一步就没把域名、目录、环境之间的关系理顺。今天这篇文章就围绕宝塔面板添加站点 运营商SSL免费证书申请使用这条完整链路把所有关键步骤和容易踩的坑一次讲清。覆盖从服务器环境选型、域名解析、站点添加到免费证书的申请、下载部署再到上线后最常见的SSL故障排查。无论是第一次碰宝塔面板的新手还是被证书链折磨过的老站长都能在这里找到对应的答案。1. 添加站点前先把这三件事搞清楚1.1 宝塔面板免费版够不够用付费版多出来的是什么很多人装完宝塔面板第一件事是研究付费版。先说结论对绝大多数个人站点和小型项目来说免费版完全够用。网站管理、数据库管理、FTP、SSL证书部署、计划任务、系统防火墙、反向代理、文件管理这些日常高频功能全部都在免费版里没有任何暗坑。专业版多出来的主要是运维增强类功能比如付费插件如Nginx免费防火墙的部分高级规则、更细粒度的系统监控告警、网站监控报表等。如果你不是要应付复杂的生产环境和等保要求付费版的核心价值并没有那么高。面板本身的安装流程很简单支持CentOS、Ubuntu、Debian等主流系统。我自己的习惯是CentOS 7.9或Ubuntu 22.04 LTS二选一两者都稳定。安装命令就一段脚本官方文档里有完成之后会给你一个面板地址、用户名和密码。这里有一个特别容易被忽略的点安装完成后第一件事不是急着建站而是把面板默认端口改掉。默认的8888端口是扫描器重点关注的对象改成高位端口比如28888、38888这一类的随机值能挡掉大量无效访问。面板的登录加密入口和BasicAuth认证也可以顺手开一下这些都在面板设置里花一分钟做掉后面能省心很多。1.2 域名解析先让域名能找得到服务器再谈添加站点很多人添加好站点之后发现打不开从宝塔面板到Nginx配置检查了一圈都没问题结果一查域名解析压根没做或者解析记录类型选错了。这是一个很基础但特别常见的坑。DNS解析这一步应该在添加站点之前完成。操作位置在域名注册商的控制台阿里云、腾讯云、Cloudflare等都行添加一条A记录主机记录填 代表主域名和 www代表www子域名记录值填你服务器的公网IP地址。TTL可以保持默认或者设短一点比如600秒方便调试时快速生效。解析配置完成之后不要着急进入下一步先等解析生效。在国内的主流云服务商控制台里通常能看到解析生效状态但更靠谱的办法是本地用命令行验证。Windows下用nslookup yourdomain.commacOS/Linux下用dig yourdomain.com short返回的IP和服务器公网IP一致就说明解析已经通了。这一步没有做好后面申请SSL证书时的域名验证环节百分百会出问题因为证书签发机构要验证你对域名的控制权验证方式就是检查域名解析记录是否存在。1.3 站点目录和数据库命名规划影响的是你后续一年的维护体验添加站点之前把目录和数据库命名想清楚这件事很多人不当回事但维护阶段会直接影响你的体验。宝塔添加站点时默认会创建一个/www/wwwroot/你的域名这样的目录结构这个设计本身是合理的——一个站点对应一个根目录域名和路径一一对应HTTP请求通过域名进来之后Nginx能准确地把流量导向正确的目录。数据库方面宝塔支持在添加站点的表单里同步创建MySQL数据库。数据库名、用户名不建议用admin、root这类过于常见的名字也不要跟站点目录名完全一样否则一旦数据库信息泄露攻击者连猜的成本都被省了。数据库密码务必用强密码宝塔自带的随机密码生成按钮就很好用。还有一点数据库的访问权限默认只允许localhost这个必须保持不要改成允许外部访问除非你有非常明确的远程连接需求。一旦开放外网MySQL的3306端口被扫到之后弱口令爆破就是时间问题。2. 宝塔面板添加站点的核心配置每一步都有讲究2.1 新建网站表单字段多但关键节点就那几个进入宝塔面板左侧菜单网站点击添加站点会看到一个表单。域名栏填写你的主域名和www子域名两者都要填使用空格或换行分隔。这里有个小技巧如果你的站点未来可能使用多个域名访问同一套程序比如同时保留了.com和.cn在添加站点的时候就一并填进去而不是等建站完成后再修改配置文件的server_name那样容易漏改导致其中某个域名访问不了。根目录默认自动生成一般不用手动改。FTP账户不推荐创建现在主流的文件管理方式要么是宝塔自带的文件管理器要么是SFTPFTP协议本身是明文传输密码和文件内容在网络中可被截获安全性不如SFTP。数据库选择MySQLPHP版本根据你的程序需求来定。如果是WordPressPHP 7.4到8.2都行如果是老程序或者ThinkPHP这类框架建议先查一下兼容性表再做选择。PHP版本选高了程序报错选低了性能跟不上这个后面想改倒是方便网站设置里随时能切换。表单提交之后宝塔会自动完成以下动作创建站点根目录、生成Nginx配置文件、创建数据库和数据库用户、在/etc/hosts或面板自身的数据存储中登记站点信息。等一两秒钟站点列表里就能看到你的域名了。这里我强烈建议做一件事创建完站点后先不要急着访问域名先打开根目录看看里面有没有宝塔自动生成的默认首页index.html。这个默认页面在浏览器里访问时会显示一个宝塔的默认页面。如果你把程序文件上传到根目录后没有删除或覆盖这个默认首页访问你的域名时可能还会看到它容易被误认为站点搭建失败。2.2 伪静态设置程序对URL重写的需求在这里一次配好站点创建完成之后进入设置面板切换到伪静态标签。这一步是很多新手完全摸不着头脑的地方但它的作用非常直接——如果程序依赖URL重写比如ThinkPHP的pathinfo模式、WordPress的固定链接、Laravel的路由而你不在Nginx层面配置伪静态规则程序首页能打开但点进任何内页都是404。宝塔的伪静态设置里内置了常用程序的重写规则模板WordPress、ThinkPHP、Laravel、Discuz这些都有现成的下拉选项。选择对应的程序点击保存Nginx会自动加载重写规则。如果没有你的程序对应的模板就选择rewrite然后手动粘贴规则规则来源一般是程序官方文档的Nginx伪静态配置。这里要注意一个细节修改伪静态配置之后不需要重启Nginx宝塔会自动平滑加载配置文件但如果你是手动修改的/www/server/panel/vhost/rewrite/域名.conf然后去Nginx管理里点重载就要小心配置语法错误。我遇到过有人手写伪静态规则时漏了一个分号导致整个站点502的情况。改配置文件之前先备份一份改完用nginx -t检查语法再执行重载这是运维的基本素养。2.3 验证站点是否正常不要急于部署证书访问http://你的域名如果能看到默认首页或者你上传的程序安装界面说明站点添加成功Nginx已经正确接收请求并将流量路由到了站点根目录。这一步是最基础的功能验证一定要在部署SSL证书之前完成。如果这一步都打不开后面配证书再顺利你访问https://你的域名依然会失败而且排查问题时会混杂着http和https两个层面的变量增加定位难度。验证通过后把程序文件上传到根目录开始程序的安装向导。我一般倾向于在http状态下就把程序安装配置完等网站功能正常了再切换到HTTPS。理由很简单如果程序在安装阶段就开启了HTTPS而证书配置出现问题安装向导都进不去排查起来会非常被动。程序跑起来之后再部署SSL如果出现问题至少能确定问题出在SSL环节而不是程序环节。3. 运营商SSL免费证书为什么推荐、怎么申请、选哪个3.1 为什么不用自签名证书而用运营商签发的免费证书SSL证书的作用本质上是解决两件事一是身份验证证明你是这个域名的合法所有者二是数据加密保证浏览器和服务器之间传输的内容不被窃取或篡改。自签名证书技术上也能实现加密但浏览器不信任它用户访问时会看到红色警告页这对任何一个正规站点来说都是劝退级别的体验。所以生产环境必须使用受信任的CA证书颁发机构签发的证书。付费证书比如DigiCert、GlobalSign这些品牌确实有但对个人站点来说运营商云平台提供的免费DV证书完全够用。原因后面细说。3.2 阿里云免费SSL证书申请全流程从控制台到DNS验证以阿里云为例申请流程大致如下登录阿里云控制台搜索数字证书管理服务也叫SSL证书。在证书管理页面选择免费证书点击创建证书。按提示填写证书申请信息绑定你的域名就是前面解析好的那个主域名。提交后进入验证流程免费证书通常是DV证书需要验证域名所有权。这里的关键在于第四步的验证方式。阿里云默认提供两种验证方式DNS验证和文件验证。DNS验证是让你在域名解析控制台添加一条TXT解析记录记录的名称和值在证书申请页面里会明确给出文件验证则是要求你在站点根目录下放一个指定内容的文件然后CA的验证服务器会通过HTTP访问这个文件来确认你对域名的控制权。推荐使用DNS验证。理由是你只需要在域名解析控制台添加一条记录等它生效然后点验证按钮CA那边检到TXT记录存在且值匹配就完成验证了。文件验证方式则要求你的80端口可访问且服务器能正常响应HTTP请求这确实是常见情况但多一个依赖条件就多一个故障点。验证通过后阿里云会在几分钟到几小时内签发证书免费证书一般很快等一小会儿刷新状态就行。然后在证书列表中点击下载会看到不同服务器的配置包Nginx、Apache、IIS、Tomcat、Other。我们用Nginx所以下载Nginx格式的证书zip包解压后里面包含两个文件.pem证书文件和.key私钥文件。虽然后缀是pem但宝塔部署时可以直接用。3.3 腾讯云免费证书与多运营商选择的补充说明腾讯云也有类似的免费证书申请入口位置在SSL证书控制台流程逻辑和阿里云基本相同创建免费证书、填写域名、提交验证、等待签发。区别主要在控制台界面和一些细节参数的命名上但思路是一致的。如果你的域名和服务器在腾讯云直接在腾讯云申请证书签发后下载Nginx格式部署即可。这里额外提醒一句国内主流云服务商的免费DV证书目前基本都是单域名证书也就是说一张证书只能绑定一个域名。如果你的站点同时存在example.com和www.example.com两个域名宝塔面板支持在一个SSL证书配置里填入多份证书文件但对应关系要理清。更省事的做法是申请两张免费证书一张绑定主域名一张绑定www子域名然后在宝塔的SSL设置中分别填写。或者干脆选一个主域名作为站点默认域名把另一个域名做301跳转这种方法对SEO更友好也简化了证书管理。3.4 DV、OV、EV证书的简单区分以及为什么个人站选DV就够证书按验证强度分为DV、OV和EV三个等级类型验证内容浏览器地址栏展示适用场景DV验证域名所有权小锁标记不显示企业名称个人网站、博客、测试环境OV验证组织真实存在小锁标记点击可查看企业信息企业官网、商业站点EV最严格的组织与法律验证地址栏显示企业名称部分浏览器金融机构、大型企业对个人站点和绝大多数中小网站来说DV证书在加密强度上和OV/EV没有本质区别HTTPS的加密算法与证书验证等级的关联性不大。DV唯一的劣势是浏览器不会显示你的企业名称但这不影响正常访问。所以不要因为免费证书是DV级别就觉得不够好它至少解决了两大核心问题加密传输和信任链。免费证书的真正问题只有一个——有效期短。国内运营商免费证书的有效期通常是3个月到1年不等这就牵扯到证书到期后的续期问题后面第五部分会专门讲。4. 证书下载、格式转换与宝塔部署的完整细节4.1 证书文件的构成pem、crt、key到底谁是谁从运营商下载的Nginx格式证书包解压后通常会看到两个文件一个.pem或.crt后缀的证书文件一个.key后缀的私钥文件。这两个名字经常把新手搞晕我尽量用最直白的方式说清楚。证书文件.pem或.crt里面存放的是你域名的公钥持有证明它的本质是一段Base64编码的文本开头是-----BEGIN CERTIFICATE-----结尾是-----END CERTIFICATE-----。私钥文件.key里存放的是你的私钥开头是-----BEGIN RSA PRIVATE KEY-----或-----BEGIN PRIVATE KEY-----。这两个文件必须配对使用Nginx在建立HTTPS连接时会把证书文件发回给浏览器浏览器用CA的公钥验证证书的真伪然后双方用私钥和公钥配对完成密钥协商后续的数据用对称密钥加密传输也就是我们常说的HTTPS加密。特别强调一句私钥文件一定要严格保密不要传到公开仓库不要截图发到群里不要打包发给同事。一旦私钥泄露相当于你的HTTPS加密被完全破解攻击者可以伪造你的站点与用户建立可信连接后果非常严重。宝塔面板的SSL设置页面上传私钥时会提示你不要泄露这是极其重要的安全提醒。4.2 部署到宝塔的两种方式粘贴和上传登录宝塔面板进入网站菜单点击对应站点的设置切换到SSL标签。你会看到几个选项Lets Encrypt、手动配置、其他证书等。手动配置证书时页面上有两个大文本框一个填证书文件pem/crt内容一个填私钥文件key内容。你可以直接用文本编辑器打开下载的证书文件全选复制粘贴到对应文本框也可以点击文本框下方的上传小图标将本地文件直接上传。粘贴方式更可控因为你可以顺便检查一下文件内容开头结尾的字符串是否正确。上传方式更省事但上传后最好也点开检查一下确认没有多出多余空行。粘贴完成后点击保存按钮。宝塔会提示部署成功。此时访问https://你的域名浏览器地址栏应该出现小锁标记。如果强制HTTPS开关还没打开你访问http地址依然会走http协议所以保存证书之后不要忘记做后面的步骤。4.3 强制HTTPS把用户统一导向加密通道证书部署成功只是第一步真正让用户全部走HTTPS的是强制HTTPS功能。在SSL设置页面打开强制HTTPS开关宝塔会自动在Nginx配置中添加301跳转规则当用户使用http协议访问时服务器会返回301状态码浏览器自动跳转到https地址。这样一来用户不管输入什么形式的URL最终都会落在加密连接上http明文流量被彻底切断。开启强制HTTPS之后有两件事需要验证。第一访问http://你的域名是否会301跳转到https://你的域名用浏览器的开发者工具切换到Network标签看第一条请求的状态码是不是301。第二全站所有页面是否都能正常加载如果页面中有任何资源仍然通过http协议加载浏览器控制台会出现Mixed Content混合内容警告这就是第五部分要说的常见坑。4.4 宝塔自带的Lets Encrypt免费证书另一个值得考虑的选项除了运营商免费证书宝塔面板本身还内置了Lets Encrypt证书的一键申请功能。在SSL设置界面选择Lets Encrypt勾选你要申请的域名点击申请宝塔会自动完成域名验证和证书签发。Lets Encrypt免费证书最大的优势是有效期90天且宝塔可以结合计划任务实现自动续期。比如写一个Shell脚本任务每个月执行一次certbot renew证书到期前自动续期运维成本非常低。不过Lets Encrypt证书在某些国内网络环境下偶尔会出现验证超时的情况这和Lets Encrypt的验证服务器到你的服务器的网络路径有关。如果申请失败多试几次或者换运营商证书都是可行的方案。5. 部署SSL之后最常见的坑以及完整的排查链路5.1 浏览器提示SSL连接错误但配置看着没问题先讲一个高频问题证书部署完成后浏览器访问 https 域名报SSL连接错误或此网站无法提供安全连接但回到宝塔面板看SSL设置证书状态明明显示已部署。这种矛盾的场景通常有以下几个原因按顺序排查就能定位。第一步先检查服务器443端口是否对外开放。在宝塔面板的安全页面里找到443端口放行规则如果没有就添加一条。云服务商的安全组也要检查阿里云和腾讯云的服务器都有双重防火墙系统内部防火墙和云安全组宝塔面板放行443并不代表云安全组也放行了。很多新手在这里卡了很久。第二步检查证书和私钥是否匹配。打开证书文件和私钥文件的文本内容分别看头尾标记。如果证书和私钥不匹配比如把A站点的证书配到了B站点的站点配置里Nginx会报错甚至可能导致Nginx直接拒绝启动。验证匹配关系可以用openssl x509 -noout -modulus -in 证书文件和openssl rsa -noout -modulus -in 私钥文件两个命令输出的modulus值一致才说明证书和私钥是配对的。第三步确认浏览器访问的是正确的域名。如果证书是example.com的但你用www.example.com去访问浏览器会因为证书域名不匹配而报安全问题。这个问题在申请证书时最容易埋下隐患所以前面才反复提醒主域名和www子域名要同时申请证书或者在站点配置中处理好跳转关系。5.2 证书链不完整为什么有的浏览器正常有的浏览器报错第二个非常经典的坑是证书链不完整。你用自己的Chrome浏览器访问站点一切正常但同事的Firefox或部分手机浏览器访问时依旧提示证书不受信任。这种不同浏览器表现不一致的现象绝大多数和证书链缺失有关。浏览器验证证书时需要走完一条完整的信任链站点证书 → 中间证书 → 根证书。根证书内置在操作系统中浏览器天然信任但中间证书和站点证书需要由服务器在TLS握手时提供给浏览器。如果服务器只发送了站点证书而没有发送中间证书也就是证书链不完整部分浏览器能靠自己的证书库自动补全部分浏览器则直接判定为不可信。宝塔部署证书时如果证书文件里只粘贴了站点证书那一小段内容就有可能出现这个问题。解决办法是下载证书时选择Nginx格式如果运营商提供的是包含certificate和ca_bundle两个文件的压缩包把两个文件的内容合并粘贴到证书输入框站点证书在上一行中间证书在下一行或者宝塔页面中有单独的证书链输入框就填在对应位置。合并后的证书文件格式大致是-----BEGIN CERTIFICATE-----站点证书-----END CERTIFICATE----------BEGIN CERTIFICATE-----中间证书-----END CERTIFICATE-----。我在实际部署中有一个习惯部署完证书后用在线SSL检测工具比如mySSL检查一下证书链的完整性。如果检测结果提示证书链不完整按上面的方式合并中间证书后再重新部署一次就能解决问题。5.3 强制HTTPS打开后页面显示错乱多半是混合内容强制HTTPS开启后页面内容可能突然出现样式错乱、图片加载不出来、功能按钮异常。这通常是混合内容Mixed Content导致的页面本身通过HTTPS访问但页面内部引用的JS、CSS、图片等资源仍然使用http协议为了保护用户安全浏览器会主动拦截这些明文加载的资源。排查方法很简单打开浏览器开发者工具切到Console或Network标签页被拦截的资源会在控制台输出类似Mixed Content: The page at https://... was loaded over HTTPS, but requested an insecure resource http://...。 This request has been blocked的报错信息直接指向具体是哪个文件通过http加载了。解决方案就是把这些资源引用全部改为相对路径去掉前面的http://或https://或者改写成HTTPS绝对路径。常见的场景有程序配置文件里写死了站点URL为http地址或者数据库里的文章内容保存了带http前缀的图片链接。如果是WordPress直接在后台设置里把WordPress地址和站点地址改成https开头的URL如果是第三方程序查找配置文件中的URL常量并修改。还有一个更省事的办法在Nginx配置中添加一条规则将所有http资源请求301到https但这个方法无法在页面代码层解决资源引用问题只能作为权宜之计。5.4 安全扫描提示TL协议或配置问题要不要处理部署HTTPS之后很多人会做一轮安全扫描或者被扫描服务检测常见报告里有两条很显眼一条是检测到目标站点存在JavaScript框架库漏洞另一条是SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】。先说第一条。这个漏洞提示通常指向站点加载了旧版本的jQuery、Vue等前端框架与HTTPS本身无关是程序依赖的第三方前端库版本过低。处理方法有两个方向一是升级前端依赖到安全版本对于使用CDN加载的程序直接修改加载链接即可二是如果这是老旧程序且不便升级可以通过隐藏版本号、增加WAF规则等方式降低实际风险但最彻底的办法还是升级依赖尤其是面向用户的站点不能抱着侥幸心理。再说第二条。CVE-2016-2183是SWEET32攻击本质上是浏览器或服务器在加密过程中允许使用3DES这类弱加密套件。扫描工具检测到服务器配置了不安全的TLS协议版本尤其是TLS1.0和1.1后会报这个漏洞。处理方法是在Nginx的SSL配置中禁用弱协议和弱加密套件。宝塔面板的SSL设置页面上通常有SSL协议选项把TLS1.0和TLS1.1全部禁用只保留TLS1.2和TLS1.3。配置完成后浏览器访问依然正常扫描报告的这条漏洞也会变为已修复状态。这个改动不会影响绝大多数现代浏览器的访问因为所有主流浏览器早已全面支持TLS1.2及以上版本。5.5 证书过期为什么说免费证书最大的敌人是时间国内运营商免费证书的有效期目前是1年Lets Encrypt的有效期是90天。证书过期后浏览器会直接报连接不安全或NET::ERR_CERT_DATE_INVALID这不是一个可以拖延到周末再处理的告警而是用户每访问一次就崩溃一次的紧急故障。关于证书到期时间可以在浏览器地址栏点击小锁标记查看具体的有效期范围也可以在服务器上使用命令行查看echo | openssl s_client -servername 你的域名 -connect 你的域名:443 2/dev/null | openssl x509 -noout -dates这个命令会直接输出证书的生效时间和到期时间比在浏览器里点来点去要高效。续期这件事如果是运营商免费证书需要回到运营商控制台重新申请一张新证书再回到宝塔面板替换旧证书。整个流程3分钟左右能完成但要留意到期日别漏。有计划任务经验的可以配置自动提醒宝塔的计划任务里可以设定每月执行一次脚本检查证书剩余天数当剩余天数少于30天时通过邮件或第三方通知服务如Server酱发送告警。这里我个人的习惯是直接用Lets Encrypt的自动续期方案申请一次后配合宝塔计划任务自动renew再也不用天天惦记证书到期时间。5.6 部署完成后最后做一次自检别等用户来反馈每次部署完SSL证书建议按下面这个顺序做一轮完整自检总共花不到两分钟但能避免绝大多数上线后的问题访问https://你的域名确认地址栏出现小锁标记没有安全警告。强制刷新一次页面CtrlShiftR确认所有图片、样式、脚本正常加载。用手机流量访问一次站点排除本地网络缓存导致的假象。打开在线SSL检测工具确认证书链完整、协议版本合理、没有明显告警。清理一次浏览器缓存再用无痕模式访问这是最接近真实用户首次访问状态的测试方式。我在实际操作中发现无痕模式访问是最可靠的功能验证方式。因为普通模式下浏览器会压缩证书验证结果有时候你改了证书浏览器还在用缓存的旧证书状态导致你产生修改没生效的错觉。而每次无痕模式都会重新走完整的TLS握手流程结果最真实。另外还有一个容易被忽略的细节如果服务器上绑定多个站点每个站点的SSL证书配置是独立的。不要以为给A站点配好了证书B站点的HTTPS就能自动生效每个站点都需要单独申请和部署证书。宝塔面板支持通配符证书的部署一张证书覆盖*.example.com和example.com但免费通配符证书现在运营商基本不提供了要么用付费方案要么就踏踏实实一张张管理单域名证书。回到文章开头朋友那个问题后来诊断为证书申请后没有及时完成DNS验证导致运营商一直没签发整个HTTPS形同虚设。这个案例其实很典型——不是证书生成难也不是部署难而是很多人根本没有把申请SSL证书当作一个独立的、需要主动推进到已签发状态的任务来看而是以为提交了就自动完成了。SSL这块流程每一步都是显式可见的只要你把添加站点、域名验证、证书部署、强制HTTPS、到期续期这五个环节理顺HTTPS没有想象中那么复杂。