升级你的hexo为https

本文以Debian 8为服务器栗子

最近升级了个人博客为https协议,写一个详细的教程帮助更多人升级https。

https的详细原理在此文中省略,简略来说,既是客户端在访问服务器时需要一个数字证书(里面包括公钥),它由权威机构(CA, Certificate Authority)颁发,来确认公钥确实是服务器发出来的。

证书价格不菲,大概7天需要几美金到几百美金不等(根据认证的等级和域名覆盖范围区分),所以很多证书都是商业级的,提供给商业网站使用。

获取免费证书

那么个人将无法获取数字证书么?不是的,为了鼓励https的普及,EFF成立了免费证书最大的提供商为Let’s Encrypt,可以提供免费证书。那么小型的网站,就可以使用免费证书升级为https啦。

当然Let’s Encrypt生成的证书,只能是单域名的,而且只有最低级的域名验证。

克隆letsencrypt客户端

$ git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
如果遇到权限问题,记得先创建/opt/letsencrypt文件夹再,更改文件夹权限为可写入。

注册证书

Nginx指向静态路径注册证书

注册一个域名证书非常简单,使用letsencrypt就能生成https所需的证书。当然,用letsencrypt生成的证书只支持域名验证,只需要用letsenctypt的自动注册证书命令,证明这个域名是自己的是用的即可。

$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/me -d me.chanchun.com.cn # 可以使用多个 -d 添加多个域名

letsencrypt可以帮我们自动注册证书,--webroot-path是静态资源所指的路径。-d是域名域名,也可以多个-d增加多个域名。最后确保使用https的域名都被letsencrypt注册。

后续将会让你继续输入邮箱信息

如果出现Congratulations!字样,则证明证书已被自动注册。

Nginx转发型注册证书

如果是使用Nginx直接重定向服务器本地服务,非静态资源,就省略--webroot-path-a参数。

$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -d ca.chanchun.com.cn

输入命令之后

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Nginx Web Server plugin (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel):

选择1即可,后续将会让你继续输入邮箱信息

如果出现Congratulations!字样,则证明证书已被自动注册。

Nginx配置

直到这一步,证书已经就绪,只要配置好Nginx即可完美升级https。Nginx安装、启动教程请具体请教Nginx教程。

转发到本地服务Nginx配置Sample:

#http重定向到https配置 证书验证配置
server {
    listen 80;
    server_name ca.chanchun.com.cn; # 这里写你的域名
    location ^~ /.well-known/acme-challenge/ { # 不要修改 letsencrypt需要验证你的域名
        default_type "text/plain";
        proxy_pass http://localhost:3000; # 填写你需要转发的服务器地址
    }
    location = /.well-known/acme-challenge/ { # 不要修改 letsencrypt需要验证你的域名
        return 404;
    }
    return 301 https://$server_name$request_uri;
}

# https配置
server {
    # SSL Configuration
    listen 443 ssl;
    server_name ca.chanchun.com.cn; # 这里写你的域名

    # copy from https://cipherli.st
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off; # Requires nginx >= 1.5.9
    ssl_stapling on; # Requires nginx >= 1.3.7
    ssl_stapling_verify on; # Requires nginx => 1.3.7
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

    # specify cert files
    ssl_certificate /etc/letsencrypt/live/ca.chanchun.com.cn/fullchain.pem; # 中间填写你的域名
    ssl_certificate_key /etc/letsencrypt/live/ca.chanchun.com.cn/privkey.pem; # 中间填写你的域名
    location / {
        proxy_pass http://localhost:3000; # 填写你需要转发的服务器地址
    }
}

指向静态文件Nginx配置Sample:

server {
    listen 80;
    server_name me.chanchun.com.cn; # 这里写你的域名
    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /var/www/me; # 这里写你的静态文件目录
    }
    location = /.well-known/acme-challenge/ {
        return 404;
    }
    return 301 https://$server_name$request_uri;
}

server {
    # SSL Configuration
    listen 443 ssl;
    server_name me.chanchun.com.cn;  # 这里写你的域名
   # specify cert files
    ssl_certificate /etc/letsencrypt/live/me.chanchun.com.cn/fullchain.pem;  # 中间写你的域名
    ssl_certificate_key /etc/letsencrypt/live/me.chanchun.com.cn/privkey.pem;  # 中间写你的域名
    location / {
        root  /var/www/me; # 这里写你的静态文件目录
        index index.html index.htm; # 这里写你暴露的静态文件
    }
}

Nginx配置各有各的配置方法,这里只要保证四点:

  • 域名配置正确
  • 静态文件目录路径、本地服务目录路径配置正确
  • .well-known/acme-challenge目录配置正确
  • 要保证80默认端口和443ssl端口都有配置

如果配置好Nginx,那么访问网站就会有绿色的小钥匙啦,说明你的https站点搭建好。

自动更新证书

letsencrypt证书最多只有90天,90天之后我们需要重新注册证书,当然这个可以交给服务器自己做啦。

验证自己的证书是否可以更新

$ cd /opt/letsencrypt
$ ./letsencrypt-auto renew --dry-run
此命令只是验证 不会更新证书

如果出现Congratulations!字样或者已经更新字样则证明可以自动更新。如果出现错误,或者说路径找不到的情况,大多数情况是.well-known/acme-challenge目录配置没有正确的配置成功

编写crontab脚本

$ crontab -e

脚本内容

30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
如果遇到权限问题,可先创建/var/log目录再设置其权限为可写入

成功

享受https的绿色小锁吧!

阅读 2.4k

推荐阅读
倲小陖慢慢谈
用户专栏

一个初级前端程序猿的叽里呱啦

0 人关注
13 篇文章
专栏主页