Django部署HTTPS

原文地址:https://blogof33.com/post/10/

前言

Chrome 新版本已經(jīng)會自動跳轉(zhuǎn) HTTPS 了赎败,ACool 一直想著沒有 HTTPS 的博客網(wǎng)站不是很完美,但是礙于平時(shí)比較忙,難以抽出時(shí)間來折騰。今天終于有空,完成了 HTTPS 在 Django 上面的部署。網(wǎng)上關(guān)于 Django 框架下 HTTPS 部署的文章很少踱卵,故此記錄一下部署過程嘉裤。

配置環(huán)境:

  • django >= 1.8
  • nginx

Let's Encrypt 是一個(gè)免費(fèi)的郑临,自動的,開放的認(rèn)證機(jī)構(gòu)(CA)屑宠,為公眾的利益而運(yùn)行厢洞。它是由互聯(lián)網(wǎng)安全研究組(ISRG)提供的一項(xiàng)服務(wù)。本文使用 Let's Encrypt 提供的免費(fèi) SSL 證書典奉。

因?yàn)槭謩荧@取和維護(hù)證書特別麻煩躺翻,所以我們采用自動客戶端 Cettbot 部署 SSL 證書。下面是官方介紹:

Certbot是 EFF 為了加密整個(gè)互聯(lián)網(wǎng)而做的一部分努力卫玖。Web上的安全通信依賴于HTTPS公你,它需要使用數(shù)字證書來讓瀏覽器驗(yàn)證Web服務(wù)器的身份(例如,是否真的是 google.com 骇笔?)省店。Web 服務(wù)器從名為證書頒發(fā)機(jī)構(gòu)(CA)的可信第三方獲取證書。Certbot 是一個(gè)易于使用的客戶端笨触,可從 Let's Encrypt(由 EFF懦傍,Mozilla 和其他人啟動的開放式證書頒發(fā)機(jī)構(gòu))獲取證書,并將其部署到Web服務(wù)器芦劣。

采用以上組合 ( Let's Encrypt + Certbot )方式簡單粗俱,方便,快捷虚吟。

獲取 SSL 證書

預(yù)先工作

在創(chuàng)建證書之前寸认,我們需要確保 Web 服務(wù)器可以在根目錄下的該路徑下提供靜態(tài)文件:/.well-know。由于django 應(yīng)用程序引入的所有路徑都通過 wsgi 提供服務(wù)串慰,因此我們需要編寫nginx 配置以便于靜態(tài)地提供這些資源:將以下內(nèi)容添加到域名的 nginx 配置文件中:

server {
    location /.well-known/acme-challenge {
        alias /path/to/yoursite/.well-known/acme-challenge;
    }
}

請根據(jù)自己的情況修改 /path/to/yoursite/字段偏塞,比如 改成/home/User/Blogof33.com ,這個(gè)路徑便是 Django app 的絕對路徑邦鲫,即 manage.py 文件所在目錄灸叼。

下載Certbot

從 github 上面下載源碼,可以不用管 Linux 服務(wù)器發(fā)行版的區(qū)別:

git clone https://github.com/certbot/certbot.git

生成證書

因?yàn)槲覀兪?nginx 而不是 Apache庆捺,所以使用 webroot選項(xiàng)獲取證書:

certbot certonly --webroot -w /path/to/yoursite -d blogof33.com -d www.blogof33.com

請修改 /path/to/yoursite字段古今,和上面預(yù)先工作的修改一樣,然后后面的 blogof33.comwww.blogof33.com 請修改成自己的域名滔以,如果現(xiàn)在的域名不能加 www 訪問的話(即沒有提供 WWW 的解析)捉腥,請去掉最后這條字段。

這條命令成功的輸出類似于這樣(有Congratulations):

Output:
IMPORTANT NOTES:

  • If you lose your account credentials, you can recover through
    e-mails sent to sammy@digitalocean.com

  • Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/example.com/fullchain.pem. Your
    cert will expire on 2018-08-31. To obtain a new version of the
    certificate in the future, simply run Let's Encrypt again.

  • Your account credentials have been saved in your Let's Encrypt
    configuration directory at /etc/letsencrypt. You should make a
    secure backup of this folder now. This configuration directory will
    also contain certificates and private keys obtained by Let's
    Encrypt so making regular backups of this folder is ideal.

  • If like Let's Encrypt, please consider supporting our work by:

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

上述命令會為blogof33.comwww.blogof33.com生成一個(gè)單獨(dú)的證書你画。證書存儲于 /etc/letsencrypt/live/blogof33.com/fullchain.pem.

Django配置

參考官方鏈接:

https://docs.djangoproject.com/en/1.10/topics/security/#ssl-https

修改配置文件setting.py抵碟,將以下行加入進(jìn)去:

SESSION_COOKIE_SECURE=True
SESSION_COOKIE_HTTPONLY=True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')

注意:對于運(yùn)行 django <1.8 的應(yīng)用程序桃漾,您應(yīng)該安裝并配置 django-secure

Nginx配置

最后一步便是配置 nginx立磁,配置文件位于 /etc/nginx/sites-available/blogof33.com 呈队, 配置與說明如下:

server {
    charset utf-8;
    listen 80;
    server_name www.blogof33.com blogof33.com;
    return 301 https://blogof33.com$request_uri;

}
server {
    listen 443 default ssl;
    server_name  blogof33.com;

    ssl_certificate /etc/letsencrypt/live/blogof33.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blogof33.com/privkey.pem;
    error_log /var/log/nginx/error.log;
    
    location /.well-known/acme-challenge {
        alias /home/ACool/sites/blogof33.com/DjangoBlog/.well-known/acme-challenge;
    }
    location /static {
        alias /home/ACool/sites/blogof33.com/DjangoBlog/static;
    }
    location / {
        proxy_set_header Host $host;
        proxy_pass http://unix:/tmp/blogof33.com.socket;
    }
}

