網(wǎng)站升級 https 及優(yōu)化臂拓,Nginx安裝 SSL 證書篇

SSL 介紹

https 早已成為當今 web 主流捡絮,最近給自己的網(wǎng)站升級了 https。
Let’s Encrypt是一個非盈利性的證書頒發(fā)機構(gòu)书聚,為1.8億個網(wǎng)站提供TLS證書煞檩。它是開源定鸟,并且完全免費的稿存,它頒發(fā)的證書已經(jīng)被幾乎所有的瀏覽器所認可笨篷。

本文用到的腳本是 acmesh-official/acme.sh

準備

環(huán)境

操作環(huán)境:Ubuntu 18.04 x64
webserver:Nginx

域名

需要自己在服務(wù)商購買域名瞳秽,本文不表

安裝腳本 acmesh-official/acme.sh

在線安裝

    curl https://get.acme.sh | sh

官方推薦的方法,如果擔心網(wǎng)站被運營商劫持率翅,可以使用以下 git 方法

從 git 倉庫安裝

clone git 倉庫:

[root@Ubuntu:~]# git clone https://github.com/acmesh-official/acme.sh.git
Cloning into 'acme.sh'...
remote: Enumerating objects: 49, done.
remote: Counting objects: 100% (49/49), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 10098 (delta 30), reused 30 (delta 15), pack-reused 10049
Receiving objects: 100% (10098/10098), 3.92 MiB | 18.41 MiB/s, done.
Resolving deltas: 100% (5951/5951), done.

執(zhí)行安裝腳本

[root@Ubuntu:~]# cd ./acme.sh/
[root@Ubuntu:acme.sh]# crontab -l
no crontab for root
[root@Ubuntu:acme.sh]# ./acme.sh --install
[Thu Feb 20 01:55:27 CST 2020] It is recommended to install socat first.
[Thu Feb 20 01:55:27 CST 2020] We use socat for standalone server if you use standalone mode.
[Thu Feb 20 01:55:27 CST 2020] If you don't use standalone mode, just ignore this warning.
[Thu Feb 20 01:55:27 CST 2020] Installing to /root/.acme.sh
[Thu Feb 20 01:55:27 CST 2020] Installed to /root/.acme.sh/acme.sh
[Thu Feb 20 01:55:27 CST 2020] Installing alias to '/root/.bashrc'
[Thu Feb 20 01:55:27 CST 2020] OK, Close and reopen your terminal to start using acme.sh
[Thu Feb 20 01:55:27 CST 2020] Installing cron job
no crontab for root
no crontab for root
[Thu Feb 20 01:55:27 CST 2020] Good, bash is found, so change the shebang to use bash as preferred.
[Thu Feb 20 01:55:28 CST 2020] OK

安裝詳情

執(zhí)行此安裝腳本不要求必須使用 root 用戶练俐,建議使用。

當前用戶至少要有執(zhí)行 nginx 權(quán)限

安裝程序?qū)?zhí)行3個操作:

  • 創(chuàng)建和復制acme.sh到你的主目錄($HOME)~/.acme.sh/ 所有證書也將放置在此文件夾中安聘。
  • 創(chuàng)建別名:acme.sh=~/.acme.sh/acme.sh.
  • 如果需要痰洒,創(chuàng)建每日Cron作業(yè)以檢查并更新證書。

安裝過程中會自動為你創(chuàng)建 cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書(可執(zhí)行 crontab -l 查看)浴韭。

[root@Ubuntu:acme.sh]# crontab -l
27 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

安裝后,必須關(guān)閉當前終端脯宿,然后重新打開以使別名生效念颈。

之后可以準備頒發(fā)證書了

顯示幫助信息:

[root@Ubuntu:acme.sh]# acme.sh -h

申請簽發(fā) SSL 證書

acme.sh 實現(xiàn)了 acme 協(xié)議支持的所有驗證協(xié)議. 一般有兩種方式驗證: http 和 dns 驗證

本文不建議用 dns 方式申請, dns 手動模式连霉,不能自動更新證書榴芳。在續(xù)訂證書時,您必須手動向域中添加新的 txt 記錄跺撼。

Nginx模式

由于網(wǎng)站運行的是 nginx 服務(wù)器窟感,acme.sh 可以使用 nginx 服務(wù)器頒發(fā)證書。頒發(fā)證書后歉井,acme.sh 會還原 nginx conf柿祈,請放心。

官方提供以下命令

acme.sh  --issue  -d example.com  --nginx

有時哩至,無法自動找到nginx conf文件躏嚎,您可以指定以下文件之一:

