ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

腾讯云免费SSL证书申请与部署全攻略:Nginx/Apache/IIS实战

腾讯云免费SSL证书申请与部署全攻略:Nginx/Apache/IIS实战 前两天一个做外贸独立站的朋友找我说Chrome浏览器直接把他网站标成了“不安全”客户点进来没几秒就关了页面订单量掉了一截。我帮他查了一圈发现域名还是裸HTTP跑的连个最基本的SSL证书都没挂。当天下午我远程给他搞了一套腾讯云免费SSL证书半小时内网站就带上了小锁标志。这事让我挺感慨的——都2024年了居然还有不少站长觉得HTTPS是件多复杂、多花钱的事。实际上给网站启用HTTPS早就是标配操作了网站有没有这个绿色的锁直接影响用户信任度、第三方接口回调、小程序域名校验甚至搜索引擎排名。而腾讯云的免费SSL证书正好是个人站长和小型企业项目最省事的选择——不用掏钱、申请流程全线上、签发速度也快。这篇文章我就把整套流程完整拆一遍从证书申请、域名验证、下载部署到Nginx、Apache、IIS常见场景的配置写法再到我实际部署中踩过的坑和解决办法。不管你是刚接触服务器的小白还是被证书过期折腾过的老手照着操作基本都能一次跑通。1. 为什么网站一定要上HTTPS不只是“多个锁”那么简单很多刚接触建站的朋友会觉得我又不做电商、又不收集用户手机号普通HTTP传输也挺好的为什么要费劲去搞SSL证书这个想法在五六年前还能勉强说得过去放到今天已经完全行不通了。1.1 浏览器强制标记HTTP网站用户根本不敢停留Chrome、Edge、Firefox这些主流浏览器现在对HTTP网站的默认态度就一个明晃晃地在地址栏显示“不安全”三个字。Chrome甚至明确把HTTP页面标记为“不安全”的前缀而且这个标记一直在往更严格的方向走。用户看到这几个字的第一反应是什么直接关掉你的网页然后去搜索下一家。你的内容做得再好、加载再快都抵不过浏览器给你贴的这层负面标签。我朋友那个独立站就是这么丢流量的。他用的是香港轻量服务器访问速度其实不慢但客户打开页面看到“不安全”提示绝大多数人第一反应都是“这家怕不是钓鱼网站”拔腿就走。1.2 HTTP协议是明文传输数据等于在裸奔从技术原理上说HTTP传输的数据是明文状态从你的浏览器到服务器之间的任何一个中间节点路由器、运营商网关、WiFi热点都能直接看到你发送的内容。网站登录密码、Cookie、填写的表单信息在HTTP之下都是“裸奔”。如果网络环境再复杂一点中间人攻击、数据篡改也是现实存在的风险。启用HTTPS之后客户端和服务器之间会先做一次TLS握手协商出会话密钥后续所有传输数据都经过加密。就算中间有人抓到了数据包看到的也是一堆无法还原的密文。简单说HTTPS不解决你的网站有没有漏洞但它保证用户和你之间通信的通道是安全的。就好比你寄快递虽然包裹里的东西是不是违禁品是另一回事但至少箱子本身是密封的不会在路上被人拆开看、往里塞东西。1.3 微信小程序、支付回调、部分第三方API强制要求HTTPS如果你做的是国内业务HTTPS往往不是“可选项”而是“准入条件”。微信小程序的request请求域名要求必须是HTTPS支付宝、微信支付的接口回调地址要求HTTPS很多开放平台的应用回调地址也默认只允许HTTPS。没有证书你连这些功能的开发调试都做不了。另外搜索引擎对HTTPS站点也有一定倾向性Google官方长期将是否启用HTTPS作为排名信号之一国内百度对这些安全标识也有收录上的偏好。倒不是说换了HTTPS你的排名一定暴涨但同等条件下搜索引擎没理由优先推荐一个被标记为“不安全”的站点。所以如果你现在还在用什么“端口映射”、“内网穿透”之类的办法硬撑HTTP业务真不如花半小时把SSL证书配上一劳永逸。2. 腾讯云免费SSL证书申请全流程从控制台到域名验证腾讯云的免费SSL证书以前和阿里云类似主打“一年期免费”后来政策调整成单张证书有效期3个月但可以重复申请依然不花钱。对于个人博客、企业官网、中小型业务来说这个免费额度完全够用唯一要付出的成本就是每3个月折腾一次续期。2.1 进入数字证书管理服务控制台登录腾讯云官网在顶部的产品搜索框里输入“SSL证书”进入“数字证书管理服务”SSL Certificate Service控制台。左侧菜单找到“证书管理”选择“我的证书”或者“证书列表”页面。这里补充一下腾讯云改版之后免费证书和付费证书的入口都在同一个控制台里你看到有“申请免费证书”的按钮就对了。免费证书目前提供的是TrustAsia品牌的DV证书移动端和桌面端浏览器全兼容信任链完整不需要额外装什么中间证书。2.2 填写申请信息域名是核心关键点击“申请免费证书”之后会进入信息填写页面。最核心的就是你要保护的域名。这里有几个高频细节免费证书不支持通配符泛域名证书也就是说你只能为example.com申请一张证书再为www.example.com单独申请一张。如果你两个域名都要HTTPS就申请两个证书绑定相同的订单也可以但免费版一般一次一个域名更省事。如果你同时希望用户访问http://example.com能自动跳转到https://www.example.com只需要给example.com和www.example.com都配上证书服务器里再做301跳转就行不需要买一纸通配符证书。域名必须已经完成ICP备案并正常解析到你的服务器。腾讯云免费证书对国内服务器上的备案状态有校验逻辑域名没备案的话验证和签发环节大概率会卡住。其他字段比如企业信息、组织名称免费证书不需要太纠结按照个人或组织实际情况填写即可。2.3 域名验证方式DNS验证和文件验证怎么选提交申请之后腾讯云会要求你做域名验证以证明“这个域名确实是你控制的”。免费证书通常支持两种验证方式第一种是DNS验证。这是我最推荐的方式操作界面会给你一条TXT解析记录比如主机记录是_dnsauth记录值是类似2024xxxxxxxx的一串字符。你需要在域名DNS服务商不管是腾讯云DNS、阿里云DNS还是Cloudflare都行的后台添加这条TXT记录然后回到SSL控制台点击“验证”。等待时间一般在1到10分钟之间取决于DNS的生效速度。第二种是文件验证。腾讯云会在申请界面给出一个随机文件名和文件内容你把文件上传到网站根目录下的/.well-known/pki/validation/路径确保通过http://你的域名/.well-known/pki/validation/文件名能访问到内容然后点击验证。这种方式不用动DNS但要求你的服务器8080或80端口能正常访问且网站根目录环境可写。我的建议是只要你的域名DNS不是那种改一条记录要几个小时才生效的冷门服务商一律优先用DNS验证。DNS验证一劳永逸签发后证书和域名绑定不需要在服务器上留任何验证文件。2.4 提交后等待签发留意免费额度回收规则验证通过后证书一般会在几分钟内签发。我这里说个真实教训腾讯云免费证书的申请额度是有一个“有效期窗口”的。你提交申请之后如果一直放着不做域名验证过了大概几天时间这个申请单会自动失效而且免费额度会回收当天甚至无法再次申请新的免费证书要等第二天才能继续。我当年第一次搞的时候就是提交完申请去忙别的隔了两三天才想起来结果提示免费证书额度已用完硬生生等了一天。所以申请完请立刻在15-30分钟内完成域名验证别拖延。签发成功之后控制台会显示“已签发”同时会提示下载。这一步别急证书接下来要下载到对应格式的压缩包然后再上服务器配置。3. 服务器端证书部署实操Nginx、Apache、IIS三个场景全覆盖证书签下来只是个开始真正动手配置时才会遇到各种细节问题。下面我把最常见三种服务器环境的配置完整写出来。3.1 下载证书看清楚你用的是哪种Web服务器在腾讯云SSL证书控制台的“我的证书”列表里找到已签发的证书点击“下载”。下载页面会弹出一个选择窗口里面有Nginx、Apache、IIS、Tomcat等选项。很多人第一次会直接选“其他”或者随便选一个结果下载下来发现证书格式不对配置半天都是错的。这里先弄明白不同选项对应什么文件格式Nginx压缩包里是_nginx目录包含.crt证书文件和.key私钥文件两个文本格式文件。Apache包含.crt证书文件、.key私钥文件、chain.crt中间证书文件。IIS包含.crt或.pfx格式IIS8.5以上更推荐用.pfx加密码的方式导入。Tomcat包含.jks或者.pfx密钥库文件需要密码。如果你用的是云服务器上自建的Web环境99%的情况是Nginx或者Apache按需选择就行。如果不确定自己服务器上装的是什么到服务器上执行nginx -v或者apachectl -v看一眼就知道了。3.2 Nginx配置最常用也最容易出错的场景Nginx是当前市场占有率最高的Web服务器下面这段配置是我在腾讯云轻量服务器和云服务器上反复用过的直接复制修改域名和路径就能用。首先把证书文件上传到服务器我习惯统一放在/etc/nginx/ssl/目录下证书文件命名为你的域名.crt私钥命名为你的域名.key。用SCP、FTP或者宝塔面板的文件管理器都能上传注意私钥文件权限必须设为600或400否则Nginx会拒绝启动。然后编辑Nginx配置文件通常在/etc/nginx/conf.d/或者/etc/nginx/sites-available/下新建一个ssl.conf文件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; # 证书文件路径 ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; # 协议与加密套件 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 安全响应头 add_header Strict-Transport-Security max-age31536000; includeSubDomains always; root /var/www/html; index index.html index.php; location / { # 这里按你自己业务填比如反代、伪静态等 try_files $uri $uri/ 404; } }重点说几个细节第一个是listen 443 ssl http2里的http2参数。HTTP/2多路复用能大幅提升HTTPS站点的资源加载速度尤其在图片、CSS、JS文件多的情况下体感明显。Nginx版本需要在1.25.1以上才支持http2直接写在listen里老版本则要写listen 443 ssl; http2 on;这个看版本不同区别很大新版Nginx直接写listen里的方式更简洁。第二个是80端口跳转。上面配置里第一个server块会把所有HTTP请求301到HTTPS。这一步非常关键不然用户还是可以通过HTTP明文访问既没得到浏览器安全标识又等于留了一个明文传输的口子。这里有一个我不止一次犯过的错误return 301 https://$host$request_uri;里的$host是动态取当前域名如果你同时挂了好几个域名的站点这个写法能保证每个域名都跳到对应的HTTPS地址不会跳错。第三个是HSTS头。add_header Strict-Transport-Security这行的作用是告诉浏览器未来一年内这个域名强制走HTTPS不需要再发起HTTP请求。配置了HSTS之后用户体验会好很多因为浏览器直接跳过HTTP请求。但这里有一个绝对要注意的前提只有你确认自己的站点所有子域名、所有资源都能正常走HTTPS后再开这个头。否则一旦浏览器记住强制HTTPS而你的图片CDN还在用HTTP那就全站静态资源全部被拦截了。改完配置后先做语法检查再重载nginx -t systemctl reload nginx如果nginx -t报错会明确告诉你哪一行、哪个文件有问题多半是证书路径不对、权限不够、或者ssl_certificate_key指向的文件不存在按提示解决即可。3.3 Apache配置mod_ssl启用与虚拟主机修改如果你用的是ApacheCentOS系统默认的httpd配置思路类似但细节不同。首先确认装了mod_ssl模块yum install mod_ssl -y然后在虚拟主机配置文件比如/etc/httpd/conf.d/ssl.conf或者你自定义的vhost文件里添加如下内容VirtualHost *:443 ServerName example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/httpd/ssl/example.com.crt SSLCertificateKeyFile /etc/httpd/ssl/example.com.key SSLCertificateChainFile /etc/httpd/ssl/chain.crt Directory /var/www/html AllowOverride All /Directory /VirtualHost VirtualHost *:80 ServerName example.com Redirect permanent / https://example.com/ /VirtualHostApache在这里比Nginx多一个SSLCertificateChainFile也就是中间证书链文件。如果你下载的压缩包里有ca_bundle.crt或者chain.crt一定要把它也配置上。很多Apache站点配置HTTPS后某些浏览器报“证书不受信任”就是因为少配了中间证书链。改完重启apachectl configtest systemctl restart httpd3.4 IIS配置pfx导入大法如果你用的是Windows Server IIS操作更图形化但绕不开的坑也不少。在腾讯云下载证书时选择“IIS”格式压缩包里会有一个.pfx文件和一个密码文件。然后打开IIS管理器点击服务器节点找到“服务器证书”图标。在右侧操作栏点“导入”选择pfx文件输入压缩包里备注的密码。在“网站”列表中找到你要启用的站点右键“编辑绑定”添加一条类型为https、端口为443、主机名为你的域名的绑定。绑定完成后重新启动网站即可。IIS下最常遇到的问题有两个一个是证书导入时报“密码错误”多半是复制密码时把隐藏字符带进去了另一个是没把HTTP的80端口绑定删除导致用户不走HTTPS也能访问建议直接再添加一条HTTP→HTTPS的URL重写规则或者干脆把HTTP绑定删掉。4. 证书格式转换与续期从“cer转Tomcat的pfx”这类需求说起我在搜索热门关键词的时候发现很多人都会搜“cer 转 tomcat ssl 证书 pfx”、“linux查看ssl证书过期时间”这类问题。这其实反映了两个集中痛点一是搞不懂证书文件的格式区别二是不知道什么时刻该续期。4.1 证书格式与部署场景对照SSL证书在服务器上的最终呈现格式就那么几种很多人被各种后缀绕晕。这里把常见格式和适用场景做个对照文件格式主要代表适用场景.crt / .pem文本证书文件Nginx、Apache、大多数Linux服务.keyPEM格式私钥Nginx、Apache.pfx / .p12PKCS#12密钥库IIS、Tomcat、Windows服务.jksJava密钥库Tomcat、Java中间件.der二进制证书部分Java旧系统、嵌入式设备如果你在腾讯云上下载的是Nginx格式就是.crt和.key想给Tomcat用不需要重新申请直接用OpenSSL转换一下即可。4.2 从crt/key转成pfx的OpenSSL转换命令在服务器或者自己电脑上执行openssl pkcs12 -export -out yourdomain.pfx -inkey yourdomain.key -in yourdomain.crt执行过程中会要求你设置pfx导出密码这个密码就是后面导入Tomcat或者IIS时要用的。如果你还有中间证书链文件加一个-certfile chain.crt参数一起转进去openssl pkcs12 -export -out yourdomain.pfx -inkey yourdomain.key -in yourdomain.crt -certfile chain.crt转完后把pfx文件放到Tomcat的conf目录下修改server.xml里的Connector配置Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads150 SSLEnabledtrue SSLHostConfig Certificate certificateKeystoreFileconf/yourdomain.pfx certificateKeystoreTypePKCS12 certificateKeystorePassword你设置的密码 / /SSLHostConfig /Connector然后在Tomcat的web.xml里加上安全约束让HTTP请求自动跳转到HTTPS这里就不展开写了网上现成片段很多。4.3 3个月有效期怎么续定时检查与证书轮换免费证书有效期只有3个月这是它最大的“运维成本”。好在腾讯云的免费证书整体流程已经非常简化每3个月重复一次“申请→验证→下载→部署”的循环就行。但手动操作容易遗忘我的做法是配合定时任务做“证书过期前提醒”。在Linux服务器上用一行命令就能看到证书到底什么时候到期openssl x509 -enddate -noout -in /etc/nginx/ssl/example.com.crt输出会告诉你notAfterJan 1 12:00:00 2025 GMT这样的时间。更自动化一点的做法可以用crontab每月跑一个脚本检查证书剩余天数不足30天就发邮件或者钉钉通知自己#!/bin/bash expire$(openssl x509 -enddate -noout -in /etc/nginx/ssl/example.com.crt | cut -d -f2) expire_epoch$(date -d $expire %s) now_epoch$(date %s) days_left$(( ($expire_epoch - $now_epoch) / 86400 )) if [ $days_left -lt 30 ]; then echo 证书将在 $days_left 天后过期请及时续期 | mail -s SSL证书过期提醒 youexample.com fi如果你不想每3个月手动折腾一次也可以考虑用ACME自动续期方案比如acme.sh脚本配合DNS API自动申请Lets Encrypt证书实现证书的自动续期和自动部署。腾讯云和阿里云也都支持了基于ACME协议的API对接理论上可以做到全自动。不过这篇主要是讲腾讯云免费证书的手动流程自动化方案以后有机会单独写一篇。4.4 腾讯云和阿里云免费证书政策对比既然提到了续期顺手说下国内两家云厂商免费证书现在的差异。腾讯云免费证书TrustAsia目前是3个月有效期、支持重复申请阿里云免费证书目前分两种一种也是3个月的短期免费证书另一种偶尔开放的一年期免费证书政策经常变。我自己两边都用过体感上差别不大。核心区别在于腾讯云的申请流程比较统一控制台里的“免费证书额度”每天有限申请次数太多会提示额度不足。阿里云的免费证书有时会要求更严格的域名验证方式或者和备案信息绑定更紧。如果你用的是“搜索热词”里那种一键部署到云产品的场景比如CDN、负载均衡两家都能直接关联云资源不需要手动下载再上传非常方便。5. 实际部署中的踩坑记录这五个问题最隐蔽也最耽误时间这段是全文我最有底气的部分因为下面每个问题都是我或者身边朋友真实踩过的。很多人卡在HTTPS配置上不是因为不会抄配置而是踩了这些文档里不会写明的坑。5.1 域名验证失败DNS解析记录没生效就狂点验证腾讯云的免费证书申请后需要做DNS验证但你把TXT记录加到了DNS服务商那边之后不是马上就能通过验证的。DNS解析的TTL时间决定了全球解析生效需要多久虽然国内解析一般几十秒到几分钟就生效但如果你用的海外DNS服务商或者域名NS记录刚从别处迁过来等待时间可能长达几小时。这种错误我见得太多了加了TXT记录后立刻回腾讯云点“验证”点了七八次都是“验证失败请检查解析记录”然后就开始怀疑是不是记录填错了各种删了重加。解决办法加完TXT记录之后先在你自己的机器上查一下解析到底生效了没有dig TXT _dnsauth.example.com short如果输出是你填的那串记录值再回腾讯云点验证基本一次就过。如果没有输出再等几分钟不要再疯狂点击验证按钮了。5.2 证书文件上传后的权限问题Nginx直接启动失败把.crt和.key上传到服务器之后很多人没有注意文件权限启动Nginx时报错[emerg] cannot load certificate key ... Permission denied原因是Nginx的master进程通常以root运行但worker进程以nginx用户运行私钥文件权限过宽比如777或者路径中间目录不可读都会导致无法加载。正确做法chmod 600 /etc/nginx/ssl/example.com.key chmod 644 /etc/nginx/ssl/example.com.crt同时确保/etc/nginx/ssl/目录本身是755权限父目录可执行。5.3 重新签发证书后Nginx不生效进程没有热加载证书到期后申请了新的下载下来替换了服务器上的.crt和.key文件但刷新浏览器发现还是旧证书。这个问题最初在调试时非常迷惑直到我看了Nginx的进程状态才想明白Nginx不会自动感知证书文件的变化替换文件后必须执行一次重载让master进程重新读取证书nginx -s reload注意这里不一定要用systemctl restart nginxreload就可以了reload会平滑重启worker进程不中断现有连接。5.4 证书链不完整移动端随机报错Nginx部署证书时只要了ssl_certificate和ssl_certificate_key没配中间证书链。在电脑Chrome上打开一切正常但某些手机浏览器、老版本Android系统上会偶尔弹出“证书不受信任”的提示。很多人的第一反应是“证书有问题”其实证书本身完全没问题问题出在服务端没有下发完整的证书链。DV证书通常包含“服务器证书中间证书”两层。在Nginx里你可以在ssl_certificate指定的.crt文件中把服务器证书和中间证书拼在一起也可以单独加一行ssl_trusted_certificate指向中间证书文件。我用的是更省事的方法在下载证书压缩包后把fullchain.crt腾讯云Nginx包里通常有这个合并后的文件直接作为ssl_certificate的路径一了百了。5.5 部署完HTTPS后首页正常子页面资源全是HTTP安全锁变成灰色感叹号这是很多站点启用HTTPS初期都会遇到的问题证书配好了、HTTPS能访问了但页面上引用的图片、CSS、JS还有一堆HTTP的绝对路径浏览器会把整个页面判定为“混合内容”安全锁从绿色变成灰色感叹号甚至直接不出锁。排查方法很直接用Chrome的F12开发者工具看Console面板里面会标出哪个URL是Mixed Content。解决方案最彻底的还是全站将资源地址改成相对路径或者//协议自适应写法如果在用CDN也要保证CDN域名支持HTTPS。如果用的是WordPress这类CMS安装一个“Really Simple SSL”插件可以自动把资源地址批量替换成HTTPS省去手动改数据库的麻烦。6. 配置完成后如何验证HTTPS真正生效所有配置都完成后不要急着宣告大功告成把验证这一步做完整能省掉后面很多隐性隐患。6.1 浏览器与命令行双重检查先在浏览器强制刷新一下网站CtrlF5查看地址栏是否显示小锁点击小锁查看“证书信息”确认证书的有效期、域名和你申请的域名完全一致特别是www和裸域名都不能有错配。更严谨一点用命令行直接看网站的证书链和协议版本echo | openssl s_client -connect example.com:443 -servername example.com 2/dev/null | openssl x509 -noout -dates这个命令会直接打印出服务器实际下发的证书生效日期和过期日期能迅速判断服务器上加载的是不是最新证书。6.2 在线测试工具扫一遍如果想更全面强烈建议用Qualys SSL Labs的在线检测工具www.ssllabs.com/ssltest/对站点检测一遍。它会从协议版本、证书链、加密套件、安全性评分等多个维度给出A到F的评分。国内服务器访问这个检测站点稍微有点慢但值得等待。只要评分在A-以上就说明你的HTTPS配置在当前环境下已经没什么问题了。如果你部署的是小程序或API接口最后再用Postman或者代码请求一把线上HTTPS接口看看响应是否正常、有没有证书过期异常很多时候浏览器能过但程序请求因为证书链问题或者协议不匹配照样报错这种问题越早发现越好。6.3 性能和兼容性提醒补充一个容易被忽视的点启用HTTPS后首次TLS握手会额外增加1到2个RTT的延迟但启用HTTP/2之后整体性能通常反而比HTTP/1.1更快。如果你发现网站切到HTTPS后打开速度慢了一截先确认一下是不是HTTP/2没开如果Nginx版本过旧建议升级到新版然后把上面配置里的http2参数加上大多数情况下体感会有明显改善。兼容性方面TLSv1.2和TLSv1.3是目前最安全的配置组合。除非你还在兼容IE8这种远古浏览器否则没必要开TLSv1.0和TLSv1.1这两个老协议存在多个已知安全漏洞也不符合现在的主流合规要求。做完了以上所有检查你的网站就是一个证书信息正确、证书链完整、配置安全的正经HTTPS站点浏览器完全信任用户访问也踏实。最后再分享一个实际运维中的小技巧尽量把证书申请、域名验证、服务器替换这几件事放在同一个下午集中完成。不要今天申请证书、明天验证、后天再部署因为免费证书的有效期只有3个月拖的时间全是占着自己的有效期。我后来都是把证书到期日提前一个月设成日历提醒到期前两周就申请新证书然后在某天低峰期完成替换和验证全程不超过40分钟。这套流程跑顺了之后HTTPS就只是个后台例行公事再也不会给站点拖后腿。
返回列表