Skip to content

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

准备工作

安装 OpenSSL

Centos

bash
yum install openssl

Ubuntu

bash
sudo apt-get openssl

安装 acme.sh

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

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

获取证书

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

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

配置 CloudXNS 授权

修改 account.conf 文件:

bash
vim ~/.acme.sh/account.conf

在文件最后加入 CloudXNSAPI KEYSECRET KEY

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

保存即可。

获取多个子域名证书

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

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

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

nginx

bash
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

bash
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

nginx
#
# 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;
}

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

bash
service nginx restart