更新博客程序及SSL证书
in Linux with 0 comment
更新博客程序及SSL证书
in Linux with 0 comment

需要给网站弄上SSL证书了,之前用的是acme_tiny这个小程序,后面看到网上有更好的程序,用法简单,更方便,叫做acme.sh,于是就开始用这个东西折腾了。

获取程序

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

执行完后会讲程序安装到~/.acme.sh/目录下并且给你自动添加一个定时任务,每天0点自动检查证书,如果快过期了就自动更新证书,我们直接参照官方的使用说明做。

alias acme.sh=~/.acme.sh/acme.sh

生成证书

acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

当然你可以使用--appache或者--nginx参数让其自动识别网站根目录而无需指定--webroot参数

acme.sh --issue  -d mydomain.com   --apache
acme.sh --issue  -d mydomain.com   --nginx

你以为这就很NB了?更牛逼的是,引用官方的话:

注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:
acme.sh --issue -d mydomain.com --standalon

域名所有权验证

在生成证书的过程中需要验证域名的所有权,有两个方式

DNS API详情去官网看,有很多的API,我用的是阿里云,API里面也有阿里云的API,所以直接用官方的API。

export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"

这个Ali_Key和Ali-Secret是需要去阿里云上面去生成的。导入相关信息后,直接运行命令生成证书即可。

acme.sh --issue --dns dns_ali -d mydomain.com -d *.mydomain.com

运行命令后,如果不报错,会自动添加一个txt解析记录,并让你等待120S生效,然后验证,成功后即可生成证书到~/.acme.sh/domain目录下。

下一次更新证书就用以下命令

acme.sh --renew -d mydomain.com --dns *.mydomain.com

手动DNS验证方式

如果没有运行任何网站,也不想使用standalone等模式,可以使用--dns参数,首先执行下面命令

acme.sh --issue --dns -d mydomain.com -d *.mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

当提示添加TXT解析后,到dns解析面板按提示内容添加TXT解析内容,然后再次执行如下命令即可生成证书

acme.sh --renew --dns -d mydomain.com -d *.mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

安装证书

证书生成后,需要将证书正确安装(copy)到指定目标位置,不要使用默认证书的保存位置。

acme.sh --install-cert -d mydomain.com \
--cert-file /etc/pki/tls/mydomain.com.cer \
--key-file /etc/pki/tls/mydomain.com.key \
--fullchain-file /etc/pki/tls/fullchain.cer \
--reloadcmd "systemctl reload nginx"

官方用法:

acme.sh  --install-cert  -d  <domain>.com   \
--key-file   /etc/nginx/ssl/<domain>.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd  "service nginx force-reload"

更新acme.sh

acme.sh --upgrade # 手动更新
acme.sh --upgrade --auto-upgrade # 自动升级
acme.sh --upgrade --auto-upgrade 0 # 关闭自动升级

排错

如果在使用过程中出现错误,使用debug参数排查

acme.sh --issue ..... --debug
或者
acme.sh --issue ..... --debug 2

Nginx配置:

修改这两个证书位置即可

ssl_certificate "/etc/pki/tls/fullchain.cer";
ssl_certificate_key "/etc/pki/tls/mydomain.com.key";

是时候备份一下Nginx配置文件了

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  mydomain.com;
        root         /var/www/html;
        index index.php index.html;
        return 301 https://$server_name$request_uri;
        include /etc/nginx/default.d/*.conf;

        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
 
        location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass  127.0.0.1:9000;
        }

    }

    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  mydomain.com;
        root         /var/www/html;
        index index.php index.html;
        ssl_certificate "/xxx/fullchain.cer";
        ssl_certificate_key "/xxx/mydomain.com.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        gzip on;
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types image/svg+xml text/plain text/html text/xml text/css text/javascript application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript application/x-font-ttf application/vnd.ms-fontobject font/opentype font/ttf font/eot font/otf;

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

        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
 
        location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass  127.0.0.1:9000;
        }

        fastcgi_intercept_errors on;
        error_page 404 500 502 503 504 = https://mydomain.com;

    }

}
The article has been posted for too long and comments have been automatically closed.