網(wǎng)站https配置全過程

前提

  • 首先要保證你的openssl的版本高于1.0.2
?  ~ openssl version
OpenSSL 1.0.2g  1 Mar 2016
  • 其次您觉,你的nginx要高于1.9.5(高于此版本才能支持http2.0), Ubuntu16.04使用apt安裝時(shí)滋捶,安裝的是1.10.3版本次氨,所以O(shè)K
?  ~ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)

安裝驗(yàn)證SSL的證書

我使用的是Let's Encrypt的免費(fèi)證書(以下簡(jiǎn)稱LE)蠢沿,而LE組織提供一個(gè)自動(dòng)化安裝配置工具就是Certbot苛吱,因此接下來將以Certbot為例來進(jìn)行安裝和配置

安裝Certbot

最新的資料請(qǐng)查看Certbot官網(wǎng)

# 此處針對(duì)的是Ubuntu系統(tǒng)Nginx
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx

使用Certbot

Certbot主要幫助我們實(shí)現(xiàn)如下功能:

  • 自動(dòng)生成證書
  • 自動(dòng)配置nginx的配置文件(主要是配置證書位置)
  • 驗(yàn)證網(wǎng)站(即通過webroot的方式來驗(yàn)證該域名是否確實(shí)屬于你)

通常情況下屹电,我們只需要使用如下命令夜焦,certbot就會(huì)自動(dòng)幫助我們配置nginx壳澳,并自動(dòng)獲取和驗(yàn)證證書。但是保險(xiǎn)起見在使用該命令之前最好先將nginx的配置文件備份一下茫经,然后再執(zhí)行命令:

$ sudo certbot --nginx

執(zhí)行該命令會(huì)出現(xiàn)交互式的提示界面巷波,按照提示操作即可
但是在這里會(huì)有一個(gè)坑,就是必須打開443端口卸伞,之前我在阿里云的安全組中沒有打開443端口抹镊,因此導(dǎo)致報(bào)如下錯(cuò)誤:

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for www.xxx.com
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. www.xxx.com (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Timeout

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: www.xxx.com
   Type:   connection
   Detail: Timeout

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.

在阿里云上添加相應(yīng)安全規(guī)則,打開端口443然后就可以認(rèn)證通過了

配置crontab自動(dòng)更新證書

之后需要在crontab上加上相應(yīng)的命令來自動(dòng)更新證書:

crontab -e
# 添加如下兩行
# 這里是設(shè)置每月的1號(hào)凌晨3點(diǎn)開始更新證書荤傲,隨后3點(diǎn)05分重新reload nginx
00 03 1 * * /usr/bin/certbot renew --quiet
05 03 1 * * /usr/sbin/nginx -s reload

nginx最佳實(shí)踐

同時(shí)垮耳,為了https有更好的性能以及更加安全的配置,可以通過Mozilla的工具來自動(dòng)生成nginx最佳實(shí)踐配置遂黍。我的實(shí)際配置如下:

## WEB
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/domainname/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domainname/privkey.pem; # managed by Certbot
    # Diffie-Hellman parameter for DHE ciphersuites, this is for key exchange
    ssl_dhparam /etc/letsencrypt/live/domainname/dhparam.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    resolver dns22.hichina.com dns21.hichina.com;

    server_name domainname;

    set $root /home/git/projects/newton/build;
    root  $root;

    location / {
            try_files $uri /index.html;
    }

    location /api/ {
            proxy_pass http://127.0.0.1:5000/api/;
            proxy_redirect default;
    }

    location /page/ {
            proxy_pass http://127.0.0.1:5000/page/;
            proxy_redirect default;
    }
}

下面分別講解下

  • 使用如下代碼是為了讓web server監(jiān)聽443端口终佛,即https端口. 同時(shí)打開http2的開關(guān)。要想支持http2需要OpenSSL的版本達(dá)到1.0.2(通過openssl version來檢查openssel版本)且nginx版本要高于1.0.9(通過nginx -v來查詢nginx的版本號(hào))雾家,Ubuntu16.04在通過APT安裝時(shí)自動(dòng)安裝1.10.3的版本铃彰,所以滿足條件
listen 443 ssl http2;
listen [::]:443 ssl http2;
  • 下面這部分代碼是certbot自動(dòng)添加的,用于指明證書的位置
ssl_certificate /etc/letsencrypt/live/domainname/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domainname/privkey.pem; # managed by Certbot
  • 下面這段代碼是用于key exchange時(shí)DH算法的芯咧,由于Nginx默認(rèn)使用的DH秘鑰長(zhǎng)度為1024位牙捉,不足夠安全,所以如果沒有如下的配置則會(huì)在SSL Labs的安全測(cè)試中只能得到B+的得分敬飒,而要想得到A+的得分邪铲,就必須生成2048位以上長(zhǎng)度的秘鑰。關(guān)于key exchange是怎么一回事可以參考阮一峰的文章, 關(guān)于Diffie-Hellman算法是怎么回事无拗,可以參考這個(gè)Youtube視頻
