如何在Linux主機中安裝 Let’s Encrypt 的加密 SSL安全憑證(Nginx)

本教學將向您展示如何使用 Let’s Encrypt 的加密證書頒發機構免費頒發的TLS證書在Linux主機上安裝和保護Nginx Web伺服器。此外,我們將在證書過期之前使用cron作業配置 Let’s Encrypt 的加密TLS證書的自動續訂。

TLS,也稱為傳輸層安全性,是一種網路協定,它使用SSL證書加密在伺服器和用戶端之間或Web伺服器(如Nginx伺服器)和瀏覽器之間流動的網路流量。在這兩個實體之間交換的所有資料都是安全的,即使使用諸如中間攻擊或封包嗅探的人之類的技術攔截連線,也不能解密連線。該certbot套服軟體是可以在生成和Linux主機中下載免費讓我們的加密證書的過程中使用讓我們的加密CA提供的官方用戶端工具。

要求

  • 在Linux主機中安裝LEMP Stack。
  • 具有正確DNS記錄的公共註冊域名(子域的A記錄或CNAME記錄)。
  • 直接訪問伺服器控制台或遠端SSH訪問伺服器。
  • 具有root權限或直接訪問root帳戶的使用者帳戶。

安裝Certbot用戶端實用程式

為了從Debian官方存儲庫安裝Debian 9中的Let’s Encrypt cerbot使用者端實用程式,開啟終端並以root權限發出以下指令,如以下螢幕快照所示。

 

apt-get install certbot


Debian apt 實用程式是Linux主機主程式包管理器的指令行介面,經由一些初步檢查後,會詢問您是否同意繼續安裝certbot程式包及其所有必需的依賴項。在伺服器的控制台提示符下接受使用yes(y)安裝軟體答案的過程。

取得Let的加密證書

要為域生成和下載 Let’s Encrypt 的加密證書,首先要確保Nginx Web伺服器已啟動並運行,並且至少可以從Internet訪問連接埠80。要驗證Nginx是否正在運行,請使用root權限執行以下指令。

sudo systemctl status nginx

如果伺服器尚未運行,請使用以下指令啟動Nginx守護程式。

sudo systemctl start nginx

如果您在Linux主機中安裝了通用防火牆,例如UFW防火牆,它會阻止連接埠80和443上的所有傳入連線,請發出以下指令以在系統中開啟HTTP和HTTPS連接埠。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

要取得域的證書,請在控制台中使用以下參數和標誌執行cerbot指令,如下所述。使用root權限運行指令,並使用-d標誌提供您要取得證書的域名和所有其他子域。此外,提供–standalone選項以使certbot不會干擾Nginx配置檔。使用此選項頒發證書時,必須停止Nginx伺服器。

cerbot命令語法:

sudo certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

首次運行certbot指令並取得證書時,系統將提示您加入電子信件位址並同意Let’s Encrypt的加密服務條款。寫上「 a 」表示同意服務條款「 no」,不與Let’s Encrypt合作夥伴共享您的電子信件位址。最後,在獲得域名證書後,請閱讀頁腳註釋以尋找證書系統路徑及其過期日期。

取得 Let’s Encrypt 加密SSL證書的替代方法

要通過「 webroot 」外掛程式取得 Let’s Encrypt 的加密證書,請使用以下語法。加入Nginx Web根目錄,預設情況下位於/ var / www / html / system路徑中,同時發出帶有–webroot和-w標誌的certbot指令。此外,請確保Nginx對Web根目錄具有完全寫入權限,以便建立/.well-known目錄。

該 –webrot 為cerbot選項也將要求你把你的電子信件位址,證書更新和安全知會。 Certbot 用戶端具有可以檢驗虛假電子信件位址的內建代碼。您必須提供可公開訪問的電子信件位址才能繼續取得證書。

certbot certonly --webroot -w / var / www / html / -d yourdomain.com -d www.yourdomain.com

將除錯日誌儲存到/var/log/letsencrypt/letsencrypt.log

輸入電子信件位址(用於緊急續訂和安全知會)(輸入’c’即可

取消):[email protected] #一個假的電子信件位址將被檢驗

這個位址似乎有問題。輸入電子信件位址(用於

緊急更新和安全知會)如果你真的想略過這個,你可以

使用–register-unsafely-without-email運行用戶端,但請確保您

從/ etc / letsencrypt / accounts備份您的帳戶密鑰(輸入’c’取消):[email protected]

請閱讀服務條款

https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf。你必須同意

為了在ACME服務器註冊

https://acme-v01.api.letsencrypt.org/directory

(A)gree/(C)ancel: a

您是否願意與Electronic Frontier分享您的電子信件位址?

基金會,Let’s Encrypt項目的創始合夥人和非盈利組織

開發Certbot的組織?我們想向您傳送有關EFF和的電子信件

我們的工作是加密網路,保護使用者並捍衛數字版權。

(Y)es /(N)o:n

獲得新證書

執行以下挑戰:

http:01挑戰www.domain.com

對所有不匹配的域使用webroot路徑/ var / www / html /。

等待驗證……

清理挑戰

重要筆記:

– 恭喜!您的證書和鏈已保存在

/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem。你的

證書將於2017年12月28日到期。獲取新版本或經過調整的版本

將來只需運行certbot即可獲得此證書。至

非交互式更新*所有*您的證書,運行“certbot

更新”

– 您的帳戶憑據已保存在您的Certbot中

/ etc / letsencrypt中的配置目錄。你應該

立即對此文件夾進行安全備份。這個配置

目錄還將包含獲得的證書和私鑰

通過Certbot,所以定期備份這個文件夾是理想的。

– 如果您喜歡Certbot,請考慮通過以下方式支持我們的工作:

