最近在玩小程序,調用本身的 API 的時候須要支持 HTTPS。在網上試了一些方法,這裏分享一個簡單實用的供你們使用。html
證書提供商有不少,這裏我使用的是 Let’s Encrypt 家的免費 SSL 證書。官方推薦使用 Certbot 工具生成,本文教程也基於此。python
爲了能描述的更清楚一些,教程從 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
更新源後安裝 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
複製代碼
重啓一下 Nginx
# /etc/init.d/nginx restart
複製代碼
若是還不行,多是 80 端口未開放,打開就好。
安裝過程當中,不當心中斷,再次執行下面的命令
# 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 {} \;
複製代碼
而後重試便可。
這個多是 HTTPS 的 443 端口被禁引發的,打開就能夠了。
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
複製代碼
若是執行過程當中沒有報錯的話,也就沒有什麼問題了。
咱們可使用 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
複製代碼
https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx
https://www.f2ecoder.net/477.html
複製代碼
本文首發於公衆號「小小後端」。