SSL证书申请及HTTP转HTTPS

SSL证书及HTTP转HTTPS

搭建的个人网站,申请公安备案时,提示我没有证书。HTTP本身就是前期临时措施,总之后面是要转HTTPS的。因此走一遍HTTPS流程。

1.申请Let's Encrypt证书

穷人一个,当然是能省则省,证书不用高大上的,免费的最好,当然找Let's Encrypt了。

1.1 脚本

申请Let's Encrypt也不轻松,找来找去,certbot提示要安装一堆包,实在烦。

搜索到一个github上的工程,acme.sh,一个脚本,深合朕意。链接:https://github.com/acmesh-official/acme.sh

1.1.1 依赖程序

acme.sh依赖于其他程序来完成相应证书申请、刷新、删除等工作。

因此,需要加上openssl、curl所在的路径后再执行

PATH=$PATH:/xxxx/bin ./acme.sh --issue -w /XXX/web -d YYYY.cn --server letsencrypt --preferred-chain "ISRG Root X1"

但会提示错误:

Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 60

搜索得到答案,将acme.sh中的curl --silent中加入一个-k参数即可(是由于客户端缺少证书导致)。

再次运行后,即可得到正确的证书、私钥等,位于当前用户目录的.acme.sh/YYYY.cn/下。

如需要方便后续的renew操作,可以通过install-cert命令将证书复制到指定位置,复制完成后并可执行reload命令(除命令当次会执行拷贝、并reload外,同时会的.acme.sh/YYYY.cn/YYYY.cn.conf文件中保存证书目标位置、reload命令,方便renew命令自动完成这些复杂动作)。

PATH=$PATH:/xxxx/bin /YYY/acme.sh-3.0.1/acme.sh --install-cert -d YYYY.cn --cert-file /ZZZZ/etc/ssl/certs/YYYY.cer --key-file /ZZZZ/etc/ssl/private/YYYY.cn.key --fullchain-file /ZZZZ/etc/ssl/certs/fullchain.cer --reloadcmd "systemctl reload nginx.service"

PS:当前用户需要在/XXX/web目录下有写权限。

1.2 二级域名

新版acme.sh支持泛域名或多个二级域名。泛域名当然更好了(*.xxx.com),但泛域名并不支持-w方式指定本地路径,只支持DNSAPI方式。我并不想使用DNS厂商的API(毕竟,开放一个口子,就会增加一点安全风险),而且自己使用的二级域名并 不是很多,因此使用多个二级域名即可。

申请时,执行如下命令

PATH=$PATH:/XXXX/bin /data/acme.sh-3.0.1/acme.sh --issue -w /AAAA/web -d YYYY.cn  -d www.YYYY.cn -d mail.YYYY.cn -d pop3.YYYY.cn -d smtp.YYYY.cn -d imap.YYYY.cn -d pop3s.YYYY.cn -d smtps.YYYY.cn -d imaps.YYYY.cn --server letsencrypt --preferred-chain "ISRG Root X1"

安装到本地,方便后续自动续期

PATH=$PATH:/XXXX/bin /data/acme.sh-3.0.1/acme.sh -d YYYY.cn  -d www.YYYY.cn -d mail.YYYY.cn -d pop3.YYYY.cn -d smtp.YYYY.cn -d imap.YYYY.cn -d pop3s.YYYY.cn -d smtps.YYYY.cn -d imaps.YYYY.cn --install-cert --cert-file /ZZZZ/ssl/certs/YYYY.cn.cer --key-file /ZZZZ/ssl/private/YYYY.cn.key --fullchain-file /ZZZZ/ssl/certs/fullchain.cer --reloadcmd "systemctl reload nginx.service"

2. nginx服务上配置

首先,修改nginx的server配置模块,将http定向到https。


server {
    listen 80;
    listen [::]:80;
    server_name mingtech.net.cn;
    # enforce https
    return 301 https://$server_name$request_uri;
}

然后将证书、私钥、DH文件及相关配置项配置上。

server {
    listen 443 ssl      http2;
    listen [::]:443 ssl http2;
    server_name mingtech.net.cn;

    ssl_certificate       /ZZZZ/etc/ssl/certs/fullchain.cer;
    #ssl_certificate       /ZZZZ/etc/ssl/certs/YYYY.cn.cer;
    ssl_certificate_key   /ZZZZ/etc/ssl/private/YYYY.cn.key;
    
    # ECDH 系列交换算法依赖的DHparams文件,通过openssl dhparam -out dhparam.pem 2048/4096方式生成。
    ssl_dhparam           /ZZZZ/etc/ssl/dhparam_2048.pem;

    # 开启 OCSP Stapling ---当客户端访问时 NginX 将去指定的证书中查找 OCSP 服务的地址,获得响应内容后通过证书链下发给客户端。
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /ZZZZ/etc/ssl/certs/YYYY.cn.cer; #若 ssl_certificate 指令指定了完整的证书链,则 ssl_trusted_certificate 可省略。
    resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s; #添加resolver解析OSCP响应服务器的主机名,valid表示缓存。
    resolver_timeout 2s; # resolver_timeout表示网络超时时间

    #安全链接可选的加密协议
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 如果要提高SSL评分,应如下配置,关闭TLSv1 TLSv1.1的支持
    #ssl_protocols TLSv1.2;
    #可选的加密算法,顺序很重要,越靠前的优先级越高.
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:HIGH:!RC4-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;
    #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法.
    ssl_prefer_server_ciphers on;
    #储存SSL会话的缓存类型和大小
    ssl_session_cache shared:SSL:10m;
    #缓存有效期
    ssl_session_timeout 60m;

    # topic first.
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;

同时,使用fastCGI协议的location的,HTTPS字段需要从off修改为on

        location ~ ^\/blog\/.*\.php(\/.*)*$ {
            fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
            set $path_info $fastcgi_path_info;
            try_files $fastcgi_script_name = 404;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $path_info;
            fastcgi_param HTTPS on;
            # Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;
            # Enable pretty urls
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
        }

重启nginx服务。

部署在云上的服务器,需要在云上开放443端口,通过frps透传的,需要将添加frpc一个新的开放端口。

就可以将Web服务从HTTP切换至HTTPS了。

3.Let's Encrypt证书自动续期

Let's Encrypt虽然好用,但有效期只有90天,所以还是加上自动续期的功能。

root用户下加上一个crond的任务:

# m h  dom mon dow   command
0 13 * * 1  PATH=$PATH:/xxxx/bin /YYY/acme.sh-3.0.1/acme.sh --renew -d YYYY.cn > /root/RenewCert_`date +\%Y-\%m-\%d_\%H_\%M`.log 2>&1

每周一的13点进行一次renew动作。

posted @ 2021-12-08 16:10  日月王  阅读(523)  评论(0编辑  收藏  举报