使用acme脚本申请免费ssl证书并自动续签

时间来到了2019年,随着支持https的网站越来越多,一些还没有支持https的网站于是也加入了拥抱https的步伐。免费的ssl证书的“登场”也加速了普及的进度。

对于公开对外服务的各类网站而言,做到一年、甚至几个月手动更新一次ssl证书并不是难事,但非正式服务或者仅对内部开放的服务来说,可能相应管理员就不情愿做这个了。这时候,就要用到脚本化方式自动更新了。

这里介绍的是使用 acme 脚本申请 letsencrypt 证书并自动更新的方法,项目地址在这里:https://github.com/Neilpang/acme.sh

1.安装

登录服务器,执行一条命令。

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

2.申请证书

使用该脚本申请证书的验证方式有两种,一种是网站文件验证,一种是DNS验证,由于在正式的生产环境中是不可能的随随便便就能改动网站内容的,于是选择DNS验证。

在执行申请证书命令之前,需要先登录域名注册商的管理面板获取APIKey以后才能继续,该脚本支持主流的DNS服务商。例如 cloudflare、dnspod、cloudxns、godaddy 等。详细方法可参阅:https://github.com/Neilpang/acme.sh/wiki/dnsapi

以cloudflare为例,获取APIKey后,在服务器终端中执行以下命令。

export CF_Key="获取的key"
export CF_Email="登录面板用的电子邮件地址“

然后申请证书(将youdomainname替换为所需域名,可泛匹配):

acme.sh --issue --dns dns_cf -d youdomainname -d www.youdomainname.com

*若位于dokcer容器内,命令行请使用 .acme.sh/acme.sh 替换掉 acme.sh

申请证书成功后,那么就需要安装证书了,已经生成的证书位于当前登录服务器用户的home目录下的 .acme.sh文件夹中,不过这里的文件并不能直接使用,需要用到专门的命令来安装。

正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置。命令中所在的路径必须为当前登录用户可读写的,不过秘钥文件是否已经存在则无要求。

acme.sh  --installcert  -d  已经申请证书的域名   \
        --key-file   所需要的路径/server.key \
        --fullchain-file 所需要的路径/fullchain.cer \
        --reloadcmd  "service nginx force-reload"

这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用。

如果是初次设置网站https,那么也需要修改web服务器的配置文件。这里贴出一份nginx的配置文件供各位参考。(如需直接复制使用,请删除注释)

server {
        listen       80 default; #80端口监听(可单独设置在一个http选项中)
        listen       443 ssl http2; #443端口ipv4监听
        listen       [::]:443 ssl http2; #443端口ipv6监听
        server_name  example.com; #域名1
        server_name  www.example.com; #域名2
        root         /var/www/website1;    #网站根目录
        index  index.html index.php index.htm;
        client_max_body_size 10240M;

        ssl_certificate "/etc/nginx/ssl/server.crt"; #证书位置
        ssl_certificate_key "/etc/nginx/ssl/server.key"; #秘钥位置
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        include /etc/nginx/default.d/*.conf;

        location / {
        try_files $uri $uri/ /index.php$is_args$args;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

        location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000; #php-fpm-sock链接方式
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

}

3.续签证书

续签证书将由脚本使用crontab定时任务自动完成,用户无须担心。不过服务器环境是在docker容器内的话,则需要注意是否安装了crontab服务,以及是否启动。

安装crontab服务:

ubuntu/debian:

apt-get install cron

redhat/centos:

yum install -y cron

4.关于https的题外话

使用https可以有效减少多种 内容从浏览器传输到服务器过程中的 安全隐患。

使用https以及配合其发展的多种新技术可以让网站速度更快。例如QUIC HTTP2。

如果这是一个商业网站,当用户看到浏览器中的那把小锁,带来的感受远不仅仅是安全这么简单。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注