捐贈給ISRG /讓我們加密:https://letsencrypt.org/donate

捐贈給EFF:https//eff.org/donate-le

配置Nginx for TLS(SSL)

域的Nginx完整預設TLS配置檔應如下面的檔案摘錄中所示。

/ etc / nginx / sites-enabled / default-ssl檔案示例:

 server {
                    listen 443 ssl default_server;
                    listen [::]:443 ssl default_server;
       
                server_name  www.yourdomain.com yourdomain.com;
                #server_name _;
                                
                root /var/www/html;
                                
                access_log /var/log/nginx/access.log;
                error_log /var/log/nginx/error.log;
               
               #SSL Certificates
                ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
                ssl_certificate_key "/etc/letsencrypt/live/www. yourdomain.com/privkey.pem";
                ssl_dhparam /etc/nginx/dhparam.pem;
                
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                #ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 
                ssl_session_cache shared:SSL:1m;
               ssl_session_timeout 10m;
                ssl_ciphers HIGH:!aNULL:!MD5;
                ssl_prefer_server_ciphers  on;
                
                add_header Strict-Transport-Security "max-age=31536000;
                #includeSubDomains" always;
 
                location / {
                    index index.php index.html index.htm;
                    try_files $uri $uri/ /index.php?$args $uri/ =404;
                }
 
                
                set $cache_uri $request_uri;
                
                location ~ /.well-known {
                allow all;
                                }
               
                #
                #             # With php-fpm (or other unix sockets):
                                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                #             # With php-cgi (or other tcp sockets):
                #             fastcgi_pass 127.0.0.1:9000;
                }

               # deny access to .htaccess files, if Apache's document root
                # concurs with nginx's one
                #
                #location ~ //.ht {
                #             deny all;
                #}
                
    }

通過FastCGI Process Manager處理PHP腳本的代碼行也可以在此摘錄中找到,並由以下行表示。

location ~ /.php$ {
                                include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                }

在Nginx中安裝Let的加密證書

我們的加密證書和密鑰存儲在Linux主機的/etc/letsencrypt/live/www.yourdomain.com/目錄中。針對上述目錄的ls指令將顯示所有證書元件,例如鍊檔案,fullchain檔案,私鑰和證書檔案。

ls /etc/letsencrypt/live/www.yourdomain.com/

要在Nginx Web服務器TLS配置文件中安裝Let的加密證書,請打開Nginx default-ssl 文件並更新以下行以反映您的域的Let的加密證書文件路徑,如下面的摘錄所示。

nano / etc / nginx / sites-enabled / default-ssl

更改以下行,如下所示:

  ssl_certificate“/etc/letsencrypt/live/www.yourdomain.com/cert.pem”; 
                ssl_certificate_key“/etc/letsencrypt/live/www.yourdomain.com /privkey.pem”;

此外,如果ssl_dhparam語句存在於Nginx SSL配置中,則必須通過發出以下指令生成新的2048位Diffie-Hellman密鑰。Diffie-Hellman關鍵參數的生成應該需要一段時間,具體取決於您的系統隨機性或熵。

openssl dhparam -out /etc/nginx/dhparam.pem 2048

最後,在通過重新啟動Nginx守護程式以反映變更來啟動Nginx TLS配置之前,首先檢查Nginx配置是否存在潛在的語法錯誤。之後,如果Nginx配置檔測試完成,請通過發出以下指令重新啟動Nginx守護程式以將新配置與Let的加密證書一起加載。

nginx -t
service nginx restart

為了驗證nginx服務是否在端口443上擁有處於偵聽狀態的已打開套接字,請執行netstat命令,如下面的摘錄所示。

netstat -tulpn | grep -e 443 -e LISTEN

您還應該開啟瀏覽器並通過HTTPS協定導航到您的域名。如果在Nginx中完成應用了 Let’s Encrypt 的加密證書,則SSL握手應該可以順利運行而不會丟失任何錯誤。

https://www.yourdomain.com

強製網路流量到HTTPS

要強制您的域訪問者僅通過HTTPS協定瀏覽您的網站,請開啟啟用Nginx站台的預設配置檔並加入以下行,這將強制所有命中連接埠80的請求被重導至301狀態代碼(永久搬移)到連接埠443。

nano / etc / nginx / sites-enabled / default

重定向語句應如下面的摘錄中所示。

server_name www.yourdomain.com yourdomain.com;
return         301 https://$server_name$request_uri;

隨後,通過發出以下命令重新啟動Nginx守護程序以應用更改。

service nginx restart

最後檢查

要進一步調查Let的加密CA生成的證書,您可以使用現代Web瀏覽器,例如Chrome。從Chrome瀏覽器訪問您的域名,然後按F12功能鍵以開啟開發人員工具。導航到「安全」索引片,然後點選「 檢視證書」按鈕以開啟證書,如以下螢幕快照所示。

 

調查SSL證書的另一個有用的實用程式證明是openssl指令行實用程式。為了顯示 Let’s Encrypt 的加密CA證書的額外訊息,請在Linux控制台中執行以下指令。

openssl s_client -connect www.yourdomain.com:443

自動續訂讓我們加密證書

為了在到期日期之前自動續訂Let’s Encrypt CA頒發的證書,請通過發出以下命令,安排crontab作業每天凌晨2:00運行一次。執行的cron作業的輸出將被定向到日誌文件,存儲在/var/log/letsencrypt.log中

crontab -e

Cron工作續簽證書。

0 2 * * * certbot renew >> /var/log/letsencrypt.log

這樣就完成了!有關 Let’s Encrypt 的加密證書和實用程式的其他更進階配置,請訪問以下Internet位址https://certbot.eff.org/docs/上的官方文件。