风蚀之月

Https改造记录

08 Aug 2019 HTTPS

经过了几个月的观察,现在网站总算是完全平稳的运作在Https上了。

之所以要自己折腾Https证书这些事情,是因为最终网站迁移到Linode上了。

虽然现在的共享主机商都会提供Https签名服务,但是无奈一直都找不到靠谱的主机商。试来试去,发现还是Linode适合我这种规模小但对稳定性有要求的。虽然速度上偶尔会有非常卡的情况,但是现状来看实在无可奈何。因为本质上这边不产生收益,所以没有办法花费太多成本在上面。

记得以前Https证书很难搞定,只有Comodo的免费授权,要更新起来特别麻烦。而个人站点基本不可能去搞商业证书,完全意义不明~

好在现在有了lets encrypt,可以免费的进行Https证书的申请。

第一次弄的时候,由于没有什么时间,参照官方教程随便配置了下。

lets encrypte的签名有效时间比较短,需要自己隔一段时间重新签名一次。但是途中不小心忙忘了 ,导致证书失效。几个常见的浏览器,Firefox和Chrome,遇到这种情况是直接不让访问网站的,相当的尴尬。

于是就又开始折腾。折腾完了就有了下面的记录,方便下次需要配置的时候直接拷贝就可以了~

Acme.sh

几经搜索,终于找到了这个自动签名工具。不但有中文的说明文档,功能上,也比官方的工具更直观一些。

操作上,为了方便下次自动签名,首先第一步是添加DNS API。具体可以参考官方说明

之后按照文档进行证书申请,完成申请后就可以安装了。

对于Nginx,安装的主要的命令是这样:

acme.sh --install-cert -d *.ch-wind.com \
--cert-file      /etc/nginx/ssl/ch-wind.cer  \
--key-file       /etc/nginx/ssl/ch-wind.key  \
--ca-file       /etc/nginx/ssl/ca.cer  \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd     "service nginx force-reload"

一旦完成一次操作,之后就会每隔60天自动更新证书,观察了几个月,基本算是没什么问题。

需要注意的是,对于wild card的域名证书,是不可以使用给根域名的。虽然不知道为什么,但是如果有做根域名跳转的话,需要对根域名另外签一次名。

IPV6

既然都加HTTPS了,自然不能忘了IPV6。

网站的IPV6迁移是最简单的了,不过现在纯IPV6的用户应当还是比较少。大多数都只是根据线路来优先选择更快的一个。

配置上,只要服务器提供商有给IPV6地址,那么在DNS提供商那边添加一个AAAA记录就OK了。

当然,Nginx这边还需要配置下端口监听方式,如果之前没有配过的话。

Nginx配置

接下里就是Nginx配置,这个基本参考官方文档就可以了。但是每次去找也很麻烦,这里贴出现在在使用的版本。

server{
    server_name ch-wind.com;
    return 301 https://blog.$host$request_uri;

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/nginx/ssl/raw_ch-wind.cer; # managed by Certbot 
    ssl_certificate_key /etc/nginx/ssl/raw_ch-wind.key; # managed by Certbot
}

server{
    if ($host = blog.ch-wind.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen [::]:80;
    listen 80;

    server_name blog.ch-wind.com;
    return 301 https://$server_name$request_uri;


}

server {
        ## Your website name goes here.
        server_name blog.ch-wind.com;
        ## Your only path reference.
        root /var/www/chwindblog;
        ## This should be in your http block and if it is, it's not needed here.
        index index.php;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
                # This is cool because no php is touched for static content.
                # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                include snippets/fastcgi-php.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
                fastcgi_buffers 16 16k;
                fastcgi_buffer_size 32k;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }

    ## listen 80;

    listen [::]:443 ssl;
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/ch-wind.cer; # managed by Certbot 
    ssl_certificate_key /etc/nginx/ssl/ch-wind.key; # managed by Certbot
}

server{
    if ($host = ch-wind.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name ch-wind.com;
    listen [::]:80;
    listen 80;
    return 404; # managed by Certbot


}

里面有被Certbot配置过的痕迹,不过CertBot的自动更新功能配置起来有些迷。

整个配置有点乱,也没时间整,真的是凑活着用了……