使用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為了加快速度,這個的緩存機制倒是挺討厭的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM