SSL证书生成

acme阿里云篇

1. 证书类型

  • 目前主流的SSL证书主要分为DV SSL(域名型) 、 OV SSL(组织型) 、EV SSL(增强型)。

img

  • DV、OV、EV证书在浏览器中显示的区别

DV类型仅在浏览器显示一个小锁,OV和EV类型证书都包含了企业名称信息,但是,EV证书采用了更加严格的认证标准,浏览器在访问时,会在地址栏显示公司名称,地址栏变成绿色。绿的更加让人信任。

img

2. ACME协议

ACME全称The Automatic Certificate Management Environment,而acme.sh这个库,则能够在Linux上实现如下功能:

  1. 自动向Let’s Encrypt申请证书;
  2. 自动调用各大云平台的api接口实现TXT解析配置;
  3. 证书下发后自动部署到nginx;
  4. 利用定时器,每60天自动更新证书,并完成自动部署。

3. 配置证书

3.1 安装acme.sh

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

这个自动安装过程完成了以下几个步骤:

  1. 拷贝sh脚本到~/.acme.sh/
  2. 创建alias别名acme.sh=~/.acme.sh/acme.sh (source ~/.bashrc一下)
  3. 启动定时器 . 可以通过crontab -l查看

3.2 dns验证并安装部署

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证. 接下来我们说下 dns的验证.

  • 去阿里的控制台找到Ali_Key, Ali_Secret, 执行下面命名

    1
    2
    export Ali_Key="xx" 
    export Ali_Secret="xx"
  • 生成泛域名证书

    1
    acme.sh --issue --dns dns_ali -d imaxun.com -d *.imaxun.com

    ~/.acme文件里生成了*.imaxun.com 文件夹

  • 配置nginx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    rewrite ^ https://$http_host$request_uri? permanent; #https跳转到https,永久重定向
    }

    server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ssl_certificate "/etc/nginx/ssl/fullchain.cer";
    ssl_certificate_key "/etc/nginx/ssl/*.imaxun.com.key";

    root /home/levonfly/www;
    index index.html;
    }
  • 安装证书

    1
    2
    3
    4
    sudo ./acme.sh  --installcert  -d  *.imaxun.com   \
    --key-file /etc/nginx/ssl/*.imaxun.com.key \
    --fullchain-file /etc/nginx/ssl/fullchain.cer \
    --reloadcmd "service nginx force-reload"
    • 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload
    • nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

4. docker生成证书

1
2
3
4
5
6
7
8
9
10
11
12
  
echo "初始化"
docker run --rm -it \
-v "$(pwd)/acme":/acme.sh \
neilpang/acme.sh --set-default-ca --server letsencrypt

echo "生成证书"
docker run --rm -it \
-v "$(pwd)/acme":/acme.sh \
-e Ali_Key="xx" \
-e Ali_Secret="xx" \
neilpang/acme.sh --issue --dns dns_ali -d imaxun.com -d *.imaxun.com --force