acme.sh  --issue  -d example.com  --nginx /etc/nginx/nginx.conf

您還可以指定網(wǎng)站conf:

acme.sh  --issue  -d example.com  --nginx /etc/nginx/conf.d/example.com.conf

執(zhí)行看到以下結(jié)果即成功

[root@Ubuntu:~]# acme.sh  --issue  -d www.kangxuanpeng.com --nginx
[Thu Feb 20 01:59:28 CST 2020] Creating domain key
[Thu Feb 20 01:59:28 CST 2020] The domain key is here: /root/.acme.sh/www.kangxuanpeng.com/www.kangxuanpeng.com.key
[Thu Feb 20 01:59:28 CST 2020] Single domain='www.kangxuanpeng.com'
[Thu Feb 20 01:59:28 CST 2020] Getting domain auth token for each domain
[Thu Feb 20 01:59:29 CST 2020] Getting webroot for domain='www.kangxuanpeng.com'
[Thu Feb 20 01:59:29 CST 2020] Verifying: www.kangxuanpeng.com
[Thu Feb 20 01:59:29 CST 2020] Nginx mode for domain:www.kangxuanpeng.com
[Thu Feb 20 01:59:29 CST 2020] Found conf file: /etc/nginx/sites-enabled/www.kangxuanpeng.com.conf
[Thu Feb 20 01:59:29 CST 2020] Backup /etc/nginx/sites-enabled/www.kangxuanpeng.com.conf to /root/.acme.sh/www.kangxuanpeng.com/backup/www.kangxuanpeng.com.nginx.conf
[Thu Feb 20 01:59:29 CST 2020] Check the nginx conf before setting up.
[Thu Feb 20 01:59:29 CST 2020] OK, Set up nginx config file
[Thu Feb 20 01:59:29 CST 2020] nginx conf is done, let's check it again.
[Thu Feb 20 01:59:29 CST 2020] Reload nginx
[Thu Feb 20 01:59:34 CST 2020] Success
[Thu Feb 20 01:59:34 CST 2020] Restoring from /root/.acme.sh/www.kangxuanpeng.com/backup/www.kangxuanpeng.com.nginx.conf to /etc/nginx/sites-enabled/www.kangxuanpeng.com.conf
[Thu Feb 20 01:59:34 CST 2020] Reload nginx
[Thu Feb 20 01:59:34 CST 2020] Verify finished, start to sign.
[Thu Feb 20 01:59:34 CST 2020] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/78572851/2382115231
[Thu Feb 20 01:59:35 CST 2020] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/03e350b1498cdf3776887b8ffebf902dc4b7
[Thu Feb 20 01:59:35 CST 2020] Cert success.
...
-----END CERTIFICATE-----
[Thu Feb 20 01:59:35 CST 2020] Your cert is in  /root/.acme.sh/www.kangxuanpeng.com/www.kangxuanpeng.com.cer 
[Thu Feb 20 01:59:35 CST 2020] Your cert key is in  /root/.acme.sh/www.kangxuanpeng.com/www.kangxuanpeng.com.key 
[Thu Feb 20 01:59:35 CST 2020] The intermediate CA cert is in  /root/.acme.sh/www.kangxuanpeng.com/ca.cer 
[Thu Feb 20 01:59:35 CST 2020] And the full chain certs is there:  /root/.acme.sh/www.kangxuanpeng.com/fullchain.cer 

生成 dhparam.pem 文件

[root@Ubuntu:sites-enabled]# openssl dhparam -out /root/.acme.sh/dhparam.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...

ssl_dhparam 之后要 restart nginx,不能用nginx -s reload

將證書安裝到 Nginx

官方不建議直接使用以上生成的證書 生成證書后菩貌,您可能希望將證書安裝/復制到Apache / Nginx或其他服務(wù)器卢佣。您必須使用此命令將證書復制到目標文件,請勿使用 ~/.acme.sh/ 文件夾中的證書文件箭阶,這些文件僅供內(nèi)部使用虚茶,將來文件夾結(jié)構(gòu)可能會更改。

[root@Ubuntu:~]# acme.sh --install-cert -d www.kangxuanpeng.com \
> --keypath /etc/nginx/ssl-key-files/www.kangxuanpeng.com.key \
> --fullchainpath /etc/nginx/ssl-key-files/www.kangxuanpeng.com.key.pem \
> --reloadcmd "nginx -s reload"
[Thu Feb 20 02:30:33 CST 2020] Installing key to:/etc/nginx/ssl-key-files/www.kangxuanpeng.com.key
[Thu Feb 20 02:30:33 CST 2020] Installing full chain to:/etc/nginx/ssl-key-files/www.kangxuanpeng.com.key.pem
[Thu Feb 20 02:30:33 CST 2020] Run reload cmd: nginx -s reload
[Thu Feb 20 02:30:33 CST 2020] Reload success

