ITTS

[原创]使用Let’s encrypt免费SSL证书

本文原创:中国科学技术大学 张焕杰

修改时间:2018.03.14

一、SSL证书产生过程介绍

  1. SSL证书产生过程涉及以下几个概念:
  1. CA服务机构

CA服务机构的存在是做为公认的第三方来验证服务器身份,这中间可能需要收取服务费。

为了方便使用,可以选择Let’s encrypt免费CA机构签发证书。Let’s encrypt已被广泛接受,申请证书也比较快捷,一般来说5分钟内可以完成从开始安装程序到申请证书过程。需要说明的是Let’s encrypt签发的证书有效期是90天,在到期之前需完成证书更新。

  1. Let’s encrypt免费证书颁发过程

二、Let’s encrypt 证书生成工具

有很多种Let’s encrypt 证书生成工具,这里介绍完全由shell脚本完成整个过程的acme.sh https://github.com/Neilpang/acme.sh

以下过程使用泛域名*.ustc.edu.cn演示。

  1. 安装过程

我没有安装,仅仅是下载:

cd /usr/src/
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
  1. 获取证书

执行命令获取证书

./acme.sh --issue --dns  -d *.ustc.edu.cn

执行后退出,提示有:

Add the following txt record:
Domain:_acme-challenge.ustc.edu.cn
Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c

这时,修改DNS记录,增加

_acme-challenge.ustc.edu.cn IN	TXT "9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c"

然后继续获取证书的过程,注意下面的命令行中的”renew”

./acme.sh --renew  -d *.ustc.edu.cn

注意:上面是生成 *.ustc.edu.cn 泛域名证书,如果是生成普通的域名证书,更简单:

./acme.sh --issue --webroot /etc/nginx/html/.well-known/acme-challenge -d linux.ustc.edu.cn
  1. 产生nginx需要的证书

以上执行过程,会在 ~/.acme.sh 产生一些中间文件(包括证书的信息),使用如下命令可以生成nginx需要的两个文件:

acme.sh --install-cert -d *.ustc.edu.cn \
--key-file       /etc/nginx/ssl/ustc.edu.cn.key  \
--fullchain-file /etc/nginx/ssl/ustc.edu.cn.pem
  1. 证书使用

nginx.conf的配置如下所示(需使用命令openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048生成dhparam.pem文件)

        server {
                listen 80;
                listen [::]:80;
                listen 443 ssl;
                listen [::]:443 ssl;
                ssl_certificate /etc/nginx/ssl/ustc.edu.cn.pem;
                ssl_certificate_key /etc/nginx/ssl/ustc.edu.cn.key;
                ssl_session_cache shared:SSL:1m;
                ssl_session_timeout  10m;
                ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
                ssl_prefer_server_ciphers on;
                ssl_dhparam /etc/nginx/ssl/dhparam.pem;
                server_name ustcnet.ustc.edu.cn;
                access_log /var/log/nginx/host.ustcnet.ustc.edu.cn.access.log;
                location / {
                        proxy_pass http://202.38.64.99/;
                }
        }

使用以上配置,https://www.ssllabs.com/ssltest/analyze.html?d=ustcnet.ustc.edu.cn 测试评分是A (IPv4/IPv6双栈)

  1. 关联邮件

以上已经可以工作了,但建议使用

./acme.sh --updateaccount --accountemail xyz@xya.edu.cn

关联自己的邮箱,这样证书快过期时可以收到提醒邮件。

  1. 自动化处理

我校的DNS服务器采用bind,为了自动化证书的更新过程,采取的措施如下:

文件 /named/zones/ustc.edu.cn.common是ustc.edu.cn域文件,增加一行

_acme-challenge IN TXT  any

编辑文件 /root/.acme.sh/dns_ustc.sh,内容是:

#!/bin/bash
########  Public functions #####################

#Usage: dns_ustc_add   _acme-challenge.www.domain.com   "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ustc_add() {
  fulldomain=$1
  txtvalue=$2
  _info "Using ustc"
  _debug fulldomain "$fulldomain"
  _debug txtvalue "$txtvalue"
  cd /named
  sed -i "s/^_acme-challenge.*$/_acme-challenge IN TXT \"${txtvalue}\"/" /named/zones/ustc.edu.cn.common 
  git diff
  git commit -a -m "_acme-challenge"
}

#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_ustc_rm() {
  fulldomain=$1
  txtvalue=$2
  _info "Using myapi"
  _debug fulldomain "$fulldomain"
  _debug txtvalue "$txtvalue"
}

现在只要执行

/usr/src/acme.sh/acme.sh --issue --dns dns_ustc -d "*.ustc.edu.cn"

就可以自动更新了

  1. 更新证书时自动重启nginx等服务

可以在执行acme.sh 时使用--reloadcmd "service nginx force-reload" 参数,在证书成功更新后重启nginx服务。


欢迎 加入我们整理资料