介绍

Let’s Encrypt 是国外的一个公共的免费的 SSL 项目,由 Linux 基金会托管,由 Mozilla、思科、AKamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便互联网 http 过渡到 https。

准备

  1. 服务器
  2. 域名
  3. 能理解的大脑

安装 acme.sh

Let’s Encrypt官网:https://letsencrypt.org

由于官方文档使用流程很复杂,不适合大部分人使用,为了简化流程,这里使用脚本实现

GitHub:https://github.com/acmesh-official/acme.sh

进入到你的服务器,执行命令:

1
curl  https://get.acme.sh | sh

普通用户root用户都可以安装使用,安装脚本其实是进行了如下操作:

  1. 会把 acme.sh 安装到你所执行命令用户的用户目录下:~/.acme.sh/
  2. 会创建 bash 的 alias,方便你的使用:alias acme.sh=~/.acme.sh/acme.sh。
  3. 会自动为你创建 cronjob 脚本,每天零点自动检测所有的证书,如果某证书快过期需要更新,则会自动更新该证书。

安装过程不会污染已有的系统任何功能和文件,所有后续的修改都将限制在安装目录中:~/.acme.sh/

验证域名并生成证书

acme.sh 实现了 acme 协议支持的所有验证协议,通常一般有几种方式验证域名:HTTP文件验证 和 DNS验证 等,具体验证方式可查阅github文档

方式一:HTTP文件验证(不推荐)

1
acme.sh --issue -d congm.in -d *.congm.in -w /home/webroot

注意:对于通配符证书需要加-d 域名 -d *.域名两个参数-w即webroot,为该域名通过http所访问到的本地目录上面这段过程将会在/home/webroot创建一个 .well-known 的文件夹,同时 Let’s Encrypt 将会通过你要注册的域名去访问那个文件来确定权限,它可能会去访问 http://congm.in/.well-known 这个路径,验证成功会自动清理。

方式二:DNS-API验证(推荐)

通过DNS服务器提供 Keysecret 实现自动验证,详情看DNS API

例如,在阿里云解析的域名,请前往阿里云官网查看具体创建方法。控制台中申请子账号 API Token 并执行命令:

1
2
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
1
2
acme.sh --issue -d congm.in -d *.congm.in --dns dns_ali
acme.sh --issue --dns dns_ali -d example.com -d www.example.com

其他域名解析平台具体执行命令参考dnsapi

注意:对于通配符证书需要加 -d 域名 -d *.域名 两个参数Ali_Key 和 Ali_Secret 将会保存在 ~/.acme.sh/account.conf 执行上述命令后,证书文件将会自动申请被存放在 ~/.acme.sh/对应的域名文件夹中,如:~/.acme.sh/congm.in。后续 acme.sh 将会自动更新该文件夹内的证书。

部署nginx

参考:acme.sh说明

  1. 拷贝证书

    1
    2
    3
    4
    acme.sh --install-cert -d congm.in \
    --key-file /etc/nginx/ssl/congm.in.key \
    --fullchain-file /etc/nginx/ssl/congm.in.cer \
    --reloadcmd 'service nginx force-reload'

    注意:通过该命令可将 ~/.acme.sh/congm.in 内的证书copy到指定位置 /etc/nginx为nginx服务器实际的地址(可修改为自己服务器对应的地址)service nginx force-reload 为nginx重启命令(可修改为自己服务器对应的命令),force-reload 会重载证书,后续 acme.sh 签发了新证书后就自动完成该拷贝过程。

  2. 配置nginx

    Nginx-Conf

    1
    vim /etc/nginx/conf.d/congm.in.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # http(80) -> https(443/ssl)
    server {
    listen 80;
    server_name congm.in;
    rewrite ^(.*)$ https://$host$request_uri;
    }
    # congm.in
    server {
    listen 443;
    server_name congm.in;
    include ssl/congm.in.ssl.conf;

    location / {
    # todo
    }
    }

    SSL-Conf

    1
    vim /etc/nginx/ssl/congm.in.ssl.conf
    1
    2
    3
    ssl on;
    ssl_certificate ssl/congm.in.cer;
    ssl_certificate_key ssl/congm.in.key;