用acme.sh申请免费的HTTPS证书

Author Avatar
陈高勋 1月 28, 2017
  • 在其它设备中阅读本文章

拜读了 屈光宇 老师的文章:Let’s Encrypt,免费好用的 HTTPS 证书 后,决定将自己的网站实现全站HTTPS,采用的工具是 acme.sh ,申请的是 Let’s Encrypt 的免费HTTPS证书。

准备工作

安装OpenSSL

Centos

yum install openssl

Ubuntu

sudo apt-get openssl

安装acme.sh

选择服务器的一个目录存放 acme.sh

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

获取证书

由于我的服务器部署在阿里云,访问 Let’s Encrypt 获取证书会访问超时。。。

万幸的是 acme.sh 支持DNS模式,常用的 CloudFlareDNSPodCloudXNS阿里云 等DNS服务都支持,免去了访问超时的尴尬,每一种DNS服务的配置详见项目的主页,下面以 CloudXNS 为例来为 nmchgx.comwww.nmchgx.com 获取证书。

配置CloudXNS授权

修改 account.conf 文件:

vim ~/.acme.sh/account.conf

在文件最后加入 CloudXNSAPI KEYSECRET KEY

CX_Key="[YOUR API KEY]"
CX_Secret="[YOUR SECRET KEY]"

保存即可。

获取多个子域名证书

acme.sh 可以一次获取多个子域名证书:

sh acme.sh --issue --dns dns_cx \
        -d nmchgx.com \
        -d www.nmchgx.com \

等到程序跑完后,若获取成功,再将证书保存到我们要存放的位置并重启服务器:

nginx

sh acme.sh  --installcert  -d nmchgx.com   \
        --keypath   /var/www/ssl/domain.key \
        --fullchainpath /var/www/ssl/chained.pem \
        --reloadcmd  "service nginx force-reload"

Apache

sh acme.sh  --installcert  -d nmchgx.com   \
        --keypath   /var/www/ssl/domain.key \
        --fullchainpath /var/www/ssl/chained.pem \
        --reloadcmd  "service apache2 force-reload"

启用HTTPS服务

与HTTP的URL由“http://”起始且默认使用端口80不同,HTTPS的URL由“https://”起始且默认使用端口443。 — by Wikipedia

我们需要修改服务器的配置文件启用HTTPS,下面以nginx为例,将所有访问跳转到 https://nmchgx.com

#
# The default server
#

server {
    listen               443 ssl;

    server_name          www.nmchgx.com nmchgx.com;

    ssl_certificate      /var/www/ssl/chained.pem;
    ssl_certificate_key  /var/www/ssl/domain.key;

    if ($host != 'nmchgx.com' ) {
        rewrite          ^/(.*)$  https://nmchgx.com/$1 permanent;
    }

    location / {
        proxy_set_header         Host             nmchgx.com;
        proxy_set_header         X-Real_IP        $remote_addr;
        proxy_set_header         X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass               http://127.0.0.1:2368;
    }
}

server {
    listen       80;
    server_name  *.nmchgx.com nmchgx.com;

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

配置好后,重启服务器即可:

service nginx restart