
搞服务器的朋友应该都遇到过这个场景域名解析好了、服务跑起来了浏览器地址栏却一直提示“不安全”或者开发环境里明明配置了 HTTPS前端调用接口时却因为证书校验失败被拦在门外。这时候配置一张测试证书就是最快、最省事的解法。这篇文章就围绕“阿里云服务器配置测试证书”这件事展开我用自己实际操作的流程来梳理测试证书和正式证书该怎么选、免费证书怎么申请、自签名证书怎么生成、Nginx/Apache/Tomcat 这类常见 Web 服务器上怎么部署以及配置过程中最容易踩的坑。内容适合刚开始接触服务器 HTTPS 配置的新手也适合需要快速搭建内部测试环境、联调环境的开发者参考。1. 内容整体设计与思路拆解1.1 先搞清楚“测试证书”到底指什么很多人一上来就搜“测试证书”其实这个词在实际场景里对应着两种完全不同的东西搞混了后面会走很多弯路。第一种是阿里云数字证书管理服务原 SSL 证书服务里提供的免费测试证书。这种证书由正规 CA证书颁发机构签发浏览器完全信任域名验证通过后就能下载部署主要用来给正式上线前的业务做 HTTPS 适配。它的限制是有效期短目前免费版一般是 3 个月通配符泛域名支持有限适合测试环境和短期使用。第二种是自己用 OpenSSL 生成的自签名证书。这种证书没有经过 CA 签发浏览器默认不信任访问时会弹“您的连接不是私密连接”之类的警告。它的好处是完全免费、免审核、想生成几张就生成几张适合内网联调、开发环境、微服务之间互相调用的场景。在阿里云服务器上配置测试证书通常指的是第一种但自签名证书在开发调试中的地位也不可替代所以这篇博文把两条路都讲清楚。1.2 为什么会在阿里云服务器上配置测试证书阿里云 ECS 是目前个人开发者和中小企业使用率很高的云服务器平台很多人的第一台服务器就是在阿里云上开的。有了服务器之后接下来不可避免要面对 HTTPS 的问题买了域名并完成备案后想尽早把网站的 HTTPS 跑通验证业务有没有兼容性问题但正式证书还在走审核流程。小程序、App 开发时后端接口要求必须是 HTTPS测试环境需要一张能通过校验的证书。团队内部搭建的 GitLab、Jenkins、Nacos、MinIO 等服务不想花钱买正式证书但又不想每次访问都看到吓人的安全警告。上线前需要压测 HTTPS 性能、验证证书链是否完整、检测混合内容等需要一张方便申请和更换的证书。在这些场景里阿里云服务器只是承载证书的“底座”真正核心的是证书的申请、安装、配置和调试这一整套流程。1.3 推荐的技术路线选型我自己的习惯是分场景选型有域名且域名已备案/已解析优先用阿里云免费证书。因为浏览器信任、部署简单、不弹警告测试阶段和正式上线初期都够用。无域名或纯内网环境用 OpenSSL 自签名证书。把证书签发到本地 CA然后在内网机器或团队成员设备上安装信任根证书就能实现全内网 HTTPS 访问不需要任何费用。想在测试证书上附加更多功能比如多域名SAN 证书、更长的有效期、OCSP 装订支持等就升级购买付费证书但这类需求在“测试”阶段很少见。一条比较顺滑的路径是先用自签名证书在服务器上把 HTTPS 环境调通再申请免费证书做替换最后根据业务需要决定是否升级正式证书。下面我按这条路径来拆。2. 准备工作与证书方案对比2.1 服务器的必要预检项不管走哪条方案第一步都是确认服务器本身的状态。我一般会做四件事确认操作系统和 Web 服务器版本。比如cat /etc/os-release查看系统版本nginx -v或httpd -v确认 Web 服务器版本。不同版本对证书格式、配置指令的兼容性有差异。确认 80 和 443 端口可以正常监听。可以用ss -lntp | grep -E 80|443查看新开的 ECS 实例默认安全组只放行了部分端口443 经常忘记放行。确认域名解析记录已经指向服务器公网 IP。测试 HTTPS 时用域名访问才有意义直接用 IP 访问无法匹配证书里的域名信息。提前规划证书存放目录。建议统一放在/etc/ssl/或者/usr/local/ssl/下按域名建子目录方便后续续期和更换。注意阿里云 ECS 安全组里 443 端口默认是关闭的需要到控制台的安全组规则里手动添加入方向规则放行 TCP 443 端口。很多人配置了半天证书结果外部还是访问不了就是卡在这里。2.2 免费证书与付费证书、自签名证书的取舍遇到好多朋友上来就问要不要买付费证书我的建议是测试阶段完全不用。把三类的差别放一张表里看就很直观了。证书类型签发方浏览器信任有效期适用场景成本阿里云免费证书正规 CA如 DigiCert、GlobalSign 等完全信任3 个月测试环境、短期业务免费阿里云付费证书正规 CA完全信任1 年或更长生产环境、对安全等级要求高的业务按型号收费自签名证书自己本机/内网 CA不信任需手动安装根证书自定通常 365 天开发调试、内网服务、学习实验免费选择的核心逻辑是“信任关系”。免费证书和付费证书都由 CA 背书客户端可以自动验证自签名证书得靠客户端手动信任一旦设备多了管理成本就上来了。2.3 需要准备的账号与资料清单在阿里云上申请免费证书之前确认这些东西已经准备好阿里云账号且已完成实名认证。一个在阿里云备案系统完成备案的域名如果服务器在中国内地中国香港等地域的服务器域名不强制备案但为了稳定和业务合规建议按要求备案。域名解析权限也就是能在云解析 DNS 控制台添加记录。阿里云申请免费证书支持 DNS 验证其中一种方式就是自动添加 DNS 记录。服务器上安装并运行了至少一个 Web 服务器Nginx 或 Apache并且能够通过命令行操作服务器。这些资料属于“硬前置”缺一个后面流程都会卡住。3. 阿里云免费证书的申请与部署3.1 在控制台申请免费证书登录阿里云控制台后进入“数字证书管理服务”或“SSL 证书”产品页面点击“申请证书”。这里注意选对证书类型免费证书测试证书在控制台的入口是“免费证书”或者“个人测试证书”不要选成付费证书。申请时一般只需要填域名、验证方式和联系人邮箱。填写域名时注意如果你要保护的域名是example.com那证书通常只覆盖example.com这一个域名不含www.example.com。如果需要两个都能用得在申请时按多个域名添加或者单独申请一张覆盖两个域名的证书免费版通常支持绑定多个单域名但泛域名*.example.com一般要付费版本才能支持。这一步的实操经验是如果业务还没确定要不要加 www最稳妥的做法是申请时把example.com和www.example.com都加上避免后期二次申请。3.2 DNS 验证与文件验证的原理和选择提交申请后CA 需要验证你确实拥有这个域名的控制权。阿里云免费证书主要提供两种验证方式。DNS 验证在云解析控制台添加一条指定主机记录和记录值的 TXT 记录。CA 通过查询这条 TXT 记录来确认域名归属。这种方式推荐给使用阿里云 DNS 解析域名的人因为控制台可以做到半自动添加验证通常在几分钟到几小时内完成。文件验证在网站根目录下放一个指定内容文件比如http://example.com/.well-known/pki-validation/fileauth.txt要求内容严格符合格式CA 通过访问这个文件来确认控制权。文件验证的优点是不用改 DNS缺点是如果服务器没有公网 IP 或者 80 端口被防火墙挡住验证会失败。我的建议是能用 DNS 验证就别用文件验证DNS 的稳定性和自动程度更高而且不用管 Web 服务当前是启动还是停止状态。验证过程中如果长时间显示“验证失败”优先检查TXT 记录的主机记录是否填反了是填_dnsauth而不是www。记录值是否完整复制前后不能有空格。DNS 是否生效可以在自己的电脑上用nslookup -typetxt 你的域名查询。3.3 下载证书并上传到服务器证书签发后控制台会提供下载按钮。下载时选择对应的服务器类型比如你用的是 Nginx 就下载 Nginx 格式Apache 就下载 Apache 格式。下载解压后典型的 Nginx 证书包含两个文件xxx.pem证书文件含证书链也可能叫xxx.crt。xxx.key私钥文件。把这两个文件上传到服务器我习惯放到/etc/ssl/certs/或/etc/nginx/ssl/下然后给文件设置最小权限sudo mkdir -p /etc/nginx/ssl sudo chmod 700 /etc/nginx/ssl # 上传证书和私钥到该目录后 sudo chmod 644 /etc/nginx/ssl/example.pem sudo chmod 600 /etc/nginx/ssl/example.key私钥文件权限必须收紧这是安全底线。之前见过有人图省事chmod 777结果服务器日志里被扫描到私钥泄露这种事真的不是危言耸听。3.4 Nginx 部署 HTTPS 的核心配置以 CentOS/Ubuntu 上最常见的 Nginx 为例在/etc/nginx/conf.d/下新建一个配置文件比如example.conf写入如下配置server { listen 80; server_name example.com www.example.com; # 将 HTTP 请求重定向到 HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; # 如果 Nginx 版本较新可以使用 http2 指令 # listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.pem; ssl_certificate_key /etc/nginx/ssl/example.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; root /usr/share/nginx/html; index index.html index.htm; }配置里几个关键点证书路径必须与上传路径一致写错一个字母都会导致 Nginx 启动失败。443 监听时ssl参数不能丢否则 Nginx 不会启用 TLS 加密。配置文件改完先检查语法nginx -t确认无报错再systemctl reload nginx或nginx -s reload。千万别直接重启如果配置有问题会直接把服务搞挂。如果之前配置过其他证书或者有过占位的配置reload 之前注意确认server_name没有和其他 server 块冲突。3.5 Apache 和 Tomcat 下的快速适配如果服务器用的是 Apache配置差异主要在指令名上。启用ssl_module后在 VirtualHost 里配置VirtualHost *:443 ServerName example.com SSLEngine on SSLCertificateFile /etc/httpd/ssl/example.pem SSLCertificateKeyFile /etc/httpd/ssl/example.key /VirtualHostTomcat 则复杂一些通常需要把 PEM 格式转换成 PKCS12 或 JKS 格式再修改server.xml里的 Connector 配置。这里我给一个快速转换命令openssl pkcs12 -export -out example.p12 -inkey example.key -in example.pem -password pass:changeit keytool -importkeystore -srckeystore example.p12 -srcstoretype PKCS12 -destkeystore example.jks -deststoretype JKS然后把生成的 JKS 文件路径和密码填到server.xml的conf/目录对应位置。Tomcat 配置相比 Nginx 和 Apache 稍繁琐但原理一致。4. 自签名测试证书的生成与配置4.1 用 OpenSSL 一键生成自签名证书没有域名、或者不想走控制台申请流程时自签名证书是最快的路子。直接在阿里云服务器上执行下面这组命令sudo mkdir -p /etc/ssl/self-signed cd /etc/ssl/self-signed sudo openssl req -x509 -nodes -newkey rsa:2048 -days 365 \ -keyout example.key \ -out example.crt \ -subj /CCN/STBeijing/LBeijing/OMyCompany/CNexample.com解释下参数-x509直接生成自签名证书而不是证书签发请求CSR。-nodes生成的私钥不加密这样 Nginx 启动时不需要输入密码方便自动化。-newkey rsa:2048生成 2048 位的 RSA 新私钥这个长度是目前的主流要求低于 2048 位的证书在 2024 年以后基本被浏览器拒绝。-days 365有效期 365 天自签名证书有效期可以自己控制。-subj证书主体信息其中CNexample.com是最关键的浏览器校验域名时会拿它和访问的域名比对。注意如果访问方式是 IP比如https://192.168.1.100那自签名证书的CN就填 IP 地址或者使用-addext subjectAltNameIP:192.168.1.100添加 SAN 扩展否则浏览器还是报域名不匹配。4.2 自签名证书配置到 Nginx自签名证书配置到 Nginx 的方式和阿里云免费证书几乎一样只是路径和文件名不同server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/self-signed/example.crt; ssl_certificate_key /etc/ssl/self-signed/example.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; }配置完成后同样nginx -t验证、reload。自签名证书部署后浏览器会提示“不安全”这不是配置错误而是因为客户端没有信任这张证书的签发者。接下来要处理的是“让客户端信任”这件事。4.3 让浏览器或系统信任自签名证书如果只是自己测试点“高级”然后“继续前往”也能凑合但每次访问都点就很烦。更专业的做法是把自签名证书导入系统信任区。Windows双击.crt文件选择“安装证书”存储位置选“本地计算机”然后放到“受信任的根证书颁发机构”。macOS双击证书文件导入“钥匙串访问”然后找到该证书设置为“始终信任”。Android/iOS在设置里安装 CA 证书不同系统路径略有差异一般都在“安全”或“加密与凭据”菜单下。要注意的是自签名证书的信任范围有限。你在一台电脑上安装了信任换一台设备访问照样报错所以它更适合个人开发或小团队内网环境。如果是多成员协作更推荐在内网搭一个私有的 CA 服务器给每台设备分发根证书和子证书但那个工程量就大很多了测试阶段不太划算。4.4 自签名证书在接口联调中的特殊价值除了网页自签名证书在服务间调用时也很有用。比如后端服务 A 要调用服务 B 的 HTTPS 接口如果 B 用的是自签名证书A 在发起 HTTPS 请求时需要显式关闭证书校验仅限测试代码或者把 B 的证书导入 A 的信任库。Java 环境里的典型做法keytool -import -alias example -keystore cacerts -file example.crt -storepass changeitNode.js 环境里则可以通过环境变量NODE_EXTRA_CA_CERTS/path/to/example.crt来额外信任证书。这种灵活度是免费证书不具备的也是我至今仍在测试环境保留自签名证书的原因。5. 证书链、混合内容与性能检查5.1 证书链不完整导致的“红色锁”很多朋友部署完证书后用浏览器访问发现锁是红色的或者显示“证书不受信任”但证书明明是正规 CA 签发的问题大概率出在证书链不完整。CA 签发的证书文件一般分两部分服务器证书本身和中间证书Intermediate Certificate。某些下载包会把两者合并在同一个.pem文件里某些是分开的。如果只配置了服务器证书而没有带上中间证书客户端无法从服务器证书回溯到受信任的根证书就会判定为不可信。排查方法很简单openssl s_client -connect example.com:443 -servername example.com在输出里找verify return code如果是unable to get local issuer certificate基本可以确定是证书链不全。解决方式是把中间证书内容拼接到服务器证书文件后面cat intermediate_ca.pem example.pem cat example.crt example.pem拼接顺序是“服务器证书放最前根证书/中间证书在后”。很多教程没写这个坑导致第一次配置的人被“红色锁”折磨半天。5.2 页面里有 HTTPS 但部分请求还是 HTTP证书配置完成后另一个常见问题是“页面能打开锁也正常但控制台一堆 Mixed Content 报错”。这是因为页面里还引用了http://开头的图片、脚本、样式、接口地址。解决思路有两个把资源地址改成相对路径或协议相对路径//example.com/xxx.js。在 Nginx 反向代理或应用层做自动跳转比如开发阶段在 Nginx 里统一加add_header Content-Security-Policy upgrade-insecure-requests;让浏览器自动把 HTTP 请求升级为 HTTPS。这个头只建议在测试环境开因为它本质上掩盖了前端代码里写死 HTTP 地址的问题正式环境还是要把资源地址彻底改干净。5.3 TLS 协议版本与加密套件的最低标准测试证书阶段另一个值得顺手做掉的事是把服务器的 TLS 配置规范化。2024 年之后TLS 1.0 和 TLS 1.1 已经被主流浏览器彻底废弃如果服务器还只支持旧协议用户访问时会直接打不开页面。建议的基准配置ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;配置后可以用nmap --script ssl-enum-ciphers -p 443 example.com或在线扫描工具检查协议兼容性。测试环境跑通后把这份配置直接带到正式环境能省很多事。6. 常见问题与排查技巧实录6.1 证书部署后访问显示“不安全”现象可能原因处理方式浏览器提示证书无效证书 CN 与访问域名不匹配检查证书绑定的域名用域名访问而不是 IP浏览器提示证书链不完整Nginx/Apache 配置缺少中间证书拼接 CA 证书到证书文件浏览器提示证书已过期免费证书 3 个月到期或自签名证书到期续期或重新生成并部署页面无法访问连接超时安全组/防火墙未放行 443在阿里云控制台安全组放行 TCP 443访问报 ERR_SSL_PROTOCOL_ERROR443 端口被其他服务占用或配置没生效检查ss -lntp确认监听进程是 Nginx6.2 免费证书有效期的坑与续期提醒阿里云免费证书目前有效期只有 3 个月这意味着每个季度都要续期一次。忘记续期导致线上 HTTPS 突然挂掉的情况我见过太多次了。建议做成自动化在阿里云控制台开启证书到期提醒短信/邮件同时在服务器上加一个定时任务比如每月检查一次证书剩余天数#!/bin/bash # /usr/local/bin/check_cert.sh DOMAINexample.com CERT_FILE/etc/nginx/ssl/example.pem EXPIRY_DAYS$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2/dev/null | openssl x509 -noout -enddate | cut -d -f2) echo Certificate expiry: $EXPIRY_DAYS你可以把上面的脚本放进 crontab每月 1 号执行一次日志输出到文件即可。注意免费证书到期后需要重新申请并重新部署不能像付费证书那样直接在控制台点“续费”就自动换新。所以提前在日历上标好“证书更新日”或者写一个部署脚本把续期流程半自动化都是值得花时间做的事。6.3 私钥与证书不匹配的快速判断有时候证书文件和服务器的私钥对不上Nginx 启动时会直接报错但也有时候能启动但访问异常。这时候可以用命令快速比对# 查看证书公钥的 MD5 openssl x509 -in example.pem -noout -modulus | openssl md5 # 查看私钥的 MD5 openssl rsa -in example.key -noout -modulus | openssl md5如果两个输出不一致说明证书和私钥不匹配需要重新下载或者重新生成。6.4 移动端 App 访问测试环境证书的问题除了浏览器移动端 App 在测试环境访问自签名证书时也会遇到信任问题。iOS 和 Android 对证书的信任机制差异比较大Android 7.0 之后默认不再信任用户安装的 CA 证书需要在网络配置文件里显式声明信任或者把证书打包进 App。这块没有“一招鲜”的解法我自己常用的办法是如果是内部测试 App就在开发版本里把证书校验关掉或者把测试证书打包进res/raw/再在网络配置里引用。正式版绝不这样做。7. 从测试证书切换到正式证书的注意事项7.1 切换前做什么从测试证书切换到正式证书时不要直接覆盖文件建议按这个顺序操作备份现有测试证书和私钥cp /etc/nginx/ssl/example.pem /etc/nginx/ssl/example.pem.bak。下载正式证书并上传保持文件名和路径一致。nginx -t检查配置。nginx -s reload平滑生效。用openssl s_client验证新证书的签发者、有效期、域名匹配情况。这样做的核心逻辑是一旦正式证书有问题可以立刻回滚到备份的测试证书避免网站长时间无法访问。7.2 正式环境建议开启的“附加安全项”切换为正式证书后建议顺手做几件事开启 HSTS在 Nginx 中加上add_header Strict-Transport-Security max-age31536000; includeSubDomains always;强制浏览器只能通过 HTTPS 访问。注意开启 HSTS 前必须先确保 HTTPS 稳定否则会导致用户长时间无法访问 HTTP 版本。关闭不需要的 TLS 旧版本只保留 TLS 1.2 和 TLS 1.3。配置证书自动续期如果使用的是支持 API 的证书服务或者至少在日历上设置到期提醒。这些都属于“测试转正式”的收尾工作不要忽略。7.3 免费证书、自签名证书与自动化运维的结合点如果你走的是“阿里云免费证书 脚本化部署”这条路还可以考虑更进一步把申请、下载、上传、reload 的步骤写成一个脚本每次证书到期只需要手动更新证书脚本自动完成剩余步骤。我自己常用的简化版流程是在控制台申请证书并完成 DNS 验证。下载证书到本地。用scp或rsync上传到服务器。在服务器上执行nginx -t systemctl reload nginx。这套流程熟练后整个换证过程可以控制在 10 分钟以内。提醒自动化脚本要注意私钥的传输安全尽量走加密通道SSH/SCP不要在公网明文传输私钥文件。8. 一些真心话与后续扩展建议测试证书这件事说大不大说小不小但几乎每个做服务器运维和开发的人都绕不开。我的经验是第一次配置时多花点时间把原理搞清楚后面无论是换证书、换服务器还是加域名都会顺手很多。我踩过最深的坑就是对证书链不完整没有概念当时折腾了一整天最后发现只是少了中间证书。所以这篇博文里我特意把证书链、私钥匹配、安全组放行这些细节都写出来了就是希望你能避开这些没有技术含量却特别耗时的故障。另外配置完测试证书之后你可能会发现服务器上还需要一并处理好其他配套内容比如内网服务的时间同步证书校验依赖正确的系统时间、Java 环境的cacerts证书导入、Node.js 的NODE_EXTRA_CA_CERTS设置等。这些我在文中都提到了具体思路之后有机会可以展开再写。整体来看测试证书的部署是 HTTPS 体系建设中门槛最低、收益最明显的一环。从自签名证书打通流程到免费证书覆盖测试环境再到付费证书支撑正式业务是一条很平滑的升级路径。希望这篇分享能帮你少走一些弯路在阿里云服务器上快速把 HTTPS 跑起来。