
前两天有个朋友跑来问我说他网站都上线半年了地址栏还顶着“不安全”三个大字看着心里发毛又不知道该从哪下手。我问他为什么不搞个HTTPS他第一反应是“证书不是要花钱吗”。这可能是很多人对SSL证书最深的误解。其实国内主流云厂商早就有免费证书可以申请几分钟就能搞定关键是你得知道整个流程。这篇文章我就以腾讯云免费SSL证书为主线从证书原理、申请流程、服务器配置到续期排错把我自己实操过的完整路径写出来。不管你是Nginx、Apache、Tomcat还是IIS都能找到对应的配置方式。内容偏操作向新手照着做就行老手也可以看看有没有漏掉的细节。1. 为什么网站要上HTTPS免费证书到底够不够用1.1 HTTP和HTTPS的核心区别先说点理论但我会尽量用大白话讲明白。HTTP协议在传输数据的时候是明文的也就是说用户在网页上输入的用户名、密码、手机号、身份证号从浏览器到服务器之间经过的每一个网络节点理论上都能看到这些内容。这就好比你寄快递包裹外面直接写着寄件人、收件人、物品名称任何一个经手人都能翻看。HTTPS做的事情很简单就是在HTTP外面套了一层加密通道。数据在浏览器端加密到服务器端解密中间传输的是一堆看起来毫无规律的密文。即使被截获对方也看不懂内容。这个过程依赖的核心组件就是SSL证书更严谨的说法是TLS证书但大家叫惯了SSL。证书里面包含你的域名信息、公钥还承担着证明“你是你”的身份验证作用。从用户视角看区别非常直观HTTP的网站地址栏可能显示“不安全”HTTPS的网站会有一个小锁头标志。这年头地址栏没有锁的网站用户的第一反应就是“这网站是不是钓鱼的”转化率直接受影响。1.2 免费证书和付费证书差别在哪腾讯云目前提供的免费SSL证书是TrustAsia品牌签发的基础型DV证书。DV是Domain Validation的缩写意思是只验证域名所有权不验证企业身份。付费证书通常包含OV组织验证和EV增强验证会验证企业的工商信息地址栏还能显示企业名称。那免费证书够用吗我的判断是对个人博客、企业官网、中小型业务系统免费DV证书完全够用。它同样能启用HTTPS能加密数据传输浏览器同样显示小锁头。区别在于信任级别的细节比如免费证书不支持泛域名也就是不能一个证书覆盖所有二级域名有效期通常是90天需要定期续期。但这些问题都不影响日常使用。这里有一个比较务实的选型建议如果你的业务涉及金融交易、大规模用户隐私数据或者你对“品牌信任感”有极强的需求可以购买付费OV/EV证书否则免费证书就是性价比最高的选择。省下来的钱干点啥不好。1.3 证书申请前必须准备的几样东西准备工作不多但每一样都不能缺。第一一个已经完成实名认证的腾讯云账号没实名的话先去实名这步绕不开。第二一个备案过的域名如果服务器在国内域名必须备案才能正常访问80/443端口。第三域名的DNS解析权限。这个很关键因为申请证书时最常用的验证方式就是DNS解析你得能去域名管理后台添加一条TXT记录。另外建议提前确认你的服务器类型和版本。是Nginx、Apache、Tomcat还是IIS不同服务器配置方式差异很大证书下载的时候也要选对对应的文件格式。我用过的服务器里Nginx占绝大多数其次是Tomcat和ApacheIIS在Windows环境也很常见。这篇文章的配置部分会把这四种都覆盖到你按需看对应小节就行。2. 腾讯云免费SSL证书申请全流程2.1 进入SSL证书控制台并选择免费证书登录腾讯云控制台后在搜索框输入“SSL证书”进入SSL证书管理控制台。页面会展示你名下已有的证书列表点击“申请免费证书”按钮就能进入申请流程。这里的核心选项有两个证书类型和绑定域名。证书类型选“免费证书”域名填你想要保护的域名。注意免费证书只支持单域名也就是一个证书只能绑定一个域名比如example.com。但是腾讯云有时会允许同时填写多个域名那一般是收费证书的选项免费版通常只有一个具体以控制台显示为准。如果你有www.example.com和example.com两个域名都需要HTTPS我的建议是两个都申请或者把其中一个做301跳转到另一个。填写完基本信息后系统会要求你选择验证方式。腾讯云支持自动DNS验证和手动DNS验证两种。自动DNS验证的前提是你的域名DNS解析服务商是腾讯云DNSPod系统会帮你自动添加一条TXT记录如果域名解析在阿里云、Cloudflare或其他服务商就得用手动DNS验证。2.2 DNS验证到底是在验证什么很多人不理解为什么申请证书还要搞DNS验证。这里解释一下证书签发机构需要确认“这个域名确实是你在控制”才能给你签发证书。DNS验证的原理就是让你在域名的DNS解析记录里添加一条特定内容的TXT记录这条记录的内容是证书签发机构提前生成的随机字符串。如果你用的是腾讯云DNSPod解析选择自动DNS验证后系统会在后台自动添加解析记录通常几十秒到几分钟内就能完成验证。如果用的是第三方DNS服务商系统会给你一条主机记录和记录值你需要去域名服务商的后台手动添加。比如在阿里云域名控制台找到“解析设置”添加一条类型为TXT的记录主机记录填系统给的类似_dnsauth的前缀记录值填那串随机字符。添加完记录后回到腾讯云控制台点击“验证”系统会去查询这条TXT记录是否匹配。TXT记录生效时间受DNS缓存影响一般几分钟内就能查到慢的话可能需要等待10到30分钟。如果验证失败不要死等先检查主机记录有没有填错、记录值有没有复制全这串字符常常很长很容易漏字符再就是确认DNS服务器同步是不是有延迟。2.3 提交申请到签发一般要多久验证通过后证书签发机构会自动签发证书。腾讯云免费证书的签发速度我个人体验下来非常快快的时候两三分钟慢的时候十几分钟基本不用等待人工审核。这点比一些国外证书服务商动辄半天一天的体验好太多。签发完成后证书会出现在SSL证书控制台的证书列表里状态显示为“已签发”。这时候就可以点击“下载”按钮选择对应的服务器类型下载证书文件了。下载下来的文件通常是一个压缩包里面包含证书文件.crt或.pem和私钥文件.key有些还会附带证书链文件chain.pem或ca_bundle.crt。这几个文件在配置的时候各有用途后面会说。2.4 下载证书时如何选择正确的文件腾讯云下载页面会让你选择服务器类型包括Nginx、Apache、Tomcat、IIS等。选错类型也不用担心其实证书内容是一样的只是文件组织方式和后缀不同。以最常见的Nginx为例下载压缩包里有三个关键文件example.com.pem证书文件、example.com.key私钥文件有些还会有一个fullchain.pem完整证书链。这里必须提醒一句私钥文件.key是非常敏感的东西相当于你这把锁的钥匙。任何人拿到私钥就能冒充你的网站所以私钥文件绝对不能公开、不能上传到公开仓库、不能发给别人。服务器上存放私钥和证书的目录建议设置严格的文件权限我一般用chmod 600处理私钥文件确保只有root用户能读取。3. 主流服务器的HTTPS配置实操3.1 Nginx配置现在最主流的方案Nginx是目前市场占有率最高的Web服务器腾讯云的很多云服务器镜像都默认装了Nginx。它的SSL配置非常简洁主要是修改站点配置文件。以CentOS系统为例站点配置通常在/etc/nginx/conf.d/目录下文件名一般是域名加.conf。先把下载好的证书文件上传到服务器我习惯放在/etc/nginx/ssl/目录下然后修改站点配置server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { root /usr/share/nginx/html; index index.html index.htm; } }几个关键点说明一下。listen 443 ssl是启用SSL监听的固定写法老版本Nginx可能写ssl on但新版本推荐直接在listen后面加ssl参数。ssl_certificate和ssl_certificate_key分别指向证书文件和私钥文件路径一定要确认正确记得用nginx -t测试配置语法。ssl_protocols这里我指定了TLSv1.2和TLSv1.3不建议再开TLSv1.0和TLSv1.1这两个老协议已经有严重的安全漏洞浏览器也早就禁止了。改完配置后执行nginx -s reload让配置生效注意是reload而不是restartreload能保证平滑重载不会中断正在处理的请求。配置生效后用https://example.com访问浏览器地址栏出现小锁头说明配置成功。如果出现“您的连接不是私密连接”的提示大概率是证书链没配好或者是证书和域名不匹配后面排查部分会详细说。3.2 Apache配置老牌服务器的常见写法Apache虽然在新项目中不像以前那么常见但还是有大量存量服务器在跑。配置Apache的SSL首先要确保安装了mod_ssl模块。在CentOS系统里可以执行yum install mod_sslUbuntu执行apt install apache2-mod-ssl具体包名以你的系统为准。安装完模块后修改虚拟主机配置。Apache的SSL配置和Nginx类似也有一个独立的443端口虚拟主机段VirtualHost *:443 ServerName example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/httpd/ssl/example.com.pem SSLCertificateKeyFile /etc/httpd/ssl/example.com.key SSLCertificateChainFile /etc/httpd/ssl/chain.pem Directory /var/www/html AllowOverride All /Directory /VirtualHost这里和Nginx最大的区别是多了SSLCertificateChainFile这一项。Apache会把证书链文件单独作为一个参数如果下载的压缩包里有chain.pem或ca_bundle.crt就把它配置进去。如果没有这个文件有些旧设备或部分客户端访问时会出现证书链不完整的问题。改完配置后建议先执行apachectl configtest检查语法再用systemctl reload httpd或apache2重载配置。Apache的配置报错往往比较直接但坑也不少最常见的就是443端口没在监听服务起不来。确认一下防火墙是否放通了443尤其是云服务器的安全组规则。3.3 Tomcat配置cer转pfx这个坑Tomcat在Java应用里非常常见它的SSL配置和其它Web服务器不太一样。Tomcat使用的是Java的Keystore密钥库机制不能直接使用.pem和.key文件需要先把它们转换成PKCS12格式的.pfx文件。用OpenSSL转换很简单在服务器上执行openssl pkcs12 -export -out server.pfx -inkey example.com.key -in example.com.pem -certfile chain.pem执行过程中会要求输入导出密码这个密码很重要一会儿配置Tomcat时会用到。如果不输入密码生成的pfx文件打开时会报错。转换完成后把server.pfx上传到Tomcat的conf目录下然后修改server.xml。在Tomcat 9及以上版本推荐用AprLifecycleListener或者直接用NIO连接器配置方式如下Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads150 SSLEnabledtrue SSLHostConfig Certificate certificateKeystoreFileconf/server.pfx certificateKeystoreTypePKCS12 certificateKeystorePassword你的密码 / /SSLHostConfig /Connector这里把certificateKeystoreType设置为PKCS12这是很多教程容易忽略的重点。默认的JKS格式要求你用keytool命令导入证书操作繁琐还容易出错直接用PKCS12格式就省掉中间环节。启动Tomcat后访问https://域名:8443看到Java服务正常响应就说明配置成功。如果你希望Tomcat直接监听443端口把port8443改成port443并确保没有其它进程占用443即可。另外记得如果Tomcat前面还有Nginx完全可以只在Nginx上配置SSL然后将请求以HTTP方式转发给后端的Tomcat这种“Nginx终结SSL”的架构更简单也更高效。3.4 IIS配置Windows环境下的导入流程腾讯云也有不少Windows服务器用户跑的当然是IIS。IIS的SSL证书导入相对图形化和Linux系列的命令行操作体验完全不同。优点是点几下鼠标就行缺点是一旦出了问题排查手段相对有限。双击下载好的.pfx证书文件IIS需要导入的是PKCS12格式的证书系统会弹出证书导入向导。存储位置选择“本地计算机”然后一路下一步输入pfx文件的导出密码最后选择“自动选择证书存储区”。导入完成后可以在“运行”输入certlm.msc打开本地计算机证书管理界面确认证书出现在“个人/证书”目录下。接下来打开IIS管理器选中你的站点在右侧操作栏点击“绑定”。添加一个类型为https的绑定端口443指定刚才导入的证书。这里有一个很容易踩的坑如果你在绑定列表里看不到导入的证书大概率是导入的时候选了“当前用户”而不是“本地计算机”重新导入一次选对存储位置就好了。配置完成后用https访问站点。如果发现浏览器报证书错误在IIS里检查证书和你的域名是否匹配。IIS 8以上版本支持SNI绑定多个证书但那是进阶玩法这里不展开。3.5 HTTP自动跳转到HTTPS证书配置完之后还有一个重要的小步骤把HTTP的访问请求自动跳转到HTTPS。否则用户手动输入http://example.com时还是会访问到80端口的明文站点体验不完整。Nginx的做法最简洁加一个80端口的server块全部301重定向server { listen 80; server_name example.com; return 301 https://$host$request_uri; }Apache可以在.htaccess或者虚拟主机里做RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R301]IIS可以在web.config里加rewrite规则。做完这一步整个HTTPS链路才算真正闭环。我个人的习惯是先配好HTTPS并测试通过最后再做跳转这样万一中间哪一步出问题不至于把自己锁在门外。4. 证书续期与常见问题排查4.1 免费证书一年要续几次怎么续腾讯云免费SSL证书的有效期是多少这个答案不固定早期是一年后来政策调整现在多数情况是90天。也就是说一年下来你至少要续4次。听起来麻烦但其实操作流程和首次申请几乎一样提交申请、DNS验证、等待签发、下载新证书、替换服务器上的旧证书。这里我强烈建议把证书的到期时间记到日历上或者直接设置到期前一个月的提醒。证书过期不是小问题一旦过期HTTPS站点会直接报错用户在浏览器里看到的是“您的连接不是私密连接”的大红警告页对网站信誉的伤害非常大。Linux服务器上可以用一条命令快速查看证书到期时间openssl x509 -in /etc/nginx/ssl/example.com.pem -noout -dates也可以远程检查线上域名这条命令不需要登录服务器就能看openssl s_client -connect example.com:443 -servername example.com 2/dev/null | openssl x509 -noout -dates我习惯把这行命令做成一个小的监控脚本配合cron定时任务每周跑一次到期前自动发邮件通知自己。效果非常好再也不用担心证书偷偷过期。4.2 常见问题速查表根据我自己的踩坑经历和帮朋友排查的经验整理了下面这份FAQ基本覆盖了90%的证书配置问题现象可能原因解决方法浏览器显示“您的连接不是私密连接”证书链不完整或证书过期检查证书是否在有效期内Nginx/Apache补充chain文件网站打不开提示拒绝连接443端口未放行检查云服务器安全组和系统防火墙放行443端口出现“证书不匹配”警告证书绑定的域名和访问域名不一致用https://证书绑定的域名访问或重新申请匹配域名的证书配置了证书但地址栏没有小锁头页面中引用了HTTP资源混合内容检查页面里的图片、JS、CSS链接统一改为HTTPS或相对路径申请证书时DNS验证一直失败TXT记录填写错误或未生效检查主机记录和记录值是否完整等待解析生效后重试Tomcat配置后启动报错keystore密码错误或格式不对确认pfx文件密码和server.xml中配置一致类型设为PKCS12证书刚续期但线上仍是旧证书服务器没有重载配置Nginx执行nginx -s reloadApache执行systemctl reload httpd4.3 混合内容问题最容易被忽略这里想单独拎出来说一个很常见但又很低调的问题混合内容Mixed Content。它的表现是HTTPS已经配置好了地址栏的锁头也在但是打开某个页面时锁头变成了灰色或者出现一个三角号感叹号。原因就是页面里引用了http://开头的资源比如图片、视频、CSS文件。浏览器出于安全策略会默认阻止HTTPS页面加载HTTP资源。解决办法很简单把页面中所有资源链接改成HTTPS或者在代码里直接用相对路径/images/logo.png让浏览器自动按当前协议去加载。很多建站系统后台有“强制HTTPS”或者“站点URL”设置改一下子就好了。排查时可以用浏览器的开发者工具F12打开Console面板浏览器会明确提示是哪条资源被拦截照单处理就行。4.4 SSL配置安全的几个加分项把HTTPS配通只是第一步配置完成后建议顺手做几个安全加固项。第一关闭旧版本TLS协议只保留TLSv1.2和TLSv1.3确保配置文件的ssl_protocols没有TLSv1和TLSv1.1。第二像Nginx可以加一段传输安全头add_header Strict-Transport-Security max-age31536000 always;也就是HSTS它告诉浏览器以后直接用HTTPS访问这个域名连HTTP请求都不用发既安全又能省一次跳转。第三如果使用了腾讯云的Web应用防火墙WAF等安全产品要确认开发和回源链路之间443端口的证书匹配正常避免安全产品接入后出现证书报错。这类问题排查起来比较绕但大部分时候把回源端口改为HTTP就可以解决证书只在边缘节点上做终结即可。结尾免费SSL证书这件事放在今天已经不是什么高门槛的技术活了。腾讯云整个申请流程压缩下来熟练的话五分钟就能拿到证书再花十分钟配置到服务器上一个HTTPS站点就算上线了。恰恰是这种“人人都能做”的事反而容易因为一些小坑让新手卡住。我自己也经历过DNS验证卡了半小时、Tomcat证书格式不对反复报错、证书过期导致用户投诉这种连环折腾所以更明白把每一步讲透的价值。最后再分享一个经验每次续期证书的时候顺手检查一下服务器上的配置文件看看证书链全不全、TLS版本是不是最新的、跳转规则还有没有生效。证书续期不只是换个文件那么简单它是你重新审查一遍网站安全状态的好机会。在这个攻击手段层出不穷的时代多一道加密就多一份安心。