centos 7 nginx 配置Let's Encrypt證書,並自動更新


Let’s Encrypt 是 一個叫 ISRG ( Internet Security Research Group ,互聯網安全研究小組)的組織推出的免費安全證書計划。參與這個計划的組織和公司可以說是互聯網頂頂重要的先驅,除了前文提到的三個牛氣哄哄的發起單位外,后來又有思科(全球網絡設備制造商執牛耳者)、 Akamai 加入,甚至連 Linux 基金會也加入了合作,這些大牌組織的加入保證了這個項目的可信度和可持續性

后來 ISRG 的發起者 EFF (電子前哨基金會)為 Let’s Encrypt 項目發布了一個官方的客戶端 Certbot ,利用它可以完全自動化的獲取、部署和更新安全證書。這真是非常容易、方便呀,所以我們就可以直接使用官方客戶端,不需要再使用第三方的工具了。雖然第三方工具也可以使用,但是官方工具更權威,風險也更小,而且遇到問題也更容易解決,畢竟有官方的支持。

前期准備工作

  1. 國內部署的話域名一定要備案,沒備案過的話1是自動下載證書無法驗證通過 2是即使手工下載證書配置后同樣無法訪問
  2. 域名DNS解析映射到nginx服務器上
  3. Nginx要先安裝好ssl模塊,參考 https://www.cnblogs.com/nickchou/p/12678354.html

配置內容參考 :https://blog.51cto.com/wzlinux/2385116

一、安裝certbot

官網地址 https://certbot.eff.org/,安裝方法參考官方推薦步驟

yum install certbot python2-certbot-nginx

二、獲取證書(有手動獲取,用certbot自動獲取等方式,下面主要是說明自動獲取)

把下面的domain.com 和email@qq.com 換成自己的域名和郵箱

certbot certonly --nginx --nginx-server-root /usr/local/nginx/conf -d www.domain.com -d domain.com -m email@qq.com

參數說明:
certonly:意思是只安裝證書,手動配置nginx,也可以不加certonly按照步驟提示一步一步進行
--nginx-server-root:是指定nginx conf目錄,有時候nginx是從源碼安裝或者更改過conf的路徑后需要顯示指定,不配置默認在/etc/nginx/nginx.conf去找
如果路徑不是/etc/nginx/nginx.conf會報錯

-d 指定域名,也可以填多個
-m 設置郵箱,證書過期會郵件提醒

出現報錯的解決辦法
1.ImportError: cannot import name UnrewindableBodyError
解決辦法,重裝 urllib3 庫:

pip uninstall urllib3
pip install urllib3

2.pkg_resources.DistributionNotFound: The 'urllib3<1.23,>=1.21.1' distribution was not found and is required by requests
解決辦法

easy_install urllib3==1.21.1

3.ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.
解決辦法

pip install --upgrade --force-reinstall 'requests==2.6.0'

以下是安裝成功后的截圖

默認證書的安裝路徑

cd /etc/letsencrypt/live

總共有4個文件

三、手動配置nginx ssl

cd /usr/local/nginx/conf
vi nginx.conf

添加配置,注意下面的domain.com改成自己的域名,保存退出

    server {
        listen       80;
        server_name  domain.com;
        # http重定向到https
        return       301 https://www.domain.com$request_uri;
    }

    server {
        listen       80;
        server_name  www.domain.com;
        # http重定向到https
        return       301 https://$server_name$request_uri;
    }

    server {
        # nginx1.15之后用這個語法,1.15之前用 ssl on
        listen       443 ssl;
        server_name  www.domain.com;
        # 這里的證書填剛剛生成的路徑
        ssl_certificate   /etc/letsencrypt/live/www.domain.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/www.domain.com/privkey.pem;
        # 這里加載默認的ssl配置
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://127.0.0.1:8081;
            proxy_redirect off;
        }
    }

nginx 熱重啟

nginx -s reload

然后打開自己的網頁就可以看了。注意:阿里雲服務器的話記得檢查好下安全配置443端口是否打開

查看證書,有效期是3個月

四、配置自動更新證書

測試自動更新,--dry-run 表示測試更新,非真正執行更新

certbot renew --dry-run

出現錯誤:

解決辦法:

vi /usr/lib/python2.7/site-packages/sitecustomize.py

加入以下內容保存后退出

import sys 
sys.setdefaultencoding('utf-8') 

再次執行測試更新,下圖為測試更新成功!!

測試更新成功后,添加定時任務自動更新
下面是每個月的1,8,20號零點自動檢查更新證書,一般在正式過期前30天內可以更新成功。可以 cd /etc/letsencrypt/renewal 查看

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

更新日志的查看

cd /var/log/letsencrypt

查看定時任務

cat /etc/crontab

五、手動更新證書

certbot renew -v

六、其他

查看證書過期時間,這個指令稍微有點慢

certbot certificates


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM