各种使用免费 ssl 证书的姿势

2020/4/11 安装配置

不管从哪方面来看,都能看到浏览器支持 https 的协议的决心是愈发坚定的,从最初的 https 协议显示绿色小锁图标来表示更安全到现在非 https 直接提示不安全,不管是从网站的安全还是体验的优化上看部署 https 都是必要且紧急的。https 从刚出现的时候可能还有各种抵触,但随着部分平台强制要求以及 SEO 优势等诸多措施实施之后,从以前寥寥几个 https 变成现在想找个正儿八经的 http 网站都很难。

当前通过 Chrome 访问 https 网站会显示一个小锁图标,点击小锁图标会提示用户当前连接是安全,可以放心输入各种信息。

image.png

Chrome 访问 http 网站会提示不安全,点击不安全就会说连接不安全,不要输入任何敏感信息,看到这个用户输入个密码都还要考虑一下。

image.png

# 获取 SSL 证书

网站要上 https 的第一步就是先获取一个 SSL 证书,然后再部署到服务器上,配置成功后通过 https:// 访问即可。

SSL 证书由浏览器中受信任的根证书颁发机构在验证服务器身份后颁发,具有网站身份验证和加密传输双重功能。理论上,我们自己也可以手动制作一个 SSL 安全证书,但是我们自己签发的安全证书并不会被浏览器所信任,只有被信任的证书授权中心(CA)签发的安全证书才会被浏览器所信任。正常情况下去服务商获取 SSL 证书服务都需要付费,并且价格还不便宜(价位从几千到几万都有)。

2013 年 5 月由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等组织人员发起了一个叫 ISRG (opens new window)(Internet Security Research Group)的公益组织,这个组织从 2015 年开始推出了 Let’s Encrypt (opens new window) 作为 CA 提供免费证书,可以通过 快速入门 (opens new window) 了解怎么快速获取证书。

# Certbot 获取免费证书

Certbot 支持多种方式进行安装,可以在 Get Certbot (opens new window) 获取到各自情况下的安装方式以及常见问题的提示。通过 certbot (opens new window) 可以获取几种常见情况下怎么配置 SSL 证书,选择服务器所使用的软件和系统环境,然后就会显示对应版本的安装方法。

ssl-certbot-1.png ssl-certbot-2.png

获取免费的 SSL 证书之前需要先配置好 80 端口的 http 服务可以正常访问。以 Nginx + Ubuntu16 获取单域名的 SSL 证书为例:

# 添加Certbot的PPA
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

# 安装Certbot
sudo apt-get install certbot python-certbot-nginx

# 只是获取证书
sudo certbot certonly --nginx

# 获取证书并自动安装
sudo certbot --nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

获取证书的过程中需要输入邮箱,然后会自动读取 nginx 的配置文件,如果配置了多个会让选择针对哪个生效或者全部生效。生成的证书相关的文件都在 /etc/letsencrypt/live/$domain 里面,其中 privkey.pem 是证书的私钥,fullchain.pem 是包含了全部的证书。如果选择 http 重定向到 https,配置完成后直接刷新一下页面即可,否则需要把 http 改成 https 进行访问,如果可以访问则代表配置成功。

配置成功之后会自动修改 nginx 的配置文件,然后重启 nginx 服务,不需要手动处理。

ssl-certbot-4.png

配置成功后访问 https 的网址,点击小锁图标可以看到证书相关的信息。

ssl-certbot-3.png

一些常用命令

# 查看证书
sudo certbot certificates
1
2

可以通过 certbot --help 查看命令或者在 全部命令参数 (opens new window) 查看。

# Certbot-Auto

wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto
/usr/local/bin/certbot-auto --help
1
2
3
4
5

certbot-auto 实际上是对 certbot 命令的一层包装,支持 certbot 的全部参数。

# docker 获取

可以通过 docker 获取证书,然后手动安装。

sudo docker run -it --rm --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
            certbot/certbot certonly
1
2
3
4

# 获取通配符型证书

如果有很多二级域名都要配置 SSL 证书,那么每个都单独处理就比较麻烦了,完全可以申请一个通配符型的证书来处理所有的子域名。

# 手动配置
certbot certonly --manual --preferred-challenges=dns -d *.abc.com -d abc.com
1
2

可能需要手动设置 Let’s Encrypt’s ACMEv2 服务器的地址,加上参数 --server https://acme-v02.api.letsencrypt.org/directory 即可。

执行这个命令后,会生成一条 TXT 记录的名称为 _acme-challenge 和 Value 值,需要在域名解析的地方加上这个配置。检测通过之后就会成功生成证书,证书存放在 /etc/letsencrypt/live/abc.com/ 里。

# 更新证书

默认生成的证书有效期都是三个月,但是可以无限续签,在过期前会有邮件通知,可以通过 renew 命令进行续订

# 续订
sudo certbot renew
1
2

# 通过一些网站获取

如果还是觉得上面通过命令行申请证书比较麻烦不好操作,那么可以通过一些网站进行申请。freessl (opens new window) 是一个提供免费 HTTPS 证书申请的网站,个人觉得这个网站不错。可以注册双域名一年有效期的亚洲诚信和多域名通配符三个月有效期的 Let’s Encrypt 的两种免费证书。

SSL FOR FREE (opens new window)又拍云 (opens new window)便宜 SSL (opens new window) 等一些商家也都有提供免费的的 SSL 证书。诸如 阿里云 (opens new window) 等云服务提供商也都有免费证书可以申请,如果域名是在云服务商建议优先使用其提供的证书。

申请免费 SSL 证书一般步骤都类似,以 freessl 演示怎么申请:

  1. 首先填写需要申请 SSL 证书的域名,不同的证书填写的规则略有区别。

ssl-web-1.png

  1. 选择验证方式,SSL 证书都是要验证你对这个域名拥有所有权,严格的付费证书还有人工验证环节。这边选择 DNS 进行验证。

ssl-web-2.png

  1. 获取验证信息

ssl-web-3.png

  1. 进行验证。进入域名解析的控制台,新增一条 TXT 记录填入上一步获取到的信息。配置成功之后点击验证,验证成功之后就会显示证书信息,可以下载到本地保存。

# 关于各种证书

# 自签名证书

除了免费的 SSL 证书之外,还有一种自签名的证书。自签名证书签发很方便,但是使用起来确实很麻烦,除了浏览器会弹出不安全的提示外还有一些安全方面的问题。自签证书容易被假冒和伪造,而被欺诈网站所利用;容易受到 SSL 中间人攻击;自签证书没有可访问的吊销列表;自签证书证书有效期太长,有效期越长就越有可能被黑客破解。

ssl-1.png

Chrome 下访问会首先提示不安全,不过可以通过高级选项强行访问,不过即使能进去还是会提示不安全,样式上起来比 http 还不安全。

ssl-2.png

除了 Chrome 外,其他浏览器的表现也都大同小异。甚至于 IE 在某些情况下即使手动选择信任都存在问题。

image.png

# 相比较付费 SSL 证书

免费 SSL 证书只有域名型(DV)证书,仅用于提供基本级别的身份验证,仅适合个人类网站。而付费的 SSL 证书则有组织验证(OV)和扩展验证(EV)证书,验证级别较高,相应的安全等级也较高,对于安全需求较高的网站来说更适合。免费证书仅适用于个人网站业务或测试用户,建议商业化的网站或企业、机构等网站使用收费证书。即便要使用免费证书建议尽可能使用云服务商提供的免费证书或者直接使用 certbot 申请。

# 参考