通過 Certbot 安裝 Let's Encrypt 證書,實現免費的全站 HTTPS 訪問

削個椰子皮_給個梨發表於2021-06-14

參考文獻

通過 Certbot 安裝 Let’s Encrypt 證照,來實現全站的 HTTPS 訪問

學院軍 - 將部落格應用從 HTTP 協議免費升級到 HTTPS

certbot官網地址

  • 開啟首頁先選擇自己的系統版本 (我這裡採用的 web 伺服器是 nginx,系統是 centos7 )傳輸門

certbot頁面選擇自己的系統版本

  • 可以按照官網提供的操作文件執行命令

# 安裝 certbot 客戶端工具

sudo yum install certbot python2-certbot-nginx

# 自動檢測 nginx 配置以及確定哪些網站需要配置 ssl (會列出全部的 nginx 配置資訊)

sudo certbot --nginx

# 設定 crontab 計劃任務,自動更新 ssl 證照

echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

以下記錄本人安裝 certbot 的整個過程

系統環境

伺服器:阿里雲伺服器
系統: centos 7
web 伺服器: nginx
安裝過寶塔 (安裝過寶塔後,nginx 的主配置檔案位於 /www/server/nginx/conf/

整體流程是按照官網的流程來操作的,但是其中會遇到各種問題,出現的問題如下:

  1. 安裝 certbot 客戶端工具 (此流程正常),安裝過程中,該直接回車的就回車,該直接選 Yes 的輸入 Y 然後回車

sudo yum install certbot python2-certbot-nginx
  1. 配置 ssl 時,一路出錯,如下:

sudo certbot --nginx

重要錯誤資訊如下:


pkg_resources.ContextualVersionConflict: (cryptography 2.1 (/usr/lib64/python2.7/site-packages), Requirement.parse('cryptography>=2.3'), set(['PyOpenSSL']))

PyOpenSSL相關報錯資訊

檢視 PyOpenSSL 版本資訊,發現確實是版本過低的原因


pip show PyOpenSSL

解決方案:更新相應的 python 包


pip install -U PyOpenSSL

pip install -U cryptography

再次執行以下命令


sudo certbot --nginx

再次發現報錯,錯誤資訊如下:


ImportError: cannot import name UnrewindableBodyError

解決方案:安裝相應的 python 包


# 更新 pip
pip install --upgrade pip

# 解除安裝 urllib3
pip uninstall urllib3

# 重新再次下載
pip install urllib3

再次執行以下命令


sudo certbot --nginx

再次發現報錯,錯誤資訊如下:


ImportError: No module named urllib3.exceptions  

解決方案:直接暴力下載相應的 pyOpenSSL 包


yum -y install http://cbs.centos.org/kojifiles/packages/pyOpenSSL/16.2.0/3.el7/noarch/python2-pyOpenSSL-16.2.0-3.el7.noarch.rpm

再次執行以下命令


sudo certbot --nginx

繼續報錯,如下:


Error while running nginx -c /etc/nginx/nginx.conf -t.

nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed

The nginx plugin is not working; there may be problems with your existing configuration.
The error was: MisconfigurationError('Error while running nginx -c /etc/nginx/nginx.conf -t.\n\nnginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)\nnginx: configuration file /etc/nginx/nginx.conf test failed\n',)

nginx 主配置檔案 /etc/nginx/nginx.conf  沒有檢測到

原因是:寶塔將 nginx 的主配置檔案安裝在 /www/server/nginx/conf/ 目錄下,然而 certbot 預設在掃描 /etc/nginx/nginx.conf 檔案,故而找不到 nginx 的配置檔案

解決方案:指定 nginx 的配置目錄,執行以下命令


sudo certbot --nginx --nginx-server-root=/www/server/nginx/conf/

然而不幸的是,依然還是報錯,報錯資訊如下:


An unexpected error occurred:
TypeError: from_buffer() cannot return the address of the raw string within a str or unicode or bytearray object

image.png

解決方案:更新 cffi 包,執行以下命令


pip install --upgrade cffi

安裝完畢之後,再次執行以下命令


sudo certbot --nginx --nginx-server-root=/www/server/nginx/conf/

image.png

image.png

發現還是報錯,報錯資訊如下:


An unexpected error occurred:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 310-328: ordinal not in range(128)

關於 ascii 報錯,這篇文章有詳細的介紹 通過 Certbot 安裝 Let’s Encrypt 證照,來實現全站的 HTTPS 訪問

解決方案是:檢查你選擇的需要配置的 nginx 配置檔案中是否含有中文,將所有的中文去掉就好了

去掉之後,再次執行以下命令


sudo certbot --nginx --nginx-server-root=/www/server/nginx/conf/

image.png

大功告成!

對比一下沒有配置 ssl 之前的 nginx 配置

沒有配置 ssl 之前的 nginx 資訊


server
{
    server_name www.pudongping.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.pudongping.com;

    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

}

配置 ssl 之後的配置資訊 (現在配置檔案中,預設強制性重定向了 https)


server
{
    server_name www.pudongping.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.pudongping.com;

    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.pudongping.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.pudongping.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server
{
    if ($host = www.pudongping.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name www.pudongping.com;
    return 404; # managed by Certbot


}

自動更新證照

由於 Let’s Encrypt 預設的有效期是 90 天,所以如果你的應用需要在生產環境長期提供服務,還要在證照到期之後更新證照,我們可以通過 certbot renew 命令來更新證照,你可以通過如下命令來測試該命令是否生效:


sudo certbot renew --dry-run

如果在輸出中看到如下字樣,則表示生效:

Congratulations

當然,真實環境中通過手動維護是不現實的,我們可以藉助 Crontab 來編寫一個定時任務,每個月都強制更新一個這個證照,然後重啟 Nginx:


0 0 1 * * certbot renew
5 0 1 * * service nginx restart

或者直接執行官方提供的命令


echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

關於目錄

  • Certbot 的配置檔案目錄在 /etc/letsencrypt
  • Certbot 的 log 預設路徑在 /var/log/letsencrypt
  • 網站對應的 .pem 檔案路徑在 /etc/letsencrypt/live/網站名稱/privkey.pem
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章