通过LetsEncrypt申请免费SSL证书
一、前言
1、介绍
要在网站上启用HTTPS安全访问,需要从证书颁发机构(CA)获取证书。Let’s Encrypt是一个提供免费证书的机构,只要能证明对域名具有所有权即可获取证书。证明域名所有权通常使用Web主机上运行的ACME协议客户端,而Certbot是该证书机构推荐使用的一款客户端工具。
Let’s Encrypt官网:https://letsencrypt.org
Certbot官网:https://certbot.eff.org
Certbot官方教程:https://certbot.eff.org/instructions ,在选择使用的Web服务器和运行的Linux系统后会出现相应的使用教程。本文操作环境为Ubuntu Server 22.04 LTS 64bit和Nginx 1.18.0,请结合实际情况做出调整。
2、前提条件
- 对域名具有所有权
- 可以使用SSH访问域名对应的Web主机(具有命令行访问权限)
二、安装证书
1、登录Web主机
使用SSH登录Web主机,登录用户需要具有sudo权限。
2、安装Certbot
注:官方推荐使用Snap安装Certbot,本文也采用这种方式,若使用其他方法安装请参照https://eff-certbot.readthedocs.io/en/stable/install.html完成。
1
2
3
4
5
6 >#Snap是一个包管理工具,类似于apt
>#Snap的部分命令,$name代表指定包的名称,可通过snap help查看帮助信息
>snap list #列出已安装的所有包
>snap find $name #从远程仓库中查找包
>snap install $name #安装包
>snap remove $name #删除包
安装Snap
注:部分系统如Ubuntu 18.04及以上版本已预装snap,如需安装请参照https://snapcraft.io/docs/installing-snapd。
1
2
3#如果不知道是否安装了snapd可以使用whereis命令查看
whereis snap
# 如果结果不为空,说明已安装更新Snap到最新
1
2
3#执行如下两条命令
sudo snap install core
sudo snap refresh core移除先前安装的Certbot
如果之前使用过apt、yum等包管理器安装过Certbot,则需要先将其卸载,以确保使用的是Snap安装的全新Certbot。
安装Certbot
1
2#使用如下命令安装certbot
sudo snap install --classic certbot
3、使用Certbot
参照:https://eff-certbot.readthedocs.io/en/stable/using.html
准备Certbot命令
注:如果/snap/bin目录(snap安装后会自动将该目录写入PATH变量)下已经有certbot文件,则可以跳过下面创建符号链接的部分。
1
2#使用ln命令在/snap/bin目录下创建指向/usr/bin/certbot可执行文件的符号链接
sudo ln -s /snap/bin/certbot /usr/bin/certbot运行Certbot
注:执行Certbot命令时可能会要求创建ACME账户,按照说明进行操作即可。
全自动运行
获取证书,修改nginx配置文件,证书自动续期,一行命令即可完成。
1
2
3
4#此方法会修改nginx配置文件以启用HTTPS,建议使用cp命令提前备份以备不时之需
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
#运行Certbot命令,实质上是运行sudo certbot run命令,--nginx指定用于获取和安装证书的插件,也可以在命令最后加上-d $domain 指定要获取和安装证书的域名,手动运行类似
sudo certbot --nginx手动运行
仅获取证书,不会修改nginx配置文件,需要自行配置。
1
2#运行Certbot命令,仅获取证书,--nginx指定用于获取证书的插件
sudo certbot certonly --nginx
三、概念理解及常用命令
1、证明域名所有权
规范中要求使用Challenge进行证明,有两种类型,http和dns,完成Challenge即可证明你对域名的所有权,进而申请证书。前者需要在Web主机的根目录下放置一个可以公网访问的文件,后者需要添加一条域名解析记录。
两种Challenge的详细说明参考网址:
2、插件
证书的获取和安装一般通过插件实现,有些插件同时具有证书获取和安装的功能,有些却只具备一种功能。插件按来源可分为内置插件和第三方插件,其中后者由第三方开发者开发,大多数是针对某个具体的云服务/DNS解析提供商。插件可以单独使用,也可以组合使用(即一个用于获取证书,一个用于安装证书)。证书获取插件的功能是在完成Challenge之后将证书下载到Web主机中,而证书安装插件的功能是修改Web服务器的配置文件以应用证书(例如指定所获取证书的路径)。证书的安装可以手动完成,前提是要掌握Web服务器配置的方法。常用的Web服务器Apache和Nginx都有对应的插件,且能同时完成证书获取和安装的功能。
插件的详细介绍参照:https://eff-certbot.readthedocs.io/en/stable/using.html#getting-certificates-and-choosing-plugins。
3、证书类型
证书按照类型分为以下三种:
- 单域名证书:只针对一个域名生效,如适用于www.example.com的证书。
- 多域名证书:针对多个域名生效,如同时适用于www.example.com和 mail.example.com 的证书。
- 泛域名证书:针对多个子域名同时生效,如适用于*.example.com的证书。
注:
多域名证书和泛域名证书的区别在于,前者必须在申请证书时列出所有域名,而后者不需要。
泛域名证书,如适用于*.examle.com的证书不能用于example.com。
泛域名证书申请时一般采用的challenge类型为dns。
4、证书管理
获取到的证书通常保存在**/etc/letsencrypt/live/$domain文件夹中,其中$domian是证书的名字(一般是网站域名,但也可以在获取证书时指定证书名),该文件夹一般保存着privkey.pem、fullchain.pem两个文件(部分情况下会有cert.pem和chain.pem**,但并不常见)。
证书管理一般包括以下内容:
- 证书的创建:重新获取证书。
- 证书的更新:证书具有一定有效期,需要在过期前更新证书以继续使用。
- 证书的撤回:撤销(Revoke)一个证书,使其变为无效,一般在私钥泄露等情况下使用。
- 证书的删除:删除已有的证书,在此之前一般要修改Web服务器的配置文件。
证书的更新可以由插件自动完成,也可以手动完成,其实质都是设置定时器,定期执行证书更新命令。
手动设置证书更新参见:https://eff-certbot.readthedocs.io/en/stable/using.html#setting-up-automated-renewal。
5、常用命令
1 | #如无特别说明,以下命令使用时均需具有sudo权限 |