使用ACME申請Lets Encrypt證書為網(wǎng)站添加HTTPS支持

內(nèi)容轉載自我的博客

1. 搭建Web服務

首先安裝python的flask庫,可以使用以下代碼:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
然后編寫最簡單的flask項目,只需創(chuàng)建目錄/home/ubuntu/www/用于存放代碼,創(chuàng)建目錄/home/ubuntu/www/log/用于存放日志,再創(chuàng)建一個/home/ubuntu/www/main.py文件,內(nèi)容如下:

# 導入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;
        }
    }

不重啟重新載入最新配置文件內(nèi)容:sudo service nginx reload
停止nginx服務:sudo service nginx stop
重啟nginx服務:sudo service nginx restart
另外在域名服務商添加一條名稱為web的A記錄解析到本云主機的IP即可訪問http://web.example.cn,會看到網(wǎng)頁返回Hello, World!

3 安裝ACME自動簽發(fā)證書

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

3.1 安裝證書

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

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

如果~目錄下無.bashrc需要手動創(chuàng)建;如果用戶ssh重新登錄,.bashrc文件不會自動生效,需要進行下一步
終端輸入vim .bash_profile,然后寫入以下內(nèi)容:

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

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

3.2 生成證書

首先登錄DNSPod,它已被騰訊云收購,可直接使用騰訊云賬戶登錄。在里面創(chuàng)建API接口和秘鑰。然后在命令行輸入:

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

等待驗證DNS和創(chuàng)建證書即可(接口和秘鑰信息會被自動保存在~/.acme.sh/account.conf配置文件,方便自動續(xù)期)。這里生成主域名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來創(chuàng)建ssl配置的單文件example.cn.ssl.conf,文件內(nèi)容為:

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配置文件內(nèi)容sudo service nginx reload,即可訪問https://web.example.cn,會看到網(wǎng)頁返回Hello, World!

4. 使用logrotate自動切割日志文件

如果某個web服務自己會產(chǎn)生日志(步驟1中的Python程序,可以使用logging.handlers.RotatingFileHandler來分割日志文件),且沒有自帶的分割日志文件的功能,那么我們可以借助logrotate實現(xiàn)分割,這里我們對nginx的日志文件進行分割
創(chuàng)建/etc/logrotate.d/nginx-myweb文件,內(nèi)容如下

/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
}

系統(tǒng)會定時運行logrotate,一般是每天一次,可以在此文件/etc/cron.daily/logrotate查看

5. 配置nginx切割日志文件

nginx的配置文件中,添加以下內(nèi)容,這種方法只能切割文件,不能自動刪除過時文件:

# 可以位于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;
# 提高日志效率,不是控制日志文件個數(shù)
open_log_file_cache max=10;

如果發(fā)現(xiàn)只是創(chuàng)建文件'error_www-$logdate.log',且內(nèi)容包括以下部分:

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

這說明nginx的權限無法創(chuàng)建文件/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即可
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容