如何安装免费SSL证书 Let's Encrypt

SSL证书选择有很多,其中有很多免费的方案可供选择,免费SSL证书中普遍认为Let's Encrypt做的还不错,下面大概简单介绍一下Let's Encrypt的安装和使用,安装环境为自有主机权限,系统为CentOS Stream release 8

Let's Encrypt简介

Let's Encrypt 是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行。 它是一项由 Internet Security Research Group (ISRG) 提供的服务。

Let’s Encrypt的关键原则为:

  • 免费: 任何拥有域名的人都可以使用 Let’s Encrypt 免费获取受信的证书。
  • 自动化: 运行于服务器上的软件可以与 Let’s Encrypt 直接交互,以便轻松获取证书,安全地配置它,并自动进行续期。
  • 安全: Let’s Encrypt 将成为一个推动 TLS 安全最佳实践发展的的平台,无论是作为一个证书颁发机构(CA)还是通过帮助网站运营商正确地保护其服务器。
  • 透明: 所有颁发或吊销的证书将被公开记录,供任何人查阅。
  • 开放: 自动签发和续订协议 已经发布 作为其他人可以采用的开放标准。
  • 乐于合作: 就像互联网底层协议本身一样,Let’s Encrypt 是为了让整个互联网社区受益而做出的共同努力,它不受任何单一组织的控制。

以上信息来自Let’s Encrypt的官网 https://letsencrypt.org/

使用Certbot客户端安装SSL证书

安装Certbot

Certbot是官方推荐的一个ACME客户端,用于SSL证书的生成和更新。以CentOS Stream release 8为例,我们需要更新安装源以便通过dnf包管理来安装Cerbot

dnf install epel-release -y
dnf install certbot -y

获取SSL证书

在安装证书时,你要确认你是否有修改网站根目录的权限,因为Certbot在安装SSL证书时需要在网站根目录下下临时生成一个.well-known/acme-challenge的文件来验证域名的所有权,如果你没有修改网站根目录的权限,那就需要通过另外一种模式来验证(参考官网,本文不做说明)。

通过Certbot生产SSL证书

certbot certonly --webroot -w /DATA/www/yoursite/public/ -d yoursite.com
  • --webroot 通过验证网站根目录验证文件的方式证明域名所有权
  • -w 网站根目录位置,每个网站的根目录不一样,请填写你自己网站根目录的位置
  • -d 需要生成证书的域名,根据需要填写你自己的域名

根据命令提示,顺利的话就可以生产SSL证书了,SSL证书生成后一般会存放在 /etc/letsencrypt/live/目录下

某些网站没有开放根目录怎么办?

我的个人网站目前用的是Ghost,Ghost并没有直接开放对根目录的操作,所以我们需要在Nginx访问层做一些特殊配置。假设我们设置Ghost下的public目录为对外可访问的根目录,需要外界可以访问到/.well-known/这个目录,我们可以指定特定规则,Nginx配置如下

    location ~ /.well-known {
        allow all;
        root /DATA/www/ghost/content/static/;
    }

SSL证书更新

从letsencrypt获取的SSL证书,默认有效期为90天,这个时间要特别注意,为了保证网站正常使用,我们还要定期去更新SSL证书,Certbot 也提供了相关命令,我们可以把它写入到cron里,以免忘记,建议每两个月自动执行一下更新命令就好
更新命令测试,可以检测自动更新是否可以正常运行

certbot renew --dry-run

如果没有问题,就可以去掉 --dry-run 直接执行certbot renew做证书更新。

certbot renew

证书更新完成后,需要Nginx reload一下,这样在Web前端查看的证书日期就是最新的了。

service nginx reload

配置Nginx支持SSL

举个实际配置例子,看一下

# 这个配置是为了让访问http协议的请求自动跳转至https
server {
    listen       80;
    server_name  www.yoursite.com;
    return       302 https://www.yoursite.net$request_uri;
}

server {
    #本例子开启了http2协议,这个不是必须的,可根据实际需要自行删改
    listen       443 ssl http2;
    server_name  www.yoursite.com
    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.yoursite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.yoursite.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3100;
        proxy_set_header Host $host:443;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Via "nginx";

    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
 

重启Nginx服务后,再访问你的网站就可以支持https了。

关于防火墙配置

Https协议使用的是443端口,所以还要额外确认你的系统中防火墙是允许访问443端口。

查询防火墙是否开放443端口

firewall-cmd --query-port=443/tcp

防火墙开放443端口

firewall-cmd --zone=public --add-port=443/tcp --permanent

重启防火墙服务配置生效

systemctl restart firewalld

参考文章
https://diamondfsd.com/lets-encrytp-hand-https/
https://techglimpse.com/install-certbot-centos-stream-8-lets-encrypt/