现如今互联网安全标准持续提升,HTTPS加密已经不再是大型网站的专属配置,普通个人站点、企业官网、小程序后端接口都必须完成HTTPS改造。没有开启HTTPS的网站,浏览器地址栏会标记不安全标识,不仅会影响访客信任度,同时还会对搜索收录、小程序对接、第三方API调用产生直接阻碍。很多运维新手在ECS服务器做HTTPS改造时,经常遇到证书签发失败、443端口无法访问、重定向循环、混合内容报错等一系列问题,看似简单的证书部署,实际落地过程中会踩大量隐形坑点。本文完整梳理从SSL证书申请、域名所有权验证、证书下载上传、Web服务配置、安全组端口放行、HTTP强制跳转HTTPS、全站混合内容修复、上线验证以及故障排查的整套实操流程,附带完整可直接运行的代码命令,帮助零基础用户完成ECS网站全站HTTPS加密改造工作。
在正式开始HTTPS改造之前,需要梳理前置条件,避免后续操作反复返工。首先需要准备已经完成解析的域名,域名解析记录已经指向ECS实例公网IP地址;其次ECS实例操作系统为CentOS、Ubuntu等主流Linux发行版本,Web服务已经正常运行,80端口HTTP访问网站可以正常打开;同时需要拥有服务器SSH登录权限,能够执行命令行操作;最后确认ECS安全组规则,后续需要开放443端口TCP协议入方向权限。如果网站前端接入负载均衡、CDN产品,证书部署逻辑会发生变化,证书需要配置在负载均衡或者CDN层面,后端ECS只需要处理HTTP流量即可,本文教程针对没有中间代理、ECS直接对外提供Web访问的业务场景。详情👉访问阿里云 数字证书管理服务(原SSL证书) 平台了解。
第一步是SSL证书申请与域名验证。数字证书管理服务控制台可以申请DV类型SSL证书,DV证书依靠域名所有权校验完成签发,适合绝大多数个人网站与中小企业官网。免费DV证书存在有效期限制,适合测试站点、个人博客;企业业务系统、电商站点建议选择OV或者EV等级付费证书,具备更高安全等级与可信度。进入证书管理页面,选择对应证书规格,填写需要加密的域名,包含主域名以及www子域名,CSR生成方式建议选择系统生成,平台托管私钥,后续下载证书文件直接使用,避免手动生成CSR出现私钥丢失问题。
提交证书申请之后,核心环节是域名所有权验证,只有验证通过证书才会签发。主流验证方式分为DNS验证和文件验证,DNS验证适用性更广,推荐优先选择。提交审核之后控制台会给出一条TXT类型解析记录,主机记录一般为_dnsauth,附带一串随机记录值。登录域名解析控制台,新增TXT解析记录,复制粘贴对应的主机记录与记录值,TTL保持默认数值。解析记录新增之后,DNS全球生效存在时间延迟,通常数分钟到半小时不等,完成解析之后回到证书控制台点击验证按钮,状态更新为已签发代表证书申请成功。如果域名解析不在同一平台,同样可以使用DNS验证;当无法修改域名解析记录时,可以选择文件验证,将指定验证文件上传至网站根目录,通过访问特定路径完成域名所有权校验,等待系统检测通过即可签发证书。详情👉访问阿里云 数字证书管理服务(原SSL证书) 平台了解。
证书签发完成之后,需要下载适配Web服务器类型的证书压缩包。点击下载按钮,根据自身Web服务选择对应的版本,Nginx、Apache、Tomcat所需要的证书文件格式各不相同,选错格式会导致后续部署报错。解压下载压缩包,Nginx版本压缩包内包含两个核心文件,.pem后缀证书文件,完整证书链文件,.key后缀私钥文件,私钥文件属于敏感资源,禁止对外泄露,做好本地备份保存工作。
接下来将证书文件上传至ECS服务器,通过SSH连接登录ECS实例,创建专门存放证书的目录,不建议直接放在网站业务目录下,防止误删除。执行下面命令创建证书存放文件夹:
mkdir -p /etc/nginx/cert
使用SCP工具、WinSCP等工具,将本地解压后的pem证书文件与key私钥文件上传到/etc/nginx/cert目录。上传结束之后修改文件权限,缩小文件访问权限范围,提升服务器安全等级,防止普通用户读取私钥文件:
chmod 600 /etc/nginx/cert/*.pem
chmod 600 /etc/nginx/cert/*.key
执行ls命令确认两个文件完整存在,没有出现文件损坏、缺失情况:
ls -l /etc/nginx/cert/
证书文件准备完毕,必须确认ECS安全组已经放行443端口TCP入方向访问权限,这是新手高频踩坑点。即使Web服务配置全部正确,安全组没有开放443端口,外部网络依旧无法访问HTTPS服务。进入ECS实例安全组配置页面,添加入方向规则,协议TCP,端口443,授权对象按需配置,公网全量访问填写0.0.0.0/0。同时服务器内部防火墙也需要放行端口,CentOS系统firewalld防火墙放行命令:
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
Ubuntu系统ufw防火墙放行端口:
ufw allow 443/tcp
ufw reload
端口连通性可以执行命令测试443端口监听状态:
ss -tlnp | grep 443
完成端口准备之后,修改Nginx配置文件,实现443端口SSL监听。找到站点对应的conf配置文件,一般存放路径/etc/nginx/conf.d/,编辑站点配置文件:
vim /etc/nginx/conf.d/site.conf
写入完整HTTPS服务配置,配置中包含证书路径、TLS协议版本、加密套件、网站根目录等参数,禁用老旧不安全TLS1.0、TLS1.1协议,只保留TLSv1.2、TLSv1.3,兼顾安全性与设备兼容性,同时开启HTTP2提升访问性能。
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/cert/fullchain.pem;
ssl_certificate_key /etc/nginx/cert/privkey.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
}
配置完成之后,需要配置80端口HTTP全部301永久重定向跳转至HTTPS,实现全站加密,所有访问HTTP的请求自动切换加密协议。新增独立server块专门处理80端口请求,不要在443服务块内做跳转,避免循环重定向问题。
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
修改完配置文件,千万不要直接重启Nginx,优先执行配置语法校验命令,如果配置存在语法错误,直接重启会造成网站服务直接中断不可访问。校验命令:
nginx -t
输出syntax is ok、test is successful代表配置语法没有问题,重载Nginx配置使新配置生效,重载不会中断现有业务连接:
systemctl reload nginx
如果业务使用Apache Web服务,部署逻辑大体相似,创建证书存放目录,上传证书文件,编辑ssl虚拟主机配置文件。
mkdir -p /etc/apache2/ssl
Apache 443虚拟主机配置示例:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot "/var/www/html"
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/fullchain.pem
SSLCertificateKeyFile /etc/apache2/ssl/privkey.key
SSLProtocol -all +TLSv1.2 +TLSv1.3
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
配置完成校验Apache配置,重载服务:
apache2ctl configtest
systemctl reload apache2
配置重载完成之后,进入全站验证环节,不能仅仅依靠浏览器访问,需要多维度检测HTTPS是否真正生效。首先使用curl命令在服务器本地测试跳转逻辑,查看返回状态码,确认HTTP访问返回301跳转:
curl -v -L http://example.com
使用openssl命令测试SSL握手情况,排查证书链、TLS握手异常:
openssl s_client -connect example.com:443
在本地电脑浏览器清除缓存,访问https://域名,观察地址栏锁图标是否正常显示,没有不安全警告。这里需要重点处理混合内容问题,这是HTTPS改造中非常普遍的故障,网站虽然开启HTTPS,但是页面内部图片、CSS、JS、字体等静态资源依旧写死HTTP地址,浏览器出于安全策略拦截资源,页面样式错乱,图片无法加载。按下F12打开开发者工具,切换到控制台面板,会打印混合内容警告,定位所有HTTP协议资源链接,修改模板、程序配置,将HTTP链接替换为HTTPS协议或者使用相对路径,消除混合内容告警。
完成基础访问验证之后,还要梳理证书续期机制,免费DV证书有效期时间短,到期之后证书失效,网站会直接报证书不安全。免费证书到期前需要重新申请证书,下载新证书文件,上传覆盖服务器旧证书,再重载Web服务配置。如果业务使用付费证书,也要设置到期提醒,提前完成续费更新,避免业务中断。
接下来梳理HTTPS改造高频故障与排错方案,大部分报错都可以通过下面步骤定位解决。
故障一:浏览器提示连接不安全,证书不受信任。首先确认证书绑定域名和访问域名完全一致,证书状态是已签发,没有过期;其次确认Nginx配置里面ssl_certificate使用完整证书链pem文件,不是只上传域名证书,缺少中间证书会导致信任链断裂;清除浏览器缓存重新测试,部分浏览器会缓存旧证书信息。
故障二:ERR_TOO_MANY_REDIRECTS重定向循环。该报错代表请求在HTTP和HTTPS之间来回跳转。排查Nginx配置,确认443端口server块内部没有写return跳转http规则;检查是否存在多个配置文件同时配置重定向,多条跳转规则叠加造成循环;如果网站部署反向代理,需要配置X‑Forwarded‑Proto头部,后端程序识别原始访问协议,避免程序内部再次跳转。
故障三:HTTPS完全无法访问,访问超时拒绝连接。第一步检查安全组443端口是否放行,服务器本地防火墙是否开放端口;执行ss命令确认Nginx正常监听443端口;检查Nginx配置listen指令是否携带ssl参数,漏写ssl参数,443端口会以普通HTTP协议监听,访问HTTPS直接握手失败。
故障四:Nginx reload失败,启动报错SSL_CTX_use_PrivateKey错误。该报错代表证书pem文件和key私钥文件不匹配,检查下载证书版本是否选对Web服务器类型,上传的文件是否混淆,重新下载证书包解压上传,核对文件路径配置无误。
完成HTTPS改造上线之后,还有一些进阶优化建议。可以配置HSTS响应头,强制浏览器后续访问直接使用HTTPS协议,减少HTTP跳转的开销,在Nginx的443的server块内部增加头部配置:
add_header Strict‑Transport‑Security "max‑age=31536000; includeSubDomains" always;
HSTS配置上线前务必充分测试,一旦浏览器缓存HSTS策略,短时间内无法回退HTTP访问,确认业务稳定之后再启用。同时可以使用专业SSL检测工具,对站点做安全扫描,检查TLS配置、证书链完整性,拿到安全评级,持续优化加密安全等级。
很多用户在做HTTP迁移HTTPS时忽略业务侧适配,网站程序、后台管理系统、接口服务都需要适配HTTPS环境。数据库、缓存配置里面写死的网站域名地址,需要全部更新为HTTPS;API接口、小程序回调地址、第三方回调域名全部替换为HTTPS链接;同时做好URL变更记录,对于原有HTTP页面做好301永久跳转,减少对搜索收录的负面影响。正式上线之前强烈建议先在测试环境完整复现整套HTTPS部署流程,修复混合内容、接口异常等各类问题,确认全部业务功能正常,再同步到生产环境,规避直接修改线上业务带来的业务风险。
整体来看ECS全站HTTPS改造,技术本身并不复杂,但整套流程涉及证书申请、域名验证、云服务器网络安全组、Web服务配置、程序资源适配、证书续期多个环节,任何一个小细节疏漏就会引发访问故障。完整走完证书申请、下载上传、端口放行、Web服务SSL配置、301强制跳转、混合内容修复、多维度验证这一套完整流程,才能真正实现全站HTTPS加密,充分发挥SSL证书的安全防护能力,保障网站数据传输安全,同时满足浏览器标准、第三方业务对接的硬性要求。运维人员日常维护中,需要建立证书到期监控提醒机制,定期检查证书有效期,提前完成证书更新,避免证书过期造成业务访问故障。