Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書
簡介
TLS,即傳輸層安全協(xié)議,及其前身SSL,即安全套接字層,是用于將普通流量包裝在受保護的加密包裝中的網(wǎng)絡(luò)協(xié)議。
使用這項技術(shù),服務(wù)器可以在服務(wù)器和客戶端之間安全地發(fā)送流量,而不會被外部方攔截。證書系統(tǒng)還幫助用戶驗證他們正在連接的站點的身份。
在本指南中,我們將向您展示如何在 Ubuntu 16.04 服務(wù)器上為 Nginx web 服務(wù)器設(shè)置自簽名 SSL 證書。
先決條件
在開始之前,您應(yīng)該已經(jīng)配置了一個具有sudo
權(quán)限的非根用戶。您可以按照我們的 Ubuntu 16.04 初始服務(wù)器設(shè)置指南來了解如何設(shè)置此類用戶帳戶。
您還需要已安裝 Nginx web 服務(wù)器。如果您想在服務(wù)器上安裝完整的 LEMP(Linux、Nginx、MySQL、PHP)堆棧,可以按照我們的 Ubuntu 16.04 上設(shè)置 LEMP 的指南進行操作。
如果您只想要 Nginx web 服務(wù)器,可以按照我們的 Ubuntu 16.04 上安裝 Nginx 的指南進行操作。
完成先決條件后,請繼續(xù)以下操作。
步驟 1:創(chuàng)建 SSL 證書
TLS/SSL 通過使用公共證書和私鑰的組合來工作。SSL 密鑰在服務(wù)器上保密。它用于加密發(fā)送給客戶端的內(nèi)容。SSL 證書與請求內(nèi)容的任何人公開共享。它可用于解密由相關(guān) SSL 密鑰簽名的內(nèi)容。
我們可以使用 OpenSSL 一次性創(chuàng)建自簽名密鑰和證書對:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
您將被要求回答一系列問題。在我們討論這些問題之前,讓我們看看我們正在發(fā)出的命令中發(fā)生了什么:
- openssl:這是用于創(chuàng)建和管理 OpenSSL 證書、密鑰和其他文件的基本命令行工具。
- req:此子命令指定我們要使用 X.509 證書簽名請求(CSR)管理。“X.509” 是 SSL 和 TLS 遵循的用于其密鑰和證書管理的公鑰基礎(chǔ)設(shè)施標準。我們要創(chuàng)建一個新的 X.509 證書,因此我們正在使用此子命令。
- -x509:這通過告訴實用程序我們要創(chuàng)建自簽名證書,而不是生成證書簽名請求,進一步修改了前一個子命令。
- -nodes:這告訴 OpenSSL 跳過使用密碼短語保護我們的證書的選項。我們需要 Nginx 能夠在服務(wù)器啟動時無需用戶干預(yù)地讀取文件。密碼短語會阻止這種情況發(fā)生,因為我們每次重新啟動后都需要輸入密碼。
- -days 365:此選項設(shè)置證書被視為有效的時間長度。我們在這里設(shè)置為一年。
- -newkey rsa:2048:這指定我們要同時生成新證書和新密鑰。我們沒有在之前的步驟中創(chuàng)建用于簽署證書的密鑰,因此我們需要同時創(chuàng)建它和證書。
rsa:2048
部分告訴它生成一個長度為 2048 位的 RSA 密鑰。 - -keyout:此行告訴 OpenSSL 在哪里放置我們正在創(chuàng)建的生成私鑰文件。
- -out:這告訴 OpenSSL 在哪里放置我們正在創(chuàng)建的證書。
正如我們上面所述,這些選項將創(chuàng)建一個密鑰文件和一個證書。我們將被要求關(guān)于我們的服務(wù)器的一些問題,以便將信息正確嵌入證書中。
適當填寫提示。最重要的一行是請求“通用名稱(例如服務(wù)器 FQDN 或您的名稱)”。您需要輸入與您的服務(wù)器關(guān)聯(lián)的域名或更可能是您服務(wù)器的公共 IP 地址。
提示的全部內(nèi)容將類似于以下內(nèi)容:
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:server_IP_address Email Address []:admin@your_domain.com
您創(chuàng)建的兩個文件將放置在/etc/ssl
目錄的適當子目錄中。
當我們使用 OpenSSL 時,我們還應(yīng)該創(chuàng)建一個強大的 Diffie-Hellman 組,用于與客戶端協(xié)商完美前向保密。
我們可以通過輸入以下內(nèi)容來實現(xiàn):
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
這可能需要幾分鐘的時間,但完成后,您將在/etc/ssl/certs/dhparam.pem
上擁有一個強大的 DH 組,我們可以在我們的配置中使用。
步驟 2:配置 Nginx 使用 SSL
我們已經(jīng)在 /etc/ssl
目錄下創(chuàng)建了我們的密鑰和證書文件。現(xiàn)在我們只需要修改我們的 Nginx 配置以利用這些文件。
我們將對我們的配置進行一些調(diào)整。
- 我們將創(chuàng)建一個包含 SSL 密鑰和證書文件位置的配置片段。
- 我們將創(chuàng)建一個包含強大 SSL 設(shè)置的配置片段,這些設(shè)置可以在將來與任何證書一起使用。
- 我們將調(diào)整我們的 Nginx 服務(wù)器塊以處理 SSL 請求,并使用上述兩個片段。
這種配置 Nginx 的方法將允許我們保持清晰的服務(wù)器塊,并將常見的配置段放入可重用的模塊中。
創(chuàng)建指向 SSL 密鑰和證書的配置片段
首先,讓我們在 /etc/nginx/snippets
目錄下創(chuàng)建一個新的 Nginx 配置片段。
為了正確區(qū)分該文件的目的,讓我們將其命名為 self-signed.conf
:
sudo nano /etc/nginx/snippets/self-signed.conf
在這個文件中,我們只需要將 ssl_certificate
指令設(shè)置為我們的證書文件,將 ssl_certificate_key
設(shè)置為相關(guān)的密鑰。在我們的情況下,這將如下所示:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
當您添加了這些行后,保存并關(guān)閉文件。
創(chuàng)建包含強加密設(shè)置的配置片段
接下來,我們將創(chuàng)建另一個片段,用于定義一些 SSL 設(shè)置。這將使用強大的 SSL 密碼套件并啟用一些高級功能,有助于保持我們的服務(wù)器安全。
我們將設(shè)置的參數(shù)可以在將來的 Nginx 配置中重復(fù)使用,因此我們將給文件一個通用的名稱:
sudo nano /etc/nginx/snippets/ssl-params.conf
為了安全地設(shè)置 Nginx SSL,我們將使用 Remy van Elst 在 Cipherli.st 網(wǎng)站上的建議。該網(wǎng)站旨在為流行軟件提供易于消化的加密設(shè)置。您可以在這里閱讀更多關(guān)于他在 Nginx 選擇方面的決定。
對于我們的目的,我們可以完全復(fù)制所提供的設(shè)置。我們只需要做一些小的修改。
首先,我們將添加我們首選的上游請求的 DNS 解析器。在本指南中,我們將使用 Google 的解析器。我們還將設(shè)置 ssl_dhparam
設(shè)置,指向我們之前生成的 Diffie-Hellman 文件。
最后,您應(yīng)該花一點時間了解 HTTP 嚴格傳輸安全性(HSTS),特別是關(guān)于“preload”功能。預(yù)加載 HSTS 提供了增強的安全性,但如果意外啟用或錯誤啟用可能會產(chǎn)生深遠的后果。在本指南中,我們不會預(yù)加載這些設(shè)置,但如果您確信理解了其影響,可以進行修改:
# 來自 https://cipherli.st/ # 和 https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # 暫時禁用預(yù)加載 HSTS。如果您理解其影響,可以使用包含“preload”指令的已注釋的頭行。 #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ssl_dhparam /etc/ssl/certs/dhparam.pem;
因為我們使用的是自簽名證書,所以 SSL stapling 將不會被使用。Nginx 將簡單地輸出警告,為我們的自簽名證書禁用 stapling,并繼續(xù)正常運行。
完成后保存并關(guān)閉文件。
調(diào)整 Nginx 配置以使用 SSL
現(xiàn)在我們有了我們的片段,我們可以調(diào)整我們的 Nginx 配置以啟用 SSL。
在本指南中,我們假設(shè)您正在使用 /etc/nginx/sites-available
目錄中的 default
服務(wù)器塊文件。如果您使用不同的服務(wù)器塊文件,請在下面的命令中替換其名稱。
在繼續(xù)之前,讓我們先備份當前的服務(wù)器塊文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
現(xiàn)在,打開服務(wù)器塊文件進行調(diào)整:
sudo nano /etc/nginx/sites-available/default
在文件中,您的服務(wù)器塊可能開始如下所示:
server { listen 80 default_server; listen [::]:80 default_server; # SSL configuration # listen 443 ssl default_server; # listen [::]:443 ssl default_server; . . .
我們將修改此配置,以便將未加密的 HTTP 請求自動重定向到加密的 HTTPS。這為我們的站點提供了最佳安全性。如果您希望允許 HTTP 和 HTTPS 流量,請使用以下備用配置。
我們將把配置分成兩個單獨的塊。在兩個第一條 listen
指令之后,我們將添加一個 server_name
指令,設(shè)置為您的服務(wù)器域名或更可能的 IP 地址。然后,我們將設(shè)置一個重定向到我們將要創(chuàng)建的第二個服務(wù)器塊。之后,我們將關(guān)閉這個簡短的塊:
server { listen 80 default_server; listen [::]:80 default_server; server_name server_domain_or_IP; return 302 https://$server_name$request_uri; } # SSL configuration # listen 443 ssl default_server; # listen [::]:443 ssl default_server; . . .
接下來,我們需要在下面直接開始一個新的服務(wù)器塊,以包含剩余的配置。我們可以取消注釋使用端口 443 的兩個 listen
指令。我們可以在這些行中添加 http2
以在此塊中啟用 HTTP/2。之后,我們只需要包含我們設(shè)置的兩個片段文件:
server { listen 80 default_server; listen [::]:80 default_server; server_name server_domain_or_IP; return 302 https://$server_name$request_uri; } server { # SSL configuration listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; include snippets/self-signed.conf; include snippets/ssl-params.conf; . . .
完成后保存并關(guān)閉文件。
(備用配置)允許 HTTP 和 HTTPS 流量
如果您希望或需要允許加密和非加密內(nèi)容,您將需要稍微不同地配置 Nginx。一般來說,如果可以避免,這通常是不建議的,但在某些情況下可能是必要的?;旧希覀儗蓚€單獨的服務(wù)器塊壓縮成一個塊,并刪除重定向:
server { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name server_domain_or_IP; include snippets/self-signed.conf; include snippets/ssl-params.conf; . . .
完成后保存并關(guān)閉文件。
步驟 3:調(diào)整防火墻
如果您已經(jīng)啟用了 ufw
防火墻,如先決指南中推薦的那樣,您需要調(diào)整設(shè)置以允許 SSL 流量。幸運的是,Nginx 在安裝時會向 ufw
注冊一些配置文件。
我們可以通過輸入以下命令來查看可用的配置文件:
sudo ufw app list
您應(yīng)該會看到以下類似的列表:
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
您可以通過輸入以下命令來查看當前設(shè)置:
sudo ufw status
它可能看起來像這樣,意味著只有 HTTP 流量被允許訪問 Web 服務(wù)器:
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
為了額外允許 HTTPS 流量,我們可以允許 “Nginx Full” 配置文件,然后刪除多余的 “Nginx HTTP” 配置文件允許:
sudo ufw allow 'Nginx Full' sudo ufw delete allow 'Nginx HTTP'
現(xiàn)在您的狀態(tài)應(yīng)該是這樣的:
sudo ufw status
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
步驟 4:啟用 Nginx 中的更改
現(xiàn)在我們已經(jīng)做出了更改并調(diào)整了防火墻,我們可以重新啟動 Nginx 來實施我們的新更改。
首先,我們應(yīng)該檢查我們的文件中是否有語法錯誤。我們可以通過輸入以下命令來執(zhí)行此操作:
sudo nginx -t
如果一切順利,您將會得到以下類似的結(jié)果:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
請注意開頭的警告。如前所述,由于我們的自簽名證書無法使用 SSL stapling,因此此特定設(shè)置會產(chǎn)生警告。這是預(yù)期的,我們的服務(wù)器仍然可以正確加密連接。
如果您的輸出與上述相匹配,則您的配置文件沒有語法錯誤。我們可以安全地重新啟動 Nginx 來實施我們的更改:
sudo systemctl restart nginx
步驟 5:測試加密
現(xiàn)在,我們準備測試我們的 SSL 服務(wù)器。
打開您的 Web 瀏覽器,然后在地址欄中輸入 https://
,后面跟上您服務(wù)器的域名或 IP:
https://server_domain_or_IP
由于我們創(chuàng)建的證書未經(jīng)您瀏覽器信任的證書頒發(fā)機構(gòu)簽名,您可能會看到以下類似的警告:
!Nginx self-signed cert warning
這是預(yù)期的和正常的。我們只關(guān)心證書的加密方面,而不是主機真實性的第三方驗證。點擊 “高級”,然后點擊提供的鏈接以繼續(xù)訪問您的主機:
!Nginx self-signed override
您應(yīng)該會進入您的站點。如果您查看瀏覽器地址欄,您會看到一個帶有 “x” 的鎖。在這種情況下,這只是意味著無法驗證證書。它仍然在加密您的連接。
如果您配置了 Nginx 兩個服務(wù)器塊,自動將 HTTP 內(nèi)容重定向到 HTTPS,您還可以檢查重定向是否正常工作:
http://server_domain_or_IP
如果結(jié)果顯示相同的圖標,這意味著您的重定向已經(jīng)正確工作。
步驟 6:更改為永久重定向
如果您的重定向工作正常,并且您確定只想允許加密流量,您應(yīng)該修改 Nginx 配置以使重定向變?yōu)橛谰眯浴?/p>
再次打開您的服務(wù)器塊配置文件:
sudo nano /etc/nginx/sites-available/default
找到 return 302
并將其更改為 return 301
:
server { listen 80 default_server; listen [::]:80 default_server; server_name server_domain_or_IP; return 301 https://$server_name$request_uri; }
保存并關(guān)閉文件。
檢查您的配置是否存在語法錯誤:
sudo nginx -t
當您準備好時,重新啟動 Nginx 以使重定向變?yōu)橛谰眯裕?/p>
sudo systemctl restart nginx
結(jié)論
您已經(jīng)配置了 Nginx 服務(wù)器以使用強加密來處理客戶端連接。這將允許您安全地提供請求,并防止外部方讀取您的流量。
到此這篇關(guān)于Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書的文章就介紹到這了,更多相關(guān)Nginx創(chuàng)建自簽名SSL證書內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx?Gunicorn?flask項目部署思路分析詳解
這篇文章主要為大家介紹了Nginx?Gunicorn?flask項目部署思路分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12一次nginx 504 Gateway Time-out錯誤排查、解決記錄
這篇文章主要介紹了一次nginx 504 Gateway Time-out錯誤排查、解決記錄,經(jīng)過反復(fù)檢查,發(fā)現(xiàn)造成這個問題的原因就是PHP的CURL沒有設(shè)置超時時間,解決辦法只要設(shè)置超時時間或者修改一下nginx的配置即可解決,需要的朋友可以參考下2014-05-05nginx 虛擬主機設(shè)置實例(多網(wǎng)站配置)
Nginx 虛擬主機設(shè)置一例,主要是針對虛擬主機的設(shè)置,多網(wǎng)站配置方法,需要的朋友可以參考下2013-02-02Nginx實現(xiàn)灰度發(fā)布的常見方法小結(jié)
Nginx 就像是一個智能的交通指揮員,它位于用戶請求和后端服務(wù)之間,負責對請求進行分發(fā)和管理,在灰度發(fā)布中,Nginx 可以根據(jù)我們設(shè)定的規(guī)則,這篇文章給大家介紹了Nginx實現(xiàn)灰度發(fā)布的常見方法小結(jié),需要的朋友可以參考下2024-07-07