記錄一次使用acme.sh免費開啓https的過程,前半部分列舉一些用到的概念,後半部分記錄具體操做步驟。文章已調整好線性閱讀順序,按順序閱讀便可。流程中涉及的概念會盡可能進行講解,以減小閱讀此篇文章時,額外檢索產生的時間消耗。html
acme.sh是github上的一個開源項目,實現了acme協議, 能夠從letsencrypt生成免費的證書。
官方文檔(官方文檔的使用說明很詳細,推薦閱讀):python
英文:https://github.com/acmesh-official/acme.shlinux
中文:https://github.com/acmesh-official/acme.sh/wiki/說明nginx
acme.sh 有如下特色(摘自官方文檔):git
Let's Encrypt
免費證書客戶端最簡單的shell腳本Let's Encrypt
客戶端Let's Encrypt
是一個於2015年三季度推出的數字證書認證機構,旨在以自動化流程消除手動建立和安裝證書的複雜流程,並推廣使萬維網服務器的加密鏈接無所不在,爲安全網站提供免費的SSL/TLS證書。
-- 摘自 維基百科
網站開啓https的時候須要證書,證書由CA機構(數字證書認證機構)簽發,大部分傳統CA機構簽發證書須要收費,這不利於https協議的推廣。Let's Encrypt
也是一個CA機構,但它是免費簽發數字證書的,經過它,咱們能夠免費開啓httpsgithub
ACME協議最初是由 Internet Security Research Group 爲其公共 CA(公共證書頒發機構)——Let's Encrypt 開發的。ACME 協議經過在給定 Web 服務器上安裝證書管理代理來運行。組織或域在一開始就通過驗證,代理協助域控制驗證,一旦完成,代理能夠請求,續訂和撤銷證書。
詳情:ACME 協議:它是什麼以及如何工做——asiaregister.comweb
ACME協議具體的工做流程這裏就不細說了,感興趣的朋友能夠去詳情即原出處查看。算法
通配符證書是一個能夠被多個子域使用的公鑰證書,主域名簽發的通配符證書能夠在全部子域名中使用。在此以前,配置子域名也是須要每一個子域名單獨的申請證書的。2018年3月14日,Let’s Encrypt
對外宣佈ACME v2已正式支持通配符證書,這意外味着用戶能夠在 Let’s Encrypt
上免費申請支持通配符的SSL證書。shell
官方文檔(官方文檔的使用說明很詳細,推薦閱讀):apache
英文:https://github.com/acmesh-official/acme.sh
中文:https://github.com/acmesh-official/acme.sh/wiki/說明
本文使用的操做系統(Linux各版本操做步驟基本一致):CentOS 7.3
輸入
curl https://get.acme.sh | sh
或
wget -O - https://get.acme.sh | sh
curl 命令
curl 命令是一個利用URL規則在命令行下工做的文件傳輸工具。它支持文件的上傳和下載,因此是綜合傳輸工具。
wget命令
wget 命令用來從指定的URL下載文件。wget很是穩定,它在帶寬很窄的狀況下和不穩定網絡中有很強的適應性,若是是因爲網絡的緣由下載失敗,wget會不斷的嘗試,直到整個文件下載完畢。若是是服務器打斷下載過程,它會再次聯到服務器上從中止的地方繼續下載。這對從那些限定了連接時間的服務器上下載大文件很是有用。
acmesh安裝內部流程
普通用戶和 root 用戶均可以安裝使用. 安裝過程進行了如下幾步:
把 acme.sh 安裝到你的 home 目錄(即~目錄)下:
~/.acme.sh/
並建立一個 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
(alias:中文釋意"別名")
更高級的安裝選項請參考: https://github.com/Neilpang/a...
安裝過程不會污染已有的系統任何功能和文件, 全部的修改都限制在安裝目錄中: ~/.acme.sh/
cron job
工具型軟件cron是一款類Unix操做系統下的基於時間的任務管理系統。用戶們能夠經過cron在固定時間、日期、間隔下,運行按期任務(能夠是命令和腳本)。cron經常使用於運維和管理,但也可用於其餘地方,如:按期下載文件和郵件。cron該詞來源於希臘語chronos(χρόνος),原意是時間。
——摘自 維基百科
博主最早使用curl命令進行安裝,但因爲網絡緣由,失敗了:
若是安裝成功,~目錄下,使用ls -la
能夠查看到有一個.acme.sh目錄。
curl 命令安裝失敗後,改用wget命令,成功安裝:
安裝信息中有一段醒目的紅色警告:
It is recommended to install socat first.We use socat for standalone server if you use standalone mode.If you don't use standalone mode, just ignore this warning.
即:
推薦先安裝socat。若是你使用standalone mode,那麼咱們須要爲了standalone server使用socat。若是你不使用standalone mode,那麼請忽略這條警告
standalone mode 非開啓https必須,在官方英文文檔中被另外一些配置用到(4. Use Standalone server to issue cert
5. Use Standalone ssl server to issue cert
),若是感興趣的話能夠去看官方英文文檔。
簡略介紹一下socat:
socat
socat 是一個多功能的網絡工具,名字來由是「Socket CAT」,能夠看做是 netcat 的增強版。它有一些netcat所不具有卻又頗有需求的功能,例如ssl鏈接。socat是強大的,能夠實現任意socket的轉換。而netcat被稱爲網絡工具中的瑞士軍刀,體積小巧,但功能強大。netcat能夠在兩臺設備上面相互交互,即偵聽模式/傳輸模式。
想要安裝socat的話,可使用yum安裝socat:
yum install socat
acme.sh 實現了 acme 協議支持的全部驗證協議. 通常有兩種方式驗證: http 和 dns 驗證。
1.http 方式(推薦)
http 方式須要在你的網站根目錄下放置一個文件, 來驗證你的域名全部權。完成驗證, 而後就能夠生成證書了。
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只須要指定域名, 並指定域名所在的網站根目錄。 acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 而後自動完成驗證。最後會聰明的刪除驗證文件,整個過程沒有任何反作用。
第二個參數"example.com" 是您要爲其頒發證書的主要域。這裏至少要填寫一個域名。
博主的網站根目錄填寫的是tomcat服務器的webapps目錄,文章後面有不須要你不須要指定網站根目錄的辦法。nginx服務器在80端口作轉發,轉發到8080端口的tomcat服務器。
若是你用的 apache服務器, acme.sh 還能夠智能的從 apache的配置中自動完成驗證, 你不須要指定網站根目錄:
acme.sh --issue -d mydomain.com --apache
若是你用的 nginx服務器, 或者反代, acme.sh 還能夠智能的從 nginx的配置中自動完成驗證, 你不須要指定網站根目錄:
acme.sh --issue -d mydomain.com --nginx
證書每60天自動更新一次。
請注意, 不管是 apache 仍是 nginx 模式, acme.sh在完成驗證以後, 都會將服務器配置文件恢復到以前的狀態, 不會私自更改你自己的配置。 好處是你不用擔憂配置被搞壞, 也有一個缺點, 你須要本身配置 ssl 的配置。acme.sh只能成功生成證書, 須要手動配置ssl,才能訪問https。這樣作雖然麻煩,可是爲了配置的安全, 你仍是本身手動改配置吧。
這裏"你須要本身配置 ssl 的配置"的意思是:
爲服務器安裝ssl模塊(Apache默認沒有預裝,須要自行安裝。nginx默認預裝了ssl模塊,無需再次安裝)。而後在服務器的配置文件中,寫證書位置(在第3.步中咱們將完成此項操做)。
2.手動 dns 方式(如使用第一種,可忽略第二種方法)
手動在域名上添加一條 txt 解析記錄, 驗證域名全部權。
這種方式的好處是, 你不須要任何服務器, 不須要任何公網 ip, 只須要 dns 的解析記錄便可完成驗證。 壞處是,若是不一樣時配置 Automatic DNS API,使用這種方式 acme.sh 將沒法自動更新證書,每次都須要手動從新解析驗證域名全部權。
第二種使用方式請見官方文檔(文章開頭連接),博主使用的http方式,手動dns方式這裏不細說了。
前面證書生成之後, 接下來須要把證書 copy 到真正須要用它的地方。
請注意,默認生成的證書都放在安裝目錄下: ~/.acme.sh/, 請不要直接使用此目錄下的文件,例如: 不要直接讓 nginx/apache 的配置文件使用這下面的文件。這裏面的文件都是acmesh工具內部使用, 目錄結構在未來可能會變化,進而致使服務器配置文件中填寫的證書路徑錯誤的狀況。
正確的使用方法是使用 --installcert
命令,並指定目標位置, 而後證書文件會被copy到相應的位置, 例如:
Apache example
acme.sh --installcert -d example.com \ --cert-file /path/to/certfile/in/apache/cert.pem \ --key-file /path/to/keyfile/in/apache/key.pem \ --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \ --reloadcmd "service apache2 force-reload"
Nginx example
acme.sh --installcert -d example.com \ --key-file /path/to/keyfile/in/nginx/key.pem \ --fullchain-file /path/to/fullchain/nginx/cert.pem \ --reloadcmd "service nginx force-reload"
(一個小提醒, 這裏用的是 service nginx force-reload, 不是 service nginx reload, 據測試, reload 並不會從新加載證書, 因此用的 force-reload)
Nginx 的配置 ssl_certificate
使用 /etc/nginx/ssl/fullchain.cer
,而非 /etc/nginx/ssl/<domain>.cer
,不然 SSL Labs 的測試會報 Chain issues Incomplete
錯誤。
--installcert
命令能夠攜帶不少參數, 來指定目標文件。 而且能夠指定 reloadcmd, 當證書更新之後, reloadcmd會被自動調用,讓服務器生效。
–reloadcmd 「service nginx force-reload」
是爲了在讓acmesh 自動更新時候可以重啓nginx使得證書生效。
值得注意的是, 這裏指定的全部參數都會被自動記錄下來, 並在未來證書自動更新之後, 被再次自動調用。
首先,咱們須要新建一個路徑用於存放拷貝的證書(路徑可自定義)。習慣是放在/etc/nginx/ssl/目錄下。博主新建的路徑:
/etc/nginx/ssl/jellyfishmix
執行(nginx方式)
acme.sh --installcert -d jellyfishmix.com \ --key-file /etc/nginx/ssl/jellyfishmix/key.pem \ --fullchain-file /etc/nginx/ssl/jellyfishmix/cert.pem \ --reloadcmd "service nginx force-reload"
--key-file
參數填寫:你的自定義路徑 + key.pem
--fullchain-file
參數填寫:你的自定義路徑 + cert.pem
這裏的key.pem
和cert.pem
並不表示一個已經存在的文件,而是表示拷貝粘貼後的文件將被命名的名字。
nginx相關
nginx的安裝與使用:CentOS 7 下 yum 安裝和配置 Nginx
nginx的端口轉發:nginx反向代理——將80端口請求轉發到8080
nginx的配置文件路徑查看:nginx快速查看配置文件的方法
nginx.conf配置ssl
想要https就要監聽443端口,nginx.conf已經預留出了server,只要咱們放開權限,修改便可。
監聽443端口
server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/nginx/ssl/jellyfishmix/cert.pem; ssl_certificate_key /etc/nginx/ssl/jellyfishmix/key.pem; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服務器端支持的協議版本 ssl_ciphers HIGH:!aNULL:!MD5; #ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #指定加密算法 ssl_prefer_server_ciphers on; #在使用SSLv3和TLS協議時指定服務器的加密算法要優先於客戶端的加密算法 }
注:ssl_certificate 和 ssl_certificate_key 的路徑就是咱們ssl證書申請的路徑
ssl_certificate
證書實際上是個公鑰,它會被髮送到鏈接服務器的每一個客戶端,ssl_certificate_key私鑰是用來解密的,因此它的權限要獲得保護但nginx的主進程可以讀取。固然私鑰和證書能夠放在一個證書文件中,這種方式也只有公鑰證書才發送到client。
ssl_session_timeout
客戶端能夠重用會話緩存中ssl參數的過時時間,內網系統默認5分鐘過短了,能夠設成30m即30分鐘甚至4h。
ssl_protocols
指令用於啓動特定的加密協議,nginx在1.1.13和1.0.12版本後默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 如今還有不少地方在用但有很多被攻擊的漏洞。
ssl_ciphers
選擇加密套件,不一樣的瀏覽器所支持的套件(和順序)可能會不一樣。這裏指定的是OpenSSL庫可以識別的寫法,你能夠經過 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(後面是你所指定的套件加密算法) 來看所支持算法。
ssl_prefer_server_ciphers on
設置協商加密算法時,優先使用咱們服務端的加密套件,而不是客戶端瀏覽器的加密套件。
監聽80端口
server { listen 80; server_name www.example.com; rewrite ^(.*) https://$server_name$1 permanent; }
由於http是默認端口,監聽80端口可讓http重定向到https端口上。
博主的nginx.conf(部分,如要複製,請把全部"jellyfishmix.com"字樣替換成本身的域名,證書路徑替換爲本身的路徑):
server { # listen 80 default_server; # listen [::]:80 default_server; # server_name _; listen 443 ssl; server_name www.jellyfishmix.com; ssl_certificate /etc/nginx/ssl/jellyfishmix/cert.pem; ssl_certificate_key /etc/nginx/ssl/jellyfishmix/key.pem; ssl_session_timeout 5m; # 指定SSL服務器端支持的協議版本 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 指定加密算法 ssl_ciphers HIGH:!aNULL:!MD5; # 在使用SSLv3和TLS協議時指定服務器的加密算法要優先於客戶端的加密算法 ssl_prefer_server_ciphers on; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://39.97.254.25:8080; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 80; server_name www.jellyfishmix.com; rewrite ^(.*) https://$server_name$1 permanent; }
而後從新加載nginx:
systemctl reload nginx
此時請訪問本身的域名:example.com
或www.example.com
正常狀況下,此時能夠正常訪問域名,而且鏈接所使用的協議爲https。
目前證書在 60 天之後會自動續期, 你無需任何操做。從此有可能會縮短這個時間, 不過都是自動的, 你不用關心。
固然了,你能夠強制手動續期:
acme.sh --renew -d example.com --force
若是要中止證書續期,你能夠執行如下命令將證書從續期列表中移除:
acme.sh --remove -d example.com
cert/key 文件不會從硬盤中被移除。
你能夠自行移除隱藏目錄(例如::~/.acme.sh/example.com
)
目前因爲 acme 協議和 letsencrypt CA 都在頻繁的更新, 所以 acme.sh 也常常更新以保持同步。
升級 acme.sh 到最新版 :
acme.sh --upgrade
若是你不想手動升級, 能夠開啓自動升級:
acme.sh --upgrade --auto-upgrade
以後, acme.sh 就會自動保持更新了。
你也能夠隨時關閉自動更新:
acme.sh --upgrade --auto-upgrade 0
-- END