• 使用Let's Encrypt加密你的小站


    介绍

    Let's Encrypt是一个免费并且开源的CA,且已经获得Mozilla、微软等主要浏览器厂商的根授信。它极大低降低DV证书的入门门槛,进而推进全网的HTTPS化。

    Certbot is an easy-to-use client that fetches a certificate from Let’s Encrypt—an open certificate authority launched by the EFF, Mozilla, and others—and deploys it to a web server.

    本文所有的操作均在Ubuntu14.04下进行安装和配置。

    本文同步更新地址: 使用Let's Encrypt加密你的小站

    安装

    直接安装Let's Encrypt相对比较复杂和费事。为了简化安装步骤,我们就直接使用 Let's Encrypt 官网推荐的自动部署脚本Certbot
    根据环境选择,我们选择Nginx+Ubuntu14.04,进入官方推荐脚本页面,脚本如下:

    $ sudo apt-get update
    $ sudo add-apt-repository ppa:certbot/certbot
    $ sudo apt-get update
    $ sudo apt-get install python-certbot-nginx
    

    因为我本机已经有了python和Nginx,所以我的脚本简化为了

    sudo apt-get update
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install certbot
    

    接下来,我们要生成自己的证书。

    • 获取证书前需要先停止 Nginx 服务
    service nginx stop
    
    • 生成单域名证书
    certbot certonly --standalone --email your@email.com -d yourdomain.com
    

    Tips:
    yourdomain.com目前必须是你的绝对域名,因为Let's Encrypt暂时还不支持泛域名,但是根据官方的消息说,预计2018年一月,会实现支持。Wildcard Certificates Coming January 2018

    到此,如果没有什么意外,执行完命令之后,你就可以看到你的证书创建成功的提示!默认是在 /etc/letsencrypt/live 路径下。

    Nginx配置

    有了证书,接下来我们就可以配置Nginx了。
    进入Nginx的配置文件夹(/etc/nginx/sites-available/),创建一个ssl.conf配置文件,在里面增加一个server配置。
    配置的内容,基本和监听http的配置相似,主要的区别是监听443端口和证书的加载,一个例子如下:

    server {
    	# SSL configuration
    
    	listen 443 ssl;
    	listen [::]:443 ssl;
    	ssl on;
    
    	ssl_certificate   /etc/letsencrypt/live/123456.cloud/fullchain.pem;
    	ssl_certificate_key  /etc/letsencrypt/live/123456.cloud/privkey.pem;
    	ssl_session_timeout 5m;
    	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    	ssl_prefer_server_ciphers on;
    
    	root /var/www/html;
    
            # Add index.php to the list if you are using PHP
            index index.html index.htm index.nginx-debian.html;
    
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
                    try_files $uri $uri/ =404;
            }
    }
    

    保存,然后reload ngxin(nginx -s reload)配置。这时候我们就可以在域名前加上https,就可以发现成功了!

    仅限Https访问

    有了Https,我们一般也就不想要http的访问了,或者说想把所有的http请求转为https。方法有很多种,我的方法是使用rewrite,把原先的Http全部转化为Https。
    一个例子如下:

    server {
    	listen 80 default_server;
    	listen [::]:80 default_server;
    
    	server_name 123456.cloud;
    	rewrite ^(.*) https://$server_name$1 permanent;
    
    }
    

    自此,个人小站的Https加密工作完成。

    Github Pages使用Https

    一般来说,我们都会把自己的Github Pages博客定义成自己的域名。但是会发现,变为自己的域名之后,就没有Https了。所以为了能让我们的博客也用上Https,这时候也要折腾一下了。
    原理很简单,就是用自己的服务器进行反向代理,实际上访问Github Pages博客就是访问自己的服务器。
    我自己的配置如下,

    server {
            # SSL configuration
    
            listen 443 ssl;
            listen [::]:443 ssl;
            ssl on;
    
            server_name blog.123456.cloud;
    
            ssl_certificate   /etc/letsencrypt/live/blog.123456.cloud/fullchain.pem;
            ssl_certificate_key  /etc/letsencrypt/live/blog.123456.cloud/privkey.pem;
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
    
            location / {
                    proxy_set_header   X-Real-IP $remote_addr;
                    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header   Host $http_host;
                    proxy_pass         http://151.101.229.147;
        }
    
    }
    

    这里需要注意的是,proxy_pass的地址是ping自己的Github Pages地址得到的,也就是那个.io结尾的地址。然后在你的域名提供商那里,修改你博客的A地址解析就可以了。
    当然,如果这里你也仅限Https访问的话,把你的http监听也进行rewrite一下就好了!

    证书续期

    Let’s Encrypt 生成的免费证书为3个月时间,使用 certbot renew 可以无限免费续签 Https 证书。
    为了方便,我们可以使用crontab进行自动续期。注意在使用certbot renew的时候,要先关闭nginx才能成功。

    常见的问题

    1、Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping
    原因和解决方案:这是因为80、443端口被占用,解除对端口的占用即可,例如执行 service nginx stop _

    2、DNS解析生效慢
    解决方案:你的域名供应商一般都会提供DNS服务器,ping一下dns服务器,得到IP。然后在你本机的DNS配置里,换成ping DNS服务器得到IP既可。

    3、Nginx配置不起作用,DNS也不起作用
    解决方案:
    (1)、换除Chrome以外的浏览器
    (2)、在Chrome中,F12打开控制台,按住刷新按钮,选择‘清空缓存并硬性重新加载’
    Chrome为了加快速度,这个的缓存机制倒是挺讨厌的。

  • 相关阅读:
    [CF340D]Bubble Sort Graph/[JZOJ3485]独立集
    [JZOJ3484]密码
    [HDU1756]Cupid's Arrow
    Luogu P4006 小 Y 和二叉树
    Luogu P4040 [AHOI2014/JSOI2014]宅男计划
    Luogu P3243 [HNOI2015]菜肴制作
    Luogu P3942 将军令
    Luogu P4823 [TJOI2013]拯救小矮人
    Luogu P3620 [APIO/CTSC 2007]数据备份
    BZOJ3709 [PA2014]Bohater
  • 原文地址:https://www.cnblogs.com/SzeCheng/p/8075799.html
Copyright © 2020-2023  润新知