命令格式為:

acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "nginx -s reload"

只有域名是必需的仇参,所有其他參數(shù)都是可選的嘹叫。
現(xiàn)有文件的所有權(quán)和許可信息將保留。您可以預先創(chuàng)建文件以定義所有權(quán)和權(quán)限冈敛。
將證書/密鑰安裝/復制到生產(chǎn)Apache或Nginx路徑待笑。
默認情況下,證書將每60天更新一次(可配置)抓谴。一旦證書被更新暮蹂,在Apache / Nginx的服務(wù)將自動被重新裝載命令:nginx -s reload
請注意:reloadcmd非常重要寞缝。該證書可以自動更新,但是如果沒有正確的“ reloadcmd”仰泻,該證書可能無法刷新到您的服務(wù)器(例如nginx或apache)荆陆,那么您的網(wǎng)站將無法在60天內(nèi)顯示更新的證書。

更改 Nginx 配置

啟用 SSL集侯,監(jiān)聽 443端口并且配置證書位置

http {
    ...
    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    ...
}

server {
    listen 80;
    listen 443 ssl;

    server_name www.kangxuanpeng.com;
    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    ssl_certificate_key     /etc/nginx/ssl-key-files/www.kangxuanpeng.com.key;
    ssl_certificate     /etc/nginx/ssl-key-files/www.kangxuanpeng.com.key.pem;
    # ssl_dhparam
    ssl_dhparam             /etc/nginx/ssl-key-files/dhparam.pem;
    ...
}

檢查 Nginx 配置是否正確后重啟

[root@Ubuntu:sites-enabled]# nginx -s reload //或者 service nginx restart

驗證 SSL

訪問 ssllabs.com 輸入你的域名被啼,檢查 SSL 的配置是否都正常:

https://www.ssllabs.com/ssltest/analyze.html?d=www.kangxuanpeng.com&hideResults=on&latest

確保驗證結(jié)果有 A 以上,否則根據(jù)提示調(diào)整問題


image.png

自動續(xù)期

Let's Encrypt 的證書有效期是 90 天的棠枉,你需要定期 renew 重新申請浓体,這部分 acme.sh 以及幫你做了,在安裝的時候往 crontab 增加了一行每天執(zhí)行的命令 acme.sh --cron:
27 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

手動驗證

[root@Ubuntu:nginx]# "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh"
[Thu Feb 20 17:08:49 CST 2020] ===Starting cron===
[Thu Feb 20 17:08:49 CST 2020] Renew: 'blog.kangxuanpeng.com'
[Thu Feb 20 17:08:49 CST 2020] Skip, Next renewal time is: Sun Apr 19 18:00:48 UTC 2020
[Thu Feb 20 17:08:49 CST 2020] Add '--force' to force to renew.
[Thu Feb 20 17:08:49 CST 2020] Skipped blog.kangxuanpeng.com
[Thu Feb 20 17:08:49 CST 2020] Renew: 'kangxuanpeng.com'
[Thu Feb 20 17:08:49 CST 2020] Skip invalid cert for: kangxuanpeng.com
[Thu Feb 20 17:08:49 CST 2020] Skipped kangxuanpeng.com
[Thu Feb 20 17:08:49 CST 2020] Renew: 'me.kangxuanpeng.com'
[Thu Feb 20 17:08:49 CST 2020] Skip, Next renewal time is: Sun Apr 19 19:04:51 UTC 2020
[Thu Feb 20 17:08:49 CST 2020] Add '--force' to force to renew.
[Thu Feb 20 17:08:49 CST 2020] Skipped me.kangxuanpeng.com
[Thu Feb 20 17:08:49 CST 2020] Renew: 'www.kangxuanpeng.com'
[Thu Feb 20 17:08:49 CST 2020] Skip, Next renewal time is: Sun Apr 19 17:59:35 UTC 2020
[Thu Feb 20 17:08:49 CST 2020] Add '--force' to force to renew.
[Thu Feb 20 17:08:49 CST 2020] Skipped www.kangxuanpeng.com
[Thu Feb 20 17:08:49 CST 2020] ===End cron===

驗證 acme.sh --cron 的流程

