本帖最后由 小蜀哥哥 于 2019-7-3 13:44 编辑
通过 Lego 工具获取 HTTPS 证书
前言
HTTP/2 已经开始进入大规模普及阶段,过去的纯 HTTP 在流行的现代浏览器已经红色标出“不安全”。由于 HTTP 传输是不会对数据进行加密的,金融类、支付类等涉及财产相关的网站已经率先采用 HTTPS 作为安全传输协议。随着这波“不安全”的热潮,很多知名网站也都替换为 HTTPS 协议了。如果,自己是一名站长,为了用户和网站的安全,肯定需要将自己的网站升级为 HTTPS 甚至将 Web 服务器配置为 HTTP/2 满足大数量请求(HTTP/2 是一个并发的安全传输协议,在 HTTP/1.1 的 HTTPS 过渡期存在过很多仅支持 SPDY 协议的浏览器)。
获取途径
HTTPS 的证书获取途径有很多,最常见的就是当你在域名服务商租用了域名之后,会提供一个配置证书的功能。这里的证书有很多种,有免费的单一域名 DV 级、多域名 DV 级、通配符 DV 级、企业 OV 级、企业增强 EV 级。
DV 级有免费和收费,一般在域名服务商免费只能获取到单一域名或者15个限制的二级域名,收费的在 100 以内。
OV 级用于企业,支持更高的加密强度和有效时长,OV 级提供的专业版本还支持 ECC 椭圆曲线公私钥加密,提供更快更安全的数据请求和传输;
EV 级同样用于企业,但是在辨识上做了企业名称的提示,会在浏览器地址栏查看到企业名称或者组织名称。同样,专业版提供 ECC 椭圆曲线公私钥加密,但是价格非常昂贵。
除了通过域名服务器获取,还可以通过专业的 CA 证书机构购买获得颁发,比如:TrustAsia、Symantec、COMODO 等等。但是,价格是惊人的贵,主要是这类证书在被攻破后,会有丰厚的赔偿。
当然,这个世界不是一定要靠钱来解决任何事情,通过免费的途径一样可以获得加密强度高,甚至 ECC 椭圆曲线公私钥加密的证书。
那就是:Let’s Encrypt,ACME 为获取证书提供 API。
通过 TXT 记录和 DNS 服务器进行验证获取
Let’s Encrypt 的证书验证方式有很多种,比如 HTTP 服务器内容验证,这种方式需要先有 HTTP 服务器,并且可以自己存放文件,操作相对比较麻烦;还有其它比较复杂的方式,在国内网络环境一般也不好实现。
所以,DNS 服务器进行域名记录验证,就是最方便的确认域名所有者的方式,而且,通过手工配置 DNS,可以很方便的避免网络环境复杂性的问题。
话不多说,开始操作。
下载 Lego 工具
Lego 是一个基于 Let’s Encrypt 官方 ACME v2/v1 API 封装的一个工具,基于 Go 语言编写,在任何平台上都能快速获取证书。
进入 Github 的发布区:
[Shell] 纯文本查看 复制代码 https://github.com/go-acme/lego/releases
找到你需要的目标系统的版本,比如:
[Shell] 纯文本查看 复制代码 # lego_v2.6.0_windows_amd64.zip
[url=https://github.com/go-acme/lego/releases/download/v2.6.0/lego_v2.6.0_windows_amd64.zip]https://github.com/go-acme/lego/ ... 0_windows_amd64.zip[/url]
下载后解压到任意文件夹。
开始获取证书
解压后获得到:lego.exe,其它系统为可执行的 lego 文件,可以通过终端执行。
获取帮助信息:
[Shell] 纯文本查看 复制代码 lego -h # 直接执行 lego 也是输出帮助信息
首次执行,会在当前路径产生一个 .lego 文件夹来存放认证和证书,不同系统可能会在用户目录下。
所需要的参数:
[Shell] 纯文本查看 复制代码 -d # 你需要颁发证书的域名,可以多个二级域名,也可以通配符域名。多个域名请采用多次提供这个参数。
-m # 你的域名所有者邮箱,用来标识域名的拥有着权限,会在某些情况收到 Let’s Encrypt 官方的消息。
-k # 设定加密算法,最新默认支持 ECC 椭圆曲线。
--dns # DNS 提供商,手动模式:manual,或者 dnshelp 得到预定义提供商。
--dns.resolvers # 解析服务器,推荐直接采用域名服务商的 DNS 进行验证。
例子 1,获取单二级域名 www 开头(RSA2048 加密):
[Shell] 纯文本查看 复制代码 lego -d [url=www.domian.com]www.domian.com[/url] -m [url=mailto:abc@domain.com]abc@domain.com[/url] -k rsa2048 --dns manual --dns.resolvers dns1.aliyun.com
执行之后,在 .lego 目录下的 certificates 子目录下就会看到4个文件:
[Shell] 纯文本查看 复制代码 www.domian.com.crt # 证书文件,也就是公钥。
[url=http://www.domian.com.issuer.crt]www.domian.com.issuer.crt[/url]
[url=http://www.domian.com.json]www.domian.com.json[/url]
[url=http://www.domian.com.key]www.domian.com.key[/url]# 私钥文件,只在服务器上用于解密。
如果你想要更多的二级域名,直接增加 -d xxx. 开头即可。
例子 2,获取通配符域名 * 证书,且支持一级域名(RSA8192 加密):
[Shell] 纯文本查看 复制代码 lego -d *.domian.com -d domian.com -m [url=mailto:abc@domain.com]abc@domain.com[/url] -k rsa8192 --dns manual --dns.resolvers dns1.aliyun.com
执行之后得到的文件:
[Shell] 纯文本查看 复制代码 _.domian.com.crt # 证书文件,也就是公钥。
_.domian.com.issuer.crt
_.domian.com.json
_.domian.com.key # 私钥文件,只在服务器上用于解密。
不过,非特殊情况,不要使用 RSA8192,客户端计算机不一定都是高性能,而且加密时间过长,就算 HTTP/2 也会严重影响网页请求,影响加载体验。
例子 3,避免察觉通配符域名证书,且支持一级域名(ECC 加密):
要点:交换 2 个 -d 参数的顺序,不提供 -k 参数,也可以指定 ec256,速度很快。
[Shell] 纯文本查看 复制代码 lego -d domian.com -d *.domian.com -m [url=mailto:abc@domain.com]abc@domain.com[/url] --dns manual --dns.resolvers dns1.aliyun.com
执行之后得到的文件:
[Shell] 纯文本查看 复制代码 domian.com.crt # 证书文件,也就是公钥。
domian.com.issuer.crt
domian.com.json
domian.com.key # 私钥文件,只在服务器上用于解密。
这样得到的证书和例子 2 其实是一样的效果,只是别人看不到你的域名颁发的二级上的 *. 开头信息,显得更简洁。
总结
当然 ACME 提供的工具有很多,比如还有 Python 工具,但是相对复杂。
有需要的朋友,可以将自己的网站升级到 HTTPS 甚至服务器配置成 HTTP/2 提高性能。
现在的 ECC 椭圆曲线也在慢慢普及开来,一般来说,ECC 能提高请求速度 2.5X 如果用 ec256 的长度,可以提高到 4X 于传统 HTTPS。
|