申请Let's Encrypt HTTPS证书

December 3, 2017 / HTTPS

Let’s Encrypt是一个免费、自动化和开放的权威机构,它是由非盈利组织Internet Security Research Group (ISRG,互联网安全研究小组)提供的一个服务。为了创建一个更加安全和保护隐私的网络,它向人们免费提供HTTPS(SSL/TLS)所需要的数字证书。Let’s Encrypt受到了Mozilla、Chrome、Akamai和CISCO等的支持。

本文使用一个开源工具acme.sh来申请证书,acme.sh是一个用Shell脚本编写的ACME(Automatic Certificate Management Environment,自动化证书管理环境)协议客户端,Let’s Encrypt正是使用ACME协议进行证书签发。

安装

安装OpenSSL:

sudo apt-get install openssl

安装acme.sh

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

签发证书

Let’s Encrypt需要验证域名,因此需要先修改Nginx配置,增加中间的 location ^~ .well-known/acme-challenge 部分。如果有多个域名的话,记得对每个域名都做修改。

server {
    listen       80;
    server_name  jeoygin.org;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/challenges/;
        try_files $uri =404;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

重新加载Nginx配置,然后执行acme.sh签发证书:

sudo usermod -a -G www-data $USER
sudo mkdir -m 774 /var/www/challenges
sudo chown www-data:www-data /var/www/challenges
sudo nginx -s reload

~/.acme.sh/acme.sh --issue -d jeoygin.org -d wiki.jeoygin.org \
  -d file.jeoygin.org -d img.jeoygin.org -w /var/www/challenges

安装证书并重新加载Nginx配置:

sudo mkdir -m 774 /var/www/ssl
sudo chown -R www-data:www-data /var/www/ssl
acme.sh --install-cert -d jeoygin.org \
--key-file       /var/www/ssl/key.pem  \
--fullchain-file /var/www/ssl/cert.pem \
--reloadcmd     "service nginx force-reload"

配置Nginx

增加Nginx SSL配置:

server {
    listen       443 ssl;
    server_name  jeoygin.org;
    error_page 404  /404.html;

    ssl_certificate      /var/www/ssl/cert.pem;
    ssl_certificate_key  /var/www/ssl/key.pem;

    location / {
        root   /var/www/jeoygin.org/public_html/;
        index  index.html index.htm;
    }

    access_log /var/log/nginx/jeoygin.org.log;
}

server {
    listen       80;
    server_name  jeoygin.org;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/challenges/;
        try_files $uri =404;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

重新加载Nginx配置:

sudo nginx -s reload