尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从选型到自动续期:SSL证书实战经验与四大服务商对比

从选型到自动续期:SSL证书实战经验与四大服务商对比 上个月一个朋友的电商网站打不开了客服线上催了半天我一查才发现SSL证书过期了15天浏览器直接红色警告。这个场景估计不少运维都经历过——证书这东西平时没人想起来但一旦过期用户眼睁睁看着你网站显示“不安全”跳失率直线上升搜索引擎也会悄悄降权。我自己的博客、公司业务系统、客户部署的FTP服务这些年都折腾过SSL证书踩过不少坑也总结出一套比较顺手的流程。今天就把这几年在四家主流服务商——阿里云、腾讯云、Lets Encrypt、DigiCert——申请、安装、续期SSL证书的经验一次性整理出来从选型思路到部署细节到自动化续期覆盖不同场景的真实需求帮你搞明白“证书到底怎么选、怎么装、怎么续”别再为这事半夜被叫起来。最后强调一下适用范围如果你是个人开发者、博客站长、中小公司运维或者负责给客户交付项目的乙方技术这篇文章基本都能对号入座。我会把每家的申请流程、验证方式、部署命令、续期策略都拉出来横向对比该给参数给参数该贴配置贴配置能自动化就自动化。1. 四家服务商选型对比先搞清楚自己到底需要什么1.1 四家品牌的核心定位和差异先说结论没有哪家绝对好只有哪家更适合你的场景。这四家我按“国内大厂、国际免费、国际商业高信任”三个维度来拆。阿里云国内体量最大最大优势是生态集成。如果你服务器在阿里云、域名在阿里云、CDN/OSS也用阿里云那直接在它家申请证书最省事——DNS验证可以自动完成下载的证书还分好了Nginx、Apache、Tomcat、IIS各版本压缩包基本不用手动改格式。它的免费证书以前能整一年后来政策收紧变成3个月但胜在流程稳定、中文文档全、客服能打通。腾讯云跟阿里云定位高度重合适合“业务在腾讯生态”的人。腾讯云有两点我觉得比阿里云舒服一是云解析和证书验证的联动做得细你在DNSPod解析的域名申请证书时基本一键自动验证二是证书管理控制台的操作路径设计得更直白新手不容易迷路。Lets Encrypt完全免费、90天短周期、全自动化驱动是个人站长的老朋友。它不做付费证书商业模式是“让全互联网默认HTTPS”所以技术上特别激进推广ACME协议和自动化签发。如果你有命令行基础愿意花半小时配置自动续期那它是零成本最优解。缺点也很明显证书有效期短不做OV/EV大企业不认而且国内网络环境访问它的签发服务偶尔不稳定。DigiCert老牌商业CA证书颁发机构走的是高信任路线。OV和EV证书的浏览器兼容性、品牌认可度都极高金融、政务、跨国企业基本绕不开它。价格也感人单张OV证书一年要几千到上万元。如果你做外贸站、SaaS产品、或者客户要求“绿标必须要有”那DigiCert这类商业CA是刚需。1.2 选型决策表按场景对号入座我整理了一张表对应不同身份的读者可以直接照着选使用场景推荐服务商证书类型建议周期预算个人博客/学习项目Lets Encrypt免费DV90天自动续期0元中小企业官网/API接口阿里云或腾讯云付费OV/DV1年几百到两千元已在阿里云/腾讯云的服务器对应的云厂商免费DV或付费OV按需0到几千元电商/支付/金融类业务DigiCertOV/EV1-2年数千到上万元外贸/国际化业务Lets Encrypt或DigiCertDV或OV按需视品牌而定FTP服务/内网工具自己签或任一家DV免费DV即可按需0元选型核心就一句话信任等级决定CACA决定生态生态决定安装成本。别一上来就纠结“哪家证书最安全”DV、OV、EV在加密强度上没有本质区别区别在于CA对域名和企业的验证深度以及浏览器地址栏展示的“认可度”。1.3 证书类型和品牌之间的隐藏“坑”这里多说一句很多人以为“用阿里云SSL证书”和“用DigiCert证书”是两回事其实不对。云厂商的证书本质上也是从CA进货的阿里云的免费证书实际由“数字证书认证中心”签发付费证书背后是DigiCert、GlobalSign等CA。你买的是“谁帮你做验证、谁帮你管生命周期”的服务而不是CA本身。这也是为什么我建议国内业务优先选云厂商——你买的不是证书本身而是它和云生态的集成能力。2. 证书原理与关键参数看懂这些才不会被参数忽悠2.1 SSL证书到底是怎么工作的很多朋友没系统学过HTTPS原理但装证书装了无数次我尽量用大白话讲清楚。SSL证书的核心作用就三件事身份认证、数据加密、数据完整性校验。你想想平时寄快递你得先确认收件人是不是本人身份认证然后把箱子封好不让别人偷看加密最后确保箱子路上没被人调包完整性。SSL证书就是数字世界里的“身份证保险箱封条”。具体流程是浏览器访问你的网站时服务器把证书包含公钥、域名、CA签名等信息发给浏览器浏览器先检查这张证书是不是由它信任的CA签发的检查域名是否匹配再检查证书是否过期。确认没问题后浏览器和服务器通过公钥加密协商出一个临时的对称密钥之后的通信都用这个密钥加解密。这整个过程叫SSL/TLS握手通常只需要几十毫秒。2.2 申请证书前必须理解的几个参数密钥长度。常见的是RSA 2048、RSA 4096以及ECC的P-256、P-384。RSA 2048是当下的底线4096更安全但握手性能稍微慢一点ECC密钥更短、运算更快适合高并发场景但老系统兼容性略差。个人建议默认选RSA 2048追求性能选ECC P-256金融类高安全需求选RSA 4096。签名算法。现在主流是SHA-256别再选SHA-1了2020年后所有主流浏览器都不认SHA-1签发的证书。申请时如果CA让你选闭眼选SHA-256。证书有效期。CA/Browser Forum浏览器厂商和CA组成的行业组织早就把公共SSL证书的有效期上限压到398天约13个月现在各国产云免费证书更是普遍压到90天。有效期越短越安全但运维成本越高。证书链。一个标准证书文件里通常有三层根证书、中间证书、你的证书。浏览器只预埋了根证书的信任锚中间证书和你的域名证书需要服务器完整下发。很多人部署报错“证书链不完整”就是只传了域名证书漏了中间证书。2.3 证书格式和文件后缀别再傻傻分不清申请完证书下载下来会看到一堆后缀.pem、.crt、.cer、.key、.pfx、.jks。本质上只有两类包含私钥的和不包含私钥的。.pem/.crt/.cer纯文本格式一般是证书文件内容是-----BEGIN CERTIFICATE-----开头。.key私钥文件-----BEGIN RSA PRIVATE KEY-----或-----BEGIN PRIVATE KEY-----开头。.pfx/.p12二进制格式证书和私钥打包在一起通常还有一个口令保护Windows和Tomcat常用。.jksJava专用格式Tomcat的另一种配置方式用的就是它。理解了这些后面做格式转换就心里有底了。比如热搜词里“cer转tomcat ssl证书pfx”本质就是把不包含私钥的证书文件和私钥文件打包成pfx格式具体操作我在第4章展开。3. 申请流程全对比从CSR生成到签发3.1 申请前的统一准备不管选哪家申请DV证书前你都得准备好两样东西域名管理权和服务器验证能力。域名管理权好理解域名必须是你的或者在你有权限的账号下。验证方式一般有三种DNS解析验证在域名解析记录里加一条txt记录、HTTP文件验证在网站根目录放一个指定文件、邮箱验证给域名管理员邮箱发确认邮件。DNS验证最通用也是我推荐大家优先选的。服务器验证能力则取决于你用的是哪家的验证方式。比如Lets Encrypt的HTTP-01方式要求你的服务器80端口对外可访问用于临时放验证文件DNS-01则要求你能操作域名解析最好能配合API自动化。申请前还有一步很多人忽略生成CSR证书签名请求。有些平台支持在线生成有些需要你自己用openssl生成。CSR里包含你的域名、公司信息OV/EV需要、公钥等于“跟CA提交申请的时候附带的个人资料”。我自己最常用的openssl生成命令openssl req -new -newkey rsa:2048 -nodes -keyout example.key -out example.csr -subj /CCN/STBeijing/LBeijing/OMyCompany/OUIT/CNexample.com注意-nodes表示私钥不加密生成后私钥可以直接给Nginx用CN字段填你要保护的域名多域名证书可以用subjectAltName参数扩展。3.2 域名验证的两种主流方式对比以Lets Encrypt的acme.sh脚本为例签发一张单域名证书的大致流程是curl https://get.acme.sh | sh acme.sh --issue -d example.com --nginx这个命令会自动检测Nginx配置自动放置验证文件并完成HTTP验证。如果域名没有部署Nginx可以用DNS方式acme.sh --issue --dns -d example.com它会返回一条TXT记录值你手动去域名控制台加上等DNS生效再重新运行签发命令。而阿里云、腾讯云的免费证书因为域名可能也在同一家平台在点击申请后它会自动帮你添加一条TXT解析记录作为验证你只需要确认授权即可这个过程比Lets Encrypt手动加解析要省事。我第一次用阿里云申请时从点击到签发花了大概3分钟其中大部分时间在等DNS生效。3.3 四家申请实操记录阿里云申请流程登录控制台搜索“数字证书管理服务”原SSL证书点击“申请证书”选择“DV单域名证书免费”现在叫“免费证书”填域名选“自动DNS验证”提交后等几分钟签发。签好后在证书列表下载选择服务器类型Nginx/Apache/Tomcat/IIS下载对应压缩包即可。这里要注意阿里云免费证书一个自然年有数量限制不过个人通常够用。腾讯云申请流程登录腾讯云控制台搜“SSL证书”点击“申请免费证书”填域名和验证方式。腾讯云比较顺手的一点是它默认使用DNSPod自动验证只要你的域名解析在DNSPod基本不需要手动操作。下载时同样按服务器类型选择对应格式。Lets Encrypt申请流程最标准的是通过ACME客户端。以acme.sh为例acme.sh --issue -d example.com --webroot /var/www/html或者使用certbotcertbot certonly --webroot -w /var/www/html -d example.com签发成功后证书文件位于/etc/letsencrypt/live/example.com/里面有四个文件fullchain.pem完整证书链、privkey.pem私钥、cert.pem域名证书、chain.pem中间证书。部署Nginx时用fullchain和privkey就行。DigiCert申请流程购买证书后在DigiCert管理后台选择“Certificate”按流程生成CSR提交后CA会做人工验证OV或更严格的企业验证EV验证通过后邮件通知下载。它的下载页面支持多种格式和服务器类型比较贴心的是会生成一个适合特定服务器的zip包。整个周期OV一般2-3天EV可能一周如果客户很急提前沟通好验证材料能明显加速。3.4 免费证书的“坑”别被60天/90天惊到现在云厂商免费证书普遍只有3个月有效期很多人第一反应是“这不是坑人吗、要天天续”。实际上你如果走自动化3个月和12个月在运维成本上差别很小。我就见过一个朋友用宝塔面板管理的证书它自动续期脚本每个月跑一次到期前自动换掉他根本不知道证书哪天过期。真正要上心的是别用“有效期短”当理由拖到过期设置好监控、自动续期剩下的交给脚本。4. 安装部署与格式转换不同中间件该怎么配4.1 Nginx和Apache最典型的高频部署Nginx是现在部署SSL证书最常见的场景配置文件里加三行server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem; }改完后执行nginx -t测试语法然后systemctl reload nginx。很多人只执行reload没执行restart也能生效但注意reload和restart的区别reload平滑重载配置不影响现有连接restart会断开所有连接。改了证书路径或新增vhost用reload就够了改了编译模块或端口监听得异常才考虑restart。Apache配置更简单VirtualHost *:443 ServerName example.com SSLEngine on SSLCertificateFile /etc/httpd/ssl/example.com/cert.pem SSLCertificateChainFile /etc/httpd/ssl/example.com/chain.pem SSLCertificateKeyFile /etc/httpd/ssl/example.com/privkey.pem /VirtualHostApache的SSLEngine on一定要写我见过一个例子少了这行结果443端口一直跑不起来日志也没报错排查了半天才发现是配置里漏了它。4.2 Tomcat部署cer转pfx全过程这个场景在热搜词里特别显眼——“cer转tomcat ssl证书pfx”。Tomcat默认走Java生态常见配置方式是pfx或jks格式。如果你的源证书文件是pem/crt/cer格式外加一个key文件最简单的办法是转成pfx。假设你的证书文件是example.cer私钥文件是example.key执行openssl pkcs12 -export -in example.cer -inkey example.key -out example.pfx -name tomcat -passout pass:changeit参数解释-in指定证书文件-inkey指定私钥-out指定输出文件-name给这个pfx内的密钥起个别名一般叫tomcat或alias-passout pass:changeit设置pfx的密码为“changeit”Java环境的默认密码方便起见可以先这么设生产环境务必改掉。转完pfx后找到Tomcat的conf/server.xml把原来的Connector配置改成Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads150 SSLEnabledtrue SSLHostConfig Certificate certificateKeystoreFileconf/example.pfx certificateKeystorePasswordchangeit typeRSA / /SSLHostConfig /Connector有些老版本Tomcat8以下用的是另一种写法和属性如果你在用特别老的Tomcat建议顺手升级一下。因为旧版Tomcat对TLS 1.2/1.3的支持不全证书配好后仍可能在浏览器安全等级上不达标。4.3 VSFTPD部署FTP over SSL/TLS的关键参数“vsftpd ssl证书要求”这个热搜词说明很多人还要给FTP服务加SSL证书。VSFTPDVery Secure FTP Daemon是Linux上常用的FTP服务它支持FTP over TLS也叫FTPS。部署前需要把证书和私钥合并成一个pem文件比如cat example.crt example.key vsftpd.pem然后编辑/etc/vsftpd/vsftpd.conf加入或修改以下配置ssl_enableYES allow_anon_sslNO force_local_data_sslYES force_local_logins_sslYES rsa_cert_file/etc/vsftpd/ssl/vsftpd.pem rsa_private_key_file/etc/vsftpd/ssl/vsftpd.pem require_ssl_reuseNO ssl_tlsv1YES ssl_sslv2NO ssl_sslv3NO这里的“ssl证书要求”关键点有三个force_local_data_sslYES和force_local_logins_sslYES确保登录和数据传输都强制走TLS避免密码明文传输。require_ssl_reuseNO如果你用的FTP客户端不兼容SSL会话复用最好关掉否则会频繁掉线。ssl_sslv2/sslv3都设NO只开TLSv1及以上不然会用上不安全的旧协议。配置完重启vsftpd服务再用FileZilla等客户端测试连接时勾选“要求显式FTP over TLS”能连上就说明证书生效了。4.4 证书链不完整和中间证书缺失问题这是个高频坑。很多人在浏览器访问时提示“证书链不完整”或“NET::ERR_CERT_INVALID”后端日志却毫无异常。原因很简单服务器没有下发中间证书只下发了一张域名证书。Nginx场景下把ssl_certificate指向的文件换成fullchain.pem它包含了域名证书中间证书就能解决。如果你手上只有cert.pem和chain.pem可以用命令合并cat cert.pem chain.pem fullchain.pem合并时顺序不能反域名证书在前、中间证书在后。如果中间有多级证书把整个链按“叶子证书→中间证书1→中间证书2”排列好用一条cat命令就搞定。5. 续期与自动化免费证书怎么做到永不过期5.1 阿里云免费证书续期的实际体验这里必须说一个大家最关心的点——“阿里云ssl证书免费续期”。阿里云的免费证书从2024年底开始强制90天有效期以前那种一年有效的免费证书已经没了。每次到期前控制台会给你发站内信和短信提醒你需要重新提交申请走一遍验证流程再下载更新证书。如果你是手动续期流程不算麻烦但很琐碎控制台点击“免费证书”→申请→填域名→DNS验证→等待签发→下载→上传到服务器→改配置→reload。全程顺畅的话10分钟但反复做3-4次总会烦。所以我现在给客户做方案时免费证书只推荐给个人测试和低流量站点正式生产环境要么用付费证书一年期要么直接用Lets Encrypt自动续期。5.2 Lets Encrypt自动续期脚本实操Lets Encrypt的最大优势就是可以完全自动化。用acme.sh来演示一下它的续期机制acme.sh --renew -d example.com --cron这条命令会执行cron任务acme.sh安装时会在crontab里自动写入一个定时任务默认每天凌晨检查域名距离过期还有多久不足30天就自动更新。如果证书需要同步到Nginx或其他目录在续期后加个钩子acme.sh --install-cert -d example.com \ --key-file /etc/nginx/ssl/example.com/privkey.pem \ --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \ --reloadcmd systemctl reload nginx这个命令把证书自动部署到Nginx目录并在续期成功后自动执行reload。整个链路全自动化从此你只需要关注域名解析是否正常。5.3 用cron写的通用续期监控脚本我还遇到过一种情况CA是商业付费证书服务商不提供自动续期功能。那我一般是靠自己的监控脚本兜底。核心逻辑很简单每天检查证书有效期剩余天数少于30天发邮件告警少于7天往钉钉群推消息。5.4 常见续期失败原因和补救我踩过最大的坑是DNS验证失败。Lets Encrypt或云厂商在验证时会读取你域名的TXT记录如果你用了CDN开启的“仅A记录”或其他特殊解析设置TXT记录没生效验证就失败。解决办法是先用在线DNS查询工具确认TXT记录已经全球生效再重新尝试签发。另一个坑是证书更新后服务器上的进程没有重新加载配置。Nginx要reload、Tomcat要restart、VSFTPD要等新会话这些不受reload影响的进程只能靠重启服务。所以我在自动化脚本的reloadcmd里会把几个服务的reload命令都写上systemctl reload nginx 2/dev/null || true systemctl restart vsftpd 2/dev/null || true这样能最大程度避免“证书明明更新了但服务还是旧的”这种尴尬。6. 常见问题排查实录我从现场带回的几张“处方”6.1 为什么部署完证书浏览器还是提示不安全排查顺序我基本固定先看证书是否被信任CA是否被浏览器信任、再看证书是否匹配域名、再看证书是否过期、最后看证书链是否完整。用这条命令可以快速检查证书内容openssl s_client -connect example.com:443 -servername example.com它会输出证书的完整链和你服务器的TLS配置一眼就能看出问题。最常出现的是用IP直接访问域名地址结果证书里的CN字段是域名导致域名不匹配。6.2 为什么证书链完整但移动端总是报错这是一个很真实的场景电脑Chrome打开正常手机Safari/微信内置浏览器却报错“证书无效”。原因大多出在下发的证书链不完整或者缺少跨根证书。有些老版本移动端浏览器对根证书的要求更严格你必须下发完整的fullchain.pem只发叶子证书肯定不行。还有小概率是服务器的TLS协议配置太旧比如只启用了TLSv1.0移动端默认禁用了。在Nginx里可以这样固定一个比较稳妥的版本策略ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;6.3 为什么私钥和证书不匹配打开Nginx时提示“私钥不匹配证书”多半是申请证书时用的CSR和你现在部署的key不是同一对。最好在生成CSR时就把key保存好别等到部署时重新生成。如果真丢了私钥唯一办法是重新申请一张证书没有捷径。6.4 为什么配置完Tomcat后8443端口启动不了Tomcat启动失败日志里报“Error creating SSLContext”常见原因有两种pfx密码错误、或者pfx里的别名不对。排查办法是看Tomcat的catalina.out日志定位到具体异常信息。用keytool可以查看pfx里的别名keytool -list -v -keystore example.pfx -storetype PKCS12它会列出alias和证书有效期等信息确认无误后保证server.xml里的配置和它一致就行。6.5 一个容易被忽略的细节服务器时间不同步有一次排查了半天最后发现是服务器系统时间慢了一小时导致TLS握手时证书还没到生效时间直接判成“证书无效”。NTP时间同步这个常识问题在云服务器上偶尔会被忽略。如果你改了Nginx配置、重启了好多遍始终报时间相关错误优先检查date systemctl status ntp 或 chrony把时间校准到当前时间再重启服务就好。最后分享一个实际经验做了这么多年证书相关工作我的核心感受是SSL证书绝大多数时候不是“技术问题”而是“流程问题”。选对服务商、配置好自动续期、确保证书链完整这三步做好了证书相关的事故率能下降90%。如果你的业务对可用性要求高别省那点钱用免费证书手动续期直接上一年期付费证书或Lets Encrypt自动化方案如果你只是个人博客、测试环境那Lets Encrypt完全够用别折腾。证书这东西最危险的不是“不安全”而是“你以为安全了但已经过期了”。能用脚本解决的就别用手点能自动续期的就别等提醒——这大概是我最想告诉同行的一句话。
返回列表