簡單幾步讓你的網站支持 HTTPS

最近在玩小程序,調用本身的 API 的時候須要支持 HTTPS。在網上試了一些方法,這裏分享一個簡單實用的供你們使用。html

證書提供商有不少,這裏我使用的是 Let’s Encrypt 家的免費 SSL 證書。官方推薦使用 Certbot 工具生成,本文教程也基於此。python

1 Nginx 安裝與配置

爲了能描述的更清楚一些,教程從 Nginx 的使用開始。nginx

注意:當前系統爲 Ubuntu 16.04git

安裝 Nginxweb

# apt-get update
# apt-get install nginx
複製代碼

備份配置文件ubuntu

# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
複製代碼

編輯配置文件 /etc/nginx/sites-available/default 內容爲小程序

server {
    listen 80;
    server_name test.kevinbai.com;

    location / {
        default_type text/html;
        return 200 'Hello World!';
    }
}
複製代碼

保存後啓動 Nginx後端

# /etc/init.d/nginx start
複製代碼

瀏覽器訪問 http://test.kevinbai.com,看到以下內容api

Hello World!
複製代碼

Nginx 配置成功。瀏覽器

注意:Nginx 中的域名配置前記得去域名服務商添加一條 A 記錄,將域名解析到目標 IP

2 證書生成與配置

更新源後安裝 software-properties-common,這個主要是提供一些便攜工具,好比添加軟件源工具,一行命令就能添加源,不用本身手動去編輯相應的配置文件。

# apt-get update
# apt-get install software-properties-common
複製代碼

添加 Certbot 的源並安裝

# add-apt-repository ppa:certbot/certbot
# apt-get update
# apt-get install python-certbot-nginx
複製代碼

生成證書

# certbot --nginx -d test.kevinbai.com
複製代碼

將上面的 test.kevinbai.com 換成你的域名便可。

生成過程當中會讓你填寫必要的信息,輸入你的郵箱

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): kevinbai.cn@gmail.com
複製代碼

贊成協議

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel:A
複製代碼

是否願意 Let's Encrypt 給你的郵箱推送一些消息,這個你本身隨意選擇

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
複製代碼

選擇是否自動修改 Nginx 的一些配置,以支持 HTTPS,1 爲否,2 爲是。不熟悉相關配置的能夠選擇 2

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):2
複製代碼

最後若是看到相似下面的輸出,則說明證書已經生成並配置成功

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/test.kevinbai.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/test.kevinbai.com/privkey.pem
   Your cert will expire on 2019-01-29. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 複製代碼

此時,Nginx 的配置文件內容已經被修改爲這樣了

server {
    server_name test.kevinbai.com;

    location / {
        default_type text/html;
        return 200 'Hello World!';
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/test.kevinbai.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/test.kevinbai.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}

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


    listen 80;
    server_name test.kevinbai.com;
    return 404; # managed by Certbot
}
複製代碼

咱們訪問 http://test.kevinbai.com,會發現域名被重定向到了 HTTPS,而且能看到以下內容

Hello World!
複製代碼

說明網站已經成功支持 HTTPS。若是未生效,試着重啓一下 Nginx,若仍是不行,參考第 3 節的內容。

若是你不想 Certbot 自動給你配置,你可使用 certonly 選項,相似這樣

# certbot --nginx certonly -d test.kevinbai.com
複製代碼

3 可能會碰到的問題

3.1 Nginx 安裝並配置後沒法訪問

重啓一下 Nginx

# /etc/init.d/nginx restart
複製代碼

若是還不行,多是 80 端口未開放,打開就好。

3.2 Another instance of Certbot is already running

安裝過程當中,不當心中斷,再次執行下面的命令

# certbot --nginx -d test.kevinbai.com
複製代碼

可能會出現這樣的問題

# Another instance of Certbot is already running
複製代碼

執行以下命令找到 .certbot.lock 文件

# find / -type f -name ".certbot.lock"
複製代碼

將其刪除

# find / -type f -name ".certbot.lock" -exec rm {} \;
複製代碼

而後重試便可。

3.3 證書生成而且配置成功,訪問域名超時

這個多是 HTTPS 的 443 端口被禁引發的,打開就能夠了。

4 自動延長免費期限

Let's Encrypt 的證書有效期只有 90 天,到期後咱們須要從新生成。

不過咱們不須要手動去生成,上面的生成命令在生成證書後,已經爲咱們配置了定時任務。查看 /etc/cron.d/certbot,主要內容以下

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
複製代碼

表面上每隔 12 個小時會重建一次證書,事實上只有當證書的有效期只有 30 天的時候,重建才真正生效。

這裏咱們只要確認下重建命令沒有問題就能夠了,執行一下命令

# certbot renew --dry-run
複製代碼

若是執行過程當中沒有報錯的話,也就沒有什麼問題了。

5 SSL 狀態檢測

咱們可使用 MySSL 檢測證書詳細信息、證書鏈詳細信息、當前支持協議、加密套件詳細信息等,地址以下

https://myssl.com
複製代碼

訪問後,輸入你的域名便可測試。

這裏咱們能夠看到支持的 SSL 版本,相似這樣

TLS 1.3	不支持	
TLS 1.2	支持	
TLS 1.1	支持	
TLS 1.0	支持	
SSL 3	不支持	
SSL 2	不支持
複製代碼

有些應用場景下對 SSL 版本有要求,好比小程序的 API 等,咱們就能夠從這肯定咱們的 HTTPS 是否知足需求。固然,還有其它的一些信息,有須要的時候查看就好。

除了 MySSL 外,下面的兩個在線工具也比較經常使用

https://www.ssllabs.com/ssltest
https://www.htbridge.com/ssl
複製代碼

6 參考

https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx
https://www.f2ecoder.net/477.html
複製代碼

本文首發於公衆號「小小後端」。

相關文章
相關標籤/搜索