如何申请免费的HTTPS证书(网站免费证书申请)
今天,如果你要运营一个网站,那HTTPS已经是必不可少的了. 现在,如果仍然使用HTTP,会面临一些障碍,包括但不限于:
- 部分浏览器会将HTTP视为不安全的,给以警示甚至是阻止
- 移动开发中(苹果)已默认禁止HTTP请求
- HTTP网站容易被劫持并植入广告,非常影响体验
因而,给你的网站加上HTTPS是非常有必要的. 我个人的网站,都一律只支持HTTPS
但是一直以来,影响HTTPS普及的最大问题主要是HTTPS证书需要付费. 如果你知道有完全免费的HTTPS的证书,会不会更积极的使用HTTP?
今天我就简单讲下如何申请免费的HTTPS证书
1. 免费?
是的,有一些商业组织及非赢利组织允许申请免费的HTTPS证书.最著名的包括:
- Let's Encrypt: 非赢利组织,目的就是为了普及HTTPS
- ZeroSSL: 一个提供HTTPS证书服务的商业组织,其提供的服务中包含免费版本
并且,上述涉及到的无论是Let's Encrypt还是ZeroSSL,都支持通配符HTTPS证书申请, 比我以*.taoofcoding.tech来申请,这样一个证书适合任意二级域名,非常方便实用.
因而,如果不是对HTTPS证书级别要求非常高的需求,比如支付网站,包括你个人网站在内的大部分完全可以考虑申请这样的HTTPS免费证书
当然免费的HTTPS有一些限制, 上述免费HTTPS限制主要是每次申请的证书的有效期只有90天(可无限续期),不过这个问题容易解决,很多开源的工具都支持自动续期。
2. 如何申请
当然,上述所说的无论是Let's Encrypt还是ZeroSSL免费证书,你都可以访问其官网,按照它的文档步骤进行申请.
不过按照官网的做法,申请下来并不是非常方便和简单
好在,互联网上永远有优秀的人提供优秀的工具与服务,acme.sh就是这么一个工具.它是专门简化申请免费HTTPS证书的.
acme.sh的特点是:
- 简化申请流程,在SHELL上就直接完成申请
- 支持包括Let's Encrypt以及ZeroSSL等多个HTTPS提供商
- 支持以DNS API以及Nginx或Standalone等不同方式来申请
- 支持自动续期 (基于Linux的crontab机制)
因此,使用acme.sh是最方便的申请HTTPS证书的方式之一.
3. 申请步骤
接下来详细的阐述下如何申请免费的HTTPS证书
前提
你需要有一个注册及购买一个能自己管理的域名,同时能SHELL到服务器上(因为acme.sh是以shell方式申请)
安装acme.sh
# 执行以下命令
wget -O - https://get.acme.sh | sh -s email=lingen.liu@gmail.com
email改为你自己的邮箱
申请DNSPOD或Cloudfalre的API KEY
acme.sh支持非常多的申请方式,这篇文章中,我选择DNS API的方式,我个人认为它最简单
因为是使用DNS API的方式,所以我们要申请DNS服务提供的API KEY,这里我以国内最著名的DNSPOD以及国外的Cloudflare来简单说明下
DNSPOD申请API KEY*
- 进入DNSPOD管理控制台
- 个人头像 -- API密钥 --DNSPod Token
- 新建密钥
export DP_Id="******"
export DP_Key="******"
Cloudflare申请API KEY
- 进入Cloudflare管理后台
- 进入My Profile -- API TOKENS
- 新建Global Key
export CF_Key="abcdefg"
export CF_Email="lingen.liu@gmail.com"
其它DNS服务提供商到acme.sh文档上查阅,步骤大都非常类似
切换HTTPS证书提供商
如前所述, acme.sh支持多个不同的HTTPS服务提供商,包括Let's Encrypt以及ZeroSSL, 它默认使用的是ZeroSSL
我更喜欢Let's Encrypt,它是一个非赢利组织,纯粹为普及HTTPS,而且它的证书更普遍及通用
# 用这个命令来切换HTTPS证书提供商
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
# 切换到zerossl
~/.acme.sh/acme.sh --set-default-ca --server zerossl
申请HTTPS证书
申请了DNS服务商的相关KEY并export之后,就可以直接通过acme来申请相关的HTTPS证书了
# 注意不同DNS商的 --dns 值不同,不能搞混
# 如果是Cloudflare申请
~/.acme.sh/acme.sh --issue --dns dns_cf -d taoofcoding.tech -d *.taoofcoding.tech
# 如果是DNDPOD申请
~/.acme.sh/acme.sh --issue --dns dns_dp -d taoofcoding.tech -d *.taoofcoding.tech
稍微解释下这个命令
- --dns dns_dp: 以dns的方式,并且指定使用DnsPod来进行申请
- -d taoofcoding.tech: 指定申请的域名,同一个证书可以指定多个,*.taoofcoding.tech是通配符方式,指定此网站下的所有二级域名
一切顺利的情况下,最后会输出生成的证书的相关信息
[Mon 30 Jan 2023 01:09:22 PM HKT] Your cert is in: /home/lingen/.acme.sh/taoofcoding.tech_ecc/taoofcoding.tech.cer
[Mon 30 Jan 2023 01:09:22 PM HKT] Your cert key is in: /home/lingen/.acme.sh/taoofcoding.tech_ecc/taoofcoding.tech.key
[Mon 30 Jan 2023 01:09:22 PM HKT] The intermediate CA cert is in: /home/lingen/.acme.sh/taoofcoding.tech_ecc/ca.cer
[Mon 30 Jan 2023 01:09:22 PM HKT] And the full chain certs is there: /home/lingen/.acme.sh/taoofcoding.tech_ecc/fullchain.cer
4. 配置使用HTTPS证书
配置使用HTTPS
server
{
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /home/lingen/.acme.sh/taoofcoding.tech_ecc/fullchain.cer;
ssl_certificate_key /home/lingen/.acme.sh/taoofcoding.tech_ecc/taoofcoding.tech.key;
root /usr/share/nginx/taoofcode_tech;
index index.html index.htm index.nginx-debian.html;
server_name www.taoofcoding.tech taoofcoding.tech;
}
如果你希望你的网站只支持HTTPS,不允许使用HTTP访问,那也比较简单,在nginx中加入以下配置
server {
listen 80 ;
server_name www.taoofcoding.tech taoofcoding.tech;
return 301 https://$host$request_uri;
}
这样当访问HTTP时,会自动跳转到HTTPS
5 续期
需要注意的是,申请到的HTTPS证书只有90天有效期。需要在有效期到期前续期。
如果是用我在这篇文章中的acme.sh申请的,它会基于Linux的crontab自动续期,无需你担心。
你也可以使用以下命令renew的你的证书
~/.acme.sh/acme.sh --issue --dns dns_dp -d taoofcoding.tech -d *.taoofcoding.tech --force
就是在申请的命令之上,添加--force参数就可以了。
如果你想要查询本机上申请了哪些证书,到期时间及下次自动续期时间等。使用~/.acme.sh/acme.sh list就可以了。
终
需要说明的是,除了DNS API申请HTTPS以外, acme.sh还支持Nginx mode,Standalone mode,Webroot mode等不同方式,适合不同的情况 (比如你没有DNSPOD的管理权限,无法获取KEY等)
总而言之,在今天的互联网,给你的网站加上HTTPS,已经是非常简单并且成本极低的事情了.
你应该毫不犹豫的给你的网站加上HTTPS,还在等什么呢,立刻行动起来!