0%

个人博客 https 化

https 的安全性不言而喻,有些搜索引擎甚至会对有没 https 的网站降权。

使用 https 证书的首要条件是要有 SSL 证书,在某些人(比如我)的印象里 SSL 证书动辄几百美元并且有着严格的审查,所以搞起来麻烦。但实际上现在已经有了面向个人的免费 SSL 证书了,当然你前提是你有个人域名(这个还是要花钱的~)。

对于个人,申请免费的域名型(DV)就够了,企业型(OV)和 增强型(EV)不仅昂贵而且需要人工审核。

域名型证书只要有域名的所有权就可以申请,这里以 Let’s Encrypt 为例介绍下申请流程。

Let’s Encrypt 申请过程完全自动化,并且被各大浏览器支持,由 Linux 基金会托管,安全和可靠性值得信赖。

不知道为什么在官网下载的工具在验证的时候总是会出错,这里还是以 github 上最新的版本进行操作,系统为 Ubuntu 16.04 。

首先执行以下命令下载工具:

screen

git clone https://github.com/certbot/certbot
cd certbot 

申请过程中需要更改 DNS 记录比较耗时,为了不自动断开连接,推荐使用 screen 命令

申请命令:(g.com 为你的域名,*.g.com 是你的所有子域名,它们共用一个证书)

sudo ./certbot-auto certonly --manual -d *.g.com -d g.com --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

之后出现一长串的无规则的字母序列类似于

J_fUsCNSs_5MzaFWpbXcy71IdcH7eQgg

你需要到域名解析商那里给自己的域名添加 txt 解析(不会影响正常解析,相当于给你的某个子域名添加了“注释”,用来验证你对网站的所有权),以 dns.la 为例:

image-20180526115633874

注意主机记录那里是 _acme-challenge 而不是 _acme-challenge.g.com

注意添加之后要等几分钟或以上再按 Enter 键,因为 DNS 缓存需要时间,如果等不及的话可以用命令查看是否生效:

nslookup -q=txt _acme-challenge.g.com

然后,接着我们要做的是……

按下 Enter 后,重复再来一次!

注意第二次更不要急,因为网络上可能有上次你设置的 TXT 记录的缓存,所以你这次设置的没那么快被更新,等个十来分钟吧……

再次按下 Enter 键,如果成功的话会提示密钥存放的位置(不要急着关掉),如果没成功所有流程再来一遍……(所以不要急)

一般位置是在:

/etc/letsencrypt/live/g.com/

如果你刚才没注意看的话~~~

最后更新 Nginx 设置然后重启 Nginx (sudo service nginx restart),nginx 配置如下(把g.com 换成你的域名就好了):

server {
    listen 80;  
    server_name g.com www.g.com;
    return 301 https://www.g.com$request_uri; # 从 http 过来的跳到 https 上
}

server
{
    listen 443;   # https 端口 
    server_name
           g.com
           www.g.com;
    index index.html index.htm;
    root  /home/ubuntu/;
    error_page 404 = /404.html;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/g.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/g.com/privkey.pem;

    access_log /var/log/nginx/g.com_access.log;
}

以后再上网站就是有安全认证的~

image-20180526121410444

注意证书有效期三个月,可以在 crontab 增加如下命令每天更新(证书没过期不会执行成功,需要sudo):

43 6 * * * certbot-auto renew --post-hook "systemctl reload nginx"