其中 剥槐,第一段 Server 代碼:

server {
    charset utf-8;
    listen 80;
    server_name www.blogof33.com blogof33.com;
    return 301 https://blogof33.com$request_uri;

}

含義為將所有 HTTP 流量重定向到 HTTPS唱歧,我們只需要根據(jù)自己域名修改其中域名,其他部分不變粒竖。

這一行是用來監(jiān)聽 443 端口( HTTPS 端口號):

listen 443 default ssl;

這兩行則是指向證書和密鑰(域名替換成自己的):

ssl_certificate /etc/letsencrypt/live/blogof33.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blogof33.com/privkey.pem;

這一行是用來創(chuàng)建證書的:

location /.well-known/acme-challenge {
        alias /home/ACool/sites/blogof33.com/DjangoBlog/.well-known/acme-challenge;
    }

修改 nginx 配置以后颅崩,重新加載一下:

sudo nginx -s reload

至此配置完成。記得刷新一下瀏覽器緩存哦 蕊苗。

https成功標(biāo)示

Let’s Encrypt 自動續(xù)期

Let’s Encrypt 的證書90天就過期了沿后,所以,我們還需要設(shè)置自動化更新腳本朽砰,最容易的莫過于使用 crontab 了尖滚。使用 crontab -e 命令加入如下的定時(shí)作業(yè)(每周都強(qiáng)制更新一下,如果需要 root 權(quán)限瞧柔,需要切換到 root 下執(zhí)行):

45 2 * * 2 cd /etc/letsencrypt/ && ./certbot-auto renew --deploy-hook "service nginx reload"

crontab 六個(gè)字段含義:

minute hour day month week command

其中:

  • minute: 表示分鐘漆弄,(整數(shù) 0 -59)。
  • hour:表示小時(shí)造锅,可以是從0到23之間的任何整數(shù)撼唾。
  • day:表示日期,可以是從1到31之間的任何整數(shù)哥蔚。
  • month:表示月份倒谷,可以是從1到12之間的任何整數(shù)。
  • week:表示星期幾糙箍,可以是從0到7之間的任何整數(shù)渤愁,這里的0或7代表星期日。
  • command:要執(zhí)行的命令深夯,可以是系統(tǒng)命令抖格,也可以是自己編寫的腳本文件。

如果字段使用 * 號塌西,如 month 字段為 * 號他挎,則為滿足其他字段約束的每月都執(zhí)行該命令。

這里是每周 2 的 2 點(diǎn) 45 分嘗試更新證書捡需,如果證書在 30 天內(nèi)到期办桨,則會更新證書,否則不會更新站辉, --deploy-hook選項(xiàng)表示在更新成功以后才運(yùn)行重載 nginx 的命令呢撞。

至此损姜,在 Django 框架下部署 HTTPS 全部完成。

Welcome to the https world!再也不用擔(dān)心網(wǎng)站被劫持了殊霞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摧阅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绷蹲,更是在濱河造成了極大的恐慌棒卷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祝钢,死亡現(xiàn)場離奇詭異比规,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拦英,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門蜒什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疤估,你說我怎么就攤上這事灾常。” “怎么了铃拇?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵钞瀑,是天一觀的道長。 經(jīng)常有香客問我锚贱,道長仔戈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任拧廊,我火速辦了婚禮监徘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吧碾。我一直安慰自己凰盔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布倦春。 她就那樣靜靜地躺著户敬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睁本。 梳的紋絲不亂的頭發(fā)上尿庐,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音呢堰,去河邊找鬼抄瑟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枉疼,可吹牛的內(nèi)容都是我干的皮假。 我是一名探鬼主播鞋拟,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惹资!你這毒婦竟也來了贺纲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褪测,失蹤者是張志新(化名)和其女友劉穎猴誊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汰扭,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年福铅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萝毛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滑黔,死狀恐怖笆包,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情略荡,我是刑警寧澤庵佣,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站汛兜,受9級特大地震影響巴粪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粥谬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一肛根、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漏策,春花似錦派哲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至感耙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間即硼,已是汗流浹背逃片。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工题诵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洁仗,地道東北人性锭。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像草冈,于是被迫代替她去往敵國和親她奥。 傳聞我的和親對象是個(gè)殘疾皇子怎棱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前段時(shí)間,看見很多大會都在分享全站HTTPS的經(jīng)驗(yàn)拳恋。HTTPS固然好,前提是SSL證書谬运,并且簽發(fā)證書的機(jī)構(gòu)要靠譜。...
    人世間閱讀 6,029評論 0 5
  • 點(diǎn)我查看本文集的說明及目錄梆暖。 本文是《 django by example 》第十三章 上線運(yùn)行 的內(nèi)容伞访。 CH1...
    學(xué)以致用123閱讀 1,555評論 1 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)轰驳,斷路器厚掷,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Nginx是一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-...
    Mr_Bluyee閱讀 1,091評論 0 0
  • 我去年曾在夢里聽見有人在唱歌级解,畫面一直都是從石橋上往河面探去冒黑,兩側(cè)楊柳依依,隨風(fēng)舞動蠕趁,歌詞在唱:京城多風(fēng)云薛闪,臨安...
    云歸處vv閱讀 300評論 0 0