1. 程式人生 > 實用技巧 >使用ACME申請Lets Encrypt證書為網站新增HTTPS支援

使用ACME申請Lets Encrypt證書為網站新增HTTPS支援

內容轉載自我的部落格

目錄

1. 搭建Web服務

首先安裝python的flask庫,可以使用以下程式碼:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
然後編寫最簡單的flask專案,只需建立目錄/home/ubuntu/www/用於存放程式碼,建立目錄/home/ubuntu/www/log/用於存放日誌,再建立一個/home/ubuntu/www/main.py

檔案,內容如下:

# 匯入Flask類
from flask import Flask

# 例項化Flask
app = Flask(__name__)

# route()方法用於設定路由
@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    # host為0.0.0.0表示所有IP均可訪問此Web服務
    app.run(host="0.0.0.0", port=5000, debug=False)

最後輸入命令python3 main.py即可執行此專案

2. 安裝nginx

更新軟體源:sudo apt-get update
安裝nginx:sudo apt-get install nginx
訪問雲主機的ip確認nginx安裝成功
修改nginx配置檔案:sudo vi /etc/nginx/nginx.conf
http{}合適位置新增以下程式碼
一定要將http{}裡面的最後兩個include行註釋掉,修改才會生效

    server{
        listen 80;
        server_name web.example.cn;
        access_log /home/ubuntu/www/log/access.log;
        error_log /home/ubuntu/www/log/error.log;
        location /{
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass http://127.0.0.1:5000;
        }
    }

不重啟重新載入最新配置檔案內容:sudo service nginx reload
停止nginx服務:sudo service nginx stop
重啟nginx服務:sudo service nginx restart
另外在域名服務商新增一條名稱為web的A記錄解析到本雲主機的IP即可訪問http://web.example.cn,會看到網頁返回Hello, World!

3 安裝ACME自動簽發證書

https證書是Let's Encrypt網站簽發的,每次有限期三個月,手動申請很麻煩,所以使用ACME工具來自動申請和續期

3.1 安裝證書

安裝很簡單,只需要一個命令:curl https://get.acme.sh | sh
此命令實際幫使用者進行以下操作:

  • acme.sh安裝到使用者的home目錄下,即~/.acme.sh/
  • 建立一個bash的alias, 方便使用:alias acme.sh=~/.acme.sh/acme.sh
  • 自動建立cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書

如果~目錄下無.bashrc需要手動建立;如果使用者ssh重新登入,.bashrc檔案不會自動生效,需要進行下一步
終端輸入vim .bash_profile,然後寫入以下內容:

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

安裝過程不會汙染已有的系統任何功能和檔案, 所有的修改都限制在安裝目錄中: ~/.acme.sh/

3.2 生成證書

首先登入DNSPod,它已被騰訊雲收購,可直接使用騰訊雲賬戶登入。在裡面建立API介面和祕鑰。然後在命令列輸入:

export DP_Id="152345"
export DP_Key="235b55ffd5a4588aabbccee1e2e5a74a"
acme.sh --issue  -d example.cn -d *.example.cn --dns dns_dp

等待驗證DNS和建立證書即可(介面和祕鑰資訊會被自動儲存在~/.acme.sh/account.conf配置檔案,方便自動續期)。這裡生成主域名example.cn的證書和泛域名*.example.cn證書

3.3 安裝證書

sudo mkdir /etc/nginx/ssl/
sudo chmod -R 777 ssl
acme.sh --install-cert -d example.cn \
--key-file /etc/nginx/ssl/example.cn.key \
--fullchain-file /etc/nginx/ssl/example.cn.cer \
--reloadcmd "service nginx force-reload"

在終端輸入sudo vim /etc/nginx/ssl/example.cn.ssl.conf來建立ssl配置的單檔案example.cn.ssl.conf,檔案內容為:

ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate ssl/example.cn.cer;
ssl_certificate_key ssl/example.cn.key;

最後sudo vim /etc/nginx/nginx.confserver{}裡面新增一行:include ssl/example.cn.ssl.conf;,最終的程式碼如下:

    server{
        listen 80;
        server_name web.example.cn;
        access_log /home/ubuntu/www/log/access.log;
        error_log /home/ubuntu/www/log/error.log;
        include ssl/example.cn.ssl.conf;
        location /{
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass http://127.0.0.1:5000;
        }
    }

此時不重啟重新載入最新nginx配置檔案內容sudo service nginx reload,即可訪問https://web.example.cn,會看到網頁返回Hello, World!

4. 使用logrotate自動切割日誌檔案

如果某個web服務自己會產生日誌(步驟1中的Python程式,可以使用logging.handlers.RotatingFileHandler來分割日誌檔案),且沒有自帶的分割日誌檔案的功能,那麼我們可以藉助logrotate實現分割,這裡我們對nginx的日誌檔案進行分割
建立/etc/logrotate.d/nginx-myweb檔案,內容如下

/home/ubuntu/www/log/access.log /home/ubuntu/www/log/error.log{
    weekly
    minsize 10M
    rotate 10
    missingok
    dateext
    notifempty
    sharedscripts
    postrotate
        [ -e /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    endscript
}

系統會定時執行logrotate,一般是每天一次,可以在此檔案/etc/cron.daily/logrotate檢視

5. 配置nginx切割日誌檔案

nginx的配置檔案中,新增以下內容,這種方法只能切割檔案,不能自動刪除過時檔案:

# 可以位於http、server塊
map $time_iso8601 $logdate {
  '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
  default                       'date-not-found';
}

# 一般位於server塊
access_log /home/ubuntu/www/log/access_www-$logdate.log;
error_log /home/ubuntu/www/log/error_www-$logdate.log;
# 提高日誌效率,不是控制日誌檔案個數
open_log_file_cache max=10;

如果發現只是建立檔案'error_www-$logdate.log',且內容包括以下部分:

"/home/ubuntu/www/log/access_www-2020-09-28.log" failed (13: Permission denied) while logging request

這說明nginx的許可權無法建立檔案/home/ubuntu/www/log/access_www-2020-09-28.log,則需要以下步驟:

# 把使用者新增到當前使用者組
sudo gpasswd -a www-data ubuntu
# 新增許可權
sudo chmod -R a+w /home/ubuntu/frp/log
# 如果還是出錯的話,直接修改/etc/nginx/nginx.conf檔案
# 把user改為ubuntu即可