一、前言

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 #删除包
  1. 安装Snap

    ​ 注:部分系统如Ubuntu 18.04及以上版本已预装snap,如需安装请参照https://snapcraft.io/docs/installing-snapd。

    1
    2
    3
    #如果不知道是否安装了snapd可以使用whereis命令查看
    whereis snap
    # 如果结果不为空,说明已安装
  2. 更新Snap到最新

    1
    2
    3
    #执行如下两条命令
    sudo snap install core
    sudo snap refresh core
  3. 移除先前安装的Certbot

    ​ 如果之前使用过apt、yum等包管理器安装过Certbot,则需要先将其卸载,以确保使用的是Snap安装的全新Certbot。

  4. 安装Certbot

    1
    2
    #使用如下命令安装certbot
    sudo snap install --classic certbot

3、使用Certbot

​ 参照:https://eff-certbot.readthedocs.io/en/stable/using.html

  1. 准备Certbot命令

    注:如果/snap/bin目录(snap安装后会自动将该目录写入PATH变量)下已经有certbot文件,则可以跳过下面创建符号链接的部分。

    1
    2
    #使用ln命令在/snap/bin目录下创建指向/usr/bin/certbot可执行文件的符号链接
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
  2. 运行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进行证明,有两种类型,httpdns,完成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的证书。

注:

  1. 多域名证书和泛域名证书的区别在于,前者必须在申请证书时列出所有域名,而后者不需要。

  2. 泛域名证书,如适用于*.examle.com的证书不能用于example.com。

  3. 泛域名证书申请时一般采用的challenge类型为dns。

4、证书管理

​ 获取到的证书通常保存在**/etc/letsencrypt/live/$domain文件夹中,其中$domian是证书的名字(一般是网站域名,但也可以在获取证书时指定证书名),该文件夹一般保存着privkey.pemfullchain.pem两个文件(部分情况下会有cert.pemchain.pem**,但并不常见)。

证书管理一般包括以下内容:

  • 证书的创建:重新获取证书。
  • 证书的更新:证书具有一定有效期,需要在过期前更新证书以继续使用。
  • 证书的撤回:撤销(Revoke)一个证书,使其变为无效,一般在私钥泄露等情况下使用。
  • 证书的删除:删除已有的证书,在此之前一般要修改Web服务器的配置文件。

​ 证书的更新可以由插件自动完成,也可以手动完成,其实质都是设置定时器,定期执行证书更新命令。

​ 手动设置证书更新参见:https://eff-certbot.readthedocs.io/en/stable/using.html#setting-up-automated-renewal。

5、常用命令

1
2
3
4
5
6
#如无特别说明,以下命令使用时均需具有sudo权限
#管理证书
certbot certificates #查看所有证书
certbot delete --certname $name #删除指定的证书,其中$name是证书名
#管理ACME账户
certbot show_account #查看账户信息