zoukankan      html  css  js  c++  java
  • 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 mingtech.net.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目录下有写权限。

    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动作。

  • 相关阅读:
    ELK学习总结(2-1)mavel -》sense 和 索引初始化
    ELK学习总结(1-3)倒排索引
    java基础总结(1)安装jdk
    ELK学习总结(1-2)安装ElasticSearch
    T410升级笔记
    CURL学习总结(1)
    restful架构风格设计准则(二)以资源为中心,一个url
    GIT入门笔记(18)- 标签创建和管理
    GIT入门笔记(17)- 创建分支dev_lsq, 提交到代码
    GIT入门笔记(16)- 分支创建和管理
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/15662094.html
Copyright © 2011-2022 走看看