使用acmesh免費開啓https(詳細概念介紹與操做步驟記錄)

前言

記錄一次使用acme.sh免費開啓https的過程,前半部分列舉一些用到的概念,後半部分記錄具體操做步驟。文章已調整好線性閱讀順序,按順序閱讀便可。流程中涉及的概念會盡可能進行講解,以減小閱讀此篇文章時,額外檢索產生的時間消耗html

概念

acme.sh

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

  • 一個徹底使用用Shell(Unix shell)語言編寫的ACME協議的客戶端
  • 支持ACME v1和ACME v2協議
  • 支持ACME v2通配符證書
  • 簡單,強大且很是易於使用。 您只需3分鐘便可學習
  • 和bash,dash, sh兼容
  • Let's Encrypt免費證書客戶端最簡單的shell腳本
  • 徹底用Shell編寫,不依賴python或官方的Let's Encrypt客戶端
  • 只需一個腳本便可發佈,續期和自動安裝證書
  • 不須要root/sudoer權限
  • 對Docker友好的
  • 支持IPv6
  • 對證書續期和錯誤等有cron job通知

Let's Encrypt

Let's Encrypt是一個於2015年三季度推出的數字證書認證機構,旨在以自動化流程消除手動建立和安裝證書的複雜流程,並推廣使萬維網服務器的加密鏈接無所不在,爲安全網站提供免費的SSL/TLS證書。
-- 摘自 維基百科

網站開啓https的時候須要證書,證書由CA機構(數字證書認證機構)簽發,大部分傳統CA機構簽發證書須要收費,這不利於https協議的推廣。Let's Encrypt也是一個CA機構,但它是免費簽發數字證書的,經過它,咱們能夠免費開啓httpsgithub

ACME(自動證書管理環境)

ACME協議最初是由 Internet Security Research Group 爲其公共 CA(公共證書頒發機構)——Let's Encrypt 開發的。ACME 協議經過在給定 Web 服務器上安裝證書管理代理來運行。組織或域在一開始就通過驗證,代理協助域控制驗證,一旦完成,代理能夠請求,續訂和撤銷證書。

詳情:ACME 協議:它是什麼以及如何工做——asiaregister.comweb

ACME協議具體的工做流程這裏就不細說了,感興趣的朋友能夠去詳情即原出處查看。算法

全站https,通配符證書

通配符證書是一個能夠被多個子域使用的公鑰證書,主域名簽發的通配符證書能夠在全部子域名中使用。在此以前,配置子域名也是須要每一個子域名單獨的申請證書的。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

1. 安裝acme.sh

輸入

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

wget -O -  https://get.acme.sh | sh

curl 命令

curl 命令是一個利用URL規則在命令行下工做的文件傳輸工具。它支持文件的上傳和下載,因此是綜合傳輸工具。

詳情:curl命令——linuxde.net

wget命令

wget 命令用來從指定的URL下載文件。wget很是穩定,它在帶寬很窄的狀況下和不穩定網絡中有很強的適應性,若是是因爲網絡的緣由下載失敗,wget會不斷的嘗試,直到整個文件下載完畢。若是是服務器打斷下載過程,它會再次聯到服務器上從中止的地方繼續下載。這對從那些限定了連接時間的服務器上下載大文件很是有用。

詳情:wget命令——linuxde.net

acmesh安裝內部流程

普通用戶和 root 用戶均可以安裝使用. 安裝過程進行了如下幾步:

  1. 把 acme.sh 安裝到你的 home 目錄(即~目錄)下:

    ~/.acme.sh/

    並建立一個 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

    (alias:中文釋意"別名")

  2. 自動爲你建立 cronjob, 天天 0:00 點自動檢測全部的證書, 若是快過時了, 須要更新, 則會自動更新證書。

更高級的安裝選項請參考: https://github.com/Neilpang/a...

安裝過程不會污染已有的系統任何功能和文件, 全部的修改都限制在安裝目錄中: ~/.acme.sh/

cron job

工具型軟件cron是一款類Unix操做系統下的基於時間的任務管理系統。用戶們能夠經過cron在固定時間、日期、間隔下,運行按期任務(能夠是命令和腳本)。cron經常使用於運維和管理,但也可用於其餘地方,如:按期下載文件和郵件。cron該詞來源於希臘語chronos(χρόνος),原意是時間。
——摘自 維基百科

博主最早使用curl命令進行安裝,但因爲網絡緣由,失敗了:

01 使用curl安裝acmesh,網絡問題,失敗.png

若是安裝成功,~目錄下,使用ls -la能夠查看到有一個.acme.sh目錄。

curl 命令安裝失敗後,改用wget命令,成功安裝:

02 使用wget安裝acmesh,成功.png

安裝信息中有一段醒目的紅色警告:

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

2. 生成證書

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服務器。

03 驗證域名全部權-1.png

04 驗證域名全部權-2.JPG

若是你用的 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方式這裏不細說了。

3. copy/安裝 證書

前面證書生成之後, 接下來須要把證書 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.pemcert.pem並不表示一個已經存在的文件,而是表示拷貝粘貼後的文件將被命名的名字。

05 拷貝acmesh生成的證書.png

nginx相關

nginx的安裝與使用:CentOS 7 下 yum 安裝和配置 Nginx

nginx的端口轉發:nginx反向代理——將80端口請求轉發到8080

nginx的配置文件路徑查看:nginx快速查看配置文件的方法

nginx.conf配置ssl

出處:linux nginx配置https

想要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.comwww.example.com 正常狀況下,此時能夠正常訪問域名,而且鏈接所使用的協議爲https。

4. 續期證書

目前證書在 60 天之後會自動續期, 你無需任何操做。從此有可能會縮短這個時間, 不過都是自動的, 你不用關心。

固然了,你能夠強制手動續期:

acme.sh --renew -d example.com --force

5. 如何中止證書續期

若是要中止證書續期,你能夠執行如下命令將證書從續期列表中移除:

acme.sh --remove -d example.com

cert/key 文件不會從硬盤中被移除。

你能夠自行移除隱藏目錄(例如::~/.acme.sh/example.com

6. 更新 acme.sh

目前因爲 acme 協議和 letsencrypt CA 都在頻繁的更新, 所以 acme.sh 也常常更新以保持同步。

升級 acme.sh 到最新版 :

acme.sh --upgrade

若是你不想手動升級, 能夠開啓自動升級:

acme.sh  --upgrade  --auto-upgrade

以後, acme.sh 就會自動保持更新了。

你也能夠隨時關閉自動更新:

acme.sh --upgrade  --auto-upgrade  0

-- END

相關文章
相關標籤/搜索