[root@Ubuntu:nginx]# acme.sh --cron -f
[Thu Feb 20 17:10:57 CST 2020] ===Starting cron===
[Thu Feb 20 17:10:57 CST 2020] Renew: 'blog.kangxuanpeng.com'
[Thu Feb 20 17:10:58 CST 2020] Single domain='blog.kangxuanpeng.com'
[Thu Feb 20 17:10:58 CST 2020] Getting domain auth token for each domain
[Thu Feb 20 17:10:59 CST 2020] Getting webroot for domain='blog.kangxuanpeng.com'
[Thu Feb 20 17:10:59 CST 2020] blog.kangxuanpeng.com is already verified, skip http-01.
[Thu Feb 20 17:10:59 CST 2020] Verify finished, start to sign.
[Thu Feb 20 17:10:59 CST 2020] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/78572851/2388621838
[Thu Feb 20 17:11:00 CST 2020] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/0425b2165b01e91823130a37ee094b60fb66
...
[Thu Feb 20 17:11:06 CST 2020] Your cert is in  /root/.acme.sh/www.kangxuanpeng.com/www.kangxuanpeng.com.cer 
[Thu Feb 20 17:11:06 CST 2020] Your cert key is in  /root/.acme.sh/www.kangxuanpeng.com/www.kangxuanpeng.com.key 
[Thu Feb 20 17:11:06 CST 2020] The intermediate CA cert is in  /root/.acme.sh/www.kangxuanpeng.com/ca.cer 
[Thu Feb 20 17:11:06 CST 2020] And the full chain certs is there:  /root/.acme.sh/www.kangxuanpeng.com/fullchain.cer 
[Thu Feb 20 17:11:06 CST 2020] Installing key to:/etc/nginx/ssl-key-files/www.kangxuanpeng.com.key
[Thu Feb 20 17:11:06 CST 2020] Installing full chain to:/etc/nginx/ssl-key-files/www.kangxuanpeng.com.key.pem
[Thu Feb 20 17:11:06 CST 2020] Run reload cmd: nginx -s reload
[Thu Feb 20 17:11:06 CST 2020] Reload success
[Thu Feb 20 17:11:06 CST 2020] ===End cron===

至此配置 SSL 已完成

SSL 優(yōu)化

chrome 證書緩存

如果配置不正確的時候用 chrome 打開網(wǎng)站辈讶,瀏覽器會緩存證書命浴,證書配置正確后驗證則需要清除瀏覽器證書緩存
chrome://net-internals

DNS CAA

添加一條 CAA 記錄
CAA data 填寫 0 issue "證書頒發(fā)機構(gòu)域名"
用 Let's Encrypt 頒發(fā)的免費證書贱除,CAA data 部分直接填寫 0 issue "letsencrypt.org" 即可生闲。

ssl 緩存

修改配置 nginx 增加緩存配置

ssl_session_cache shared:SSL:20m; 
# SSL session 緩存區(qū)大小
# 這條語句加在server段里話,在SSL Lab的測試中識別不出來月幌,因為它假設(shè)客戶端不支持SNI協(xié)議碍讯,但實際上是可以加在server段的
 
ssl_session_tickets on;
# 開啟瀏覽器的 Session Ticket 緩存
 
ssl_session_timeout 60m; 
# 過期時間,分鐘

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扯躺,一起剝皮案震驚了整個濱河市捉兴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缅帘,老刑警劉巖轴术,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钦无,居然都是意外死亡逗栽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門失暂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彼宠,“玉大人,你說我怎么就攤上這事弟塞∑鞠浚” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵决记,是天一觀的道長摧冀。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么索昂? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任建车,我火速辦了婚禮,結(jié)果婚禮上椒惨,老公的妹妹穿的比我還像新娘缤至。我一直安慰自己,他們只是感情好康谆,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布领斥。 她就那樣靜靜地躺著,像睡著了一般沃暗。 火紅的嫁衣襯著肌膚如雪月洛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天孽锥,我揣著相機與錄音膊存,去河邊找鬼。 笑死忱叭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的今艺。 我是一名探鬼主播韵丑,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虚缎!你這毒婦竟也來了撵彻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤实牡,失蹤者是張志新(化名)和其女友劉穎陌僵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體创坞,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡碗短,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了题涨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偎谁。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纲堵,靈堂內(nèi)的尸體忽然破棺而出巡雨,到底是詐尸還是另有隱情,我是刑警寧澤席函,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布铐望,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏正蛙。R本人自食惡果不足惜督弓,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跟畅。 院中可真熱鬧咽筋,春花似錦、人聲如沸徊件。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虱痕。三九已至睹耐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間部翘,已是汗流浹背硝训。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留新思,地道東北人窖梁。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像夹囚,于是被迫代替她去往敵國和親纵刘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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