# Diffie-Hellman parameter for DHE ciphersuites, this is for key exchange
ssl_dhparam /etc/letsencrypt/live/domainname/dhparam.pem;

注意這里的dhparam.pem是需要自己生成的带到,且需要跟之前證書的位置為同一個(gè)目錄。生成dhparam.pem的方法如下

$ sudo openssl dhparam -out /etc/letsencrypt/live/domainname/dhparam.pem 2048
  • 下面是https的優(yōu)化參數(shù)英染,不做解釋揽惹,直接粘貼過來
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
  • 另外指令ssl_ciphers用于指定加密套件晌纫,避免使用不安全的加密套件
  • 通常在使用http請(qǐng)求網(wǎng)站的時(shí)候,我們會(huì)通過發(fā)送301來重定向到https鏈接永丝,使用443端口建立連接,但是這樣必定會(huì)使得請(qǐng)求的時(shí)間加長(zhǎng)箭养,為了避免這種情況慕嚷,我們可以通過HSTS的方式來讓瀏覽器在一段時(shí)間內(nèi)固定使用https訪問網(wǎng)站,不論其是http請(qǐng)求還是https請(qǐng)求毕泌,這就避免了重定向喝检。HSTS實(shí)際是在返回的response的頭中添加了header Strict-Transport-Security,其nginx配置如下:
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
  • 我們的瀏覽器通常在https請(qǐng)求時(shí)需要檢測(cè)證書狀態(tài)撼泛,其中一種方式就是通過對(duì)OCSP Server請(qǐng)求來獲取證書的狀態(tài)挠说,因此為了減少這種不必要的請(qǐng)求,可以通過OCSP Stabling來提高性能, 關(guān)于OCSP Stapling可以參考這里
ssl_stapling on;
ssl_stapling_verify on;

resolver dns22.hichina.com dns21.hichina.com;

檢測(cè)http2是否生效

最簡(jiǎn)單的辦法是使用chrome瀏覽器inspect工具當(dāng)中愿题,選擇Network损俭,再右鍵單擊Colume header,選擇protocol潘酗,讓column可以顯示protocol杆兵,如圖


image.png

然后我們就可以看到,http請(qǐng)求使用的是否是http2.0協(xié)議仔夺,如下琐脏,顯示h2表示使用的是http2.0協(xié)議,說明配置成功


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缸兔,一起剝皮案震驚了整個(gè)濱河市日裙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惰蜜,老刑警劉巖昂拂,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝎抽,居然都是意外死亡政钟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門樟结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來养交,“玉大人,你說我怎么就攤上這事瓢宦∷榱” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵驮履,是天一觀的道長(zhǎng)鱼辙。 經(jīng)常有香客問我廉嚼,道長(zhǎng),這世上最難降的妖魔是什么倒戏? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任怠噪,我火速辦了婚禮,結(jié)果婚禮上杜跷,老公的妹妹穿的比我還像新娘傍念。我一直安慰自己,他們只是感情好葛闷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布憋槐。 她就那樣靜靜地躺著,像睡著了一般淑趾。 火紅的嫁衣襯著肌膚如雪阳仔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天扣泊,我揣著相機(jī)與錄音近范,去河邊找鬼。 笑死延蟹,一個(gè)胖子當(dāng)著我的面吹牛顺又,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播等孵,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼稚照,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了俯萌?” 一聲冷哼從身側(cè)響起果录,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咐熙,沒想到半個(gè)月后弱恒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棋恼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年返弹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪飘。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡义起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出师崎,到底是詐尸還是另有隱情默终,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站齐蔽,受9級(jí)特大地震影響两疚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜含滴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一诱渤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈况,春花似錦源哩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谓着。三九已至泼诱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赊锚,已是汗流浹背治筒。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舷蒲,地道東北人耸袜。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牲平,于是被迫代替她去往敵國(guó)和親堤框。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理纵柿,服務(wù)發(fā)現(xiàn)蜈抓,斷路器,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 前段時(shí)間昂儒,看見很多大會(huì)都在分享全站HTTPS的經(jīng)驗(yàn)沟使。HTTPS固然好,前提是SSL證書渊跋,并且簽發(fā)證書的機(jī)構(gòu)要靠譜腊嗡。...
    人世間閱讀 6,036評(píng)論 0 5
  • Nginx簡(jiǎn)介 解決基于進(jìn)程模型產(chǎn)生的C10K問題,請(qǐng)求時(shí)即使無狀態(tài)連接如web服務(wù)都無法達(dá)到并發(fā)響應(yīng)量級(jí)一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,007評(píng)論 0 9
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,875評(píng)論 24 176
  • 本文將介紹Linux環(huán)境下如何安裝Web服務(wù)基礎(chǔ)運(yùn)行環(huán)境,包括以下內(nèi)容: 安裝jdk安裝Tomcat安裝MySQL...
    daling菜鳥閱讀 2,869評(píng)論 0 9