Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書
簡介
TLS,即傳輸層安全協(xié)議,及其前身SSL,即安全套接字層,是用于將普通流量包裝在受保護(hù)的加密包裝中的網(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 的指南進(jìn)行操作。
如果您只想要 Nginx web 服務(wù)器,可以按照我們的 Ubuntu 16.04 上安裝 Nginx 的指南進(jìn)行操作。
完成先決條件后,請繼續(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è)施標(biāo)準(zhǔn)。我們要創(chuàng)建一個新的 X.509 證書,因此我們正在使用此子命令。
- -x509:這通過告訴實用程序我們要創(chuàng)建自簽名證書,而不是生成證書簽名請求,進(jìn)一步修改了前一個子命令。
- -nodes:這告訴 OpenSSL 跳過使用密碼短語保護(hù)我們的證書的選項。我們需要 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ù)器的一些問題,以便將信息正確嵌入證書中。
適當(dāng)填寫提示。最重要的一行是請求“通用名稱(例如服務(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目錄的適當(dāng)子目錄中。
當(dāng)我們使用 OpenSSL 時,我們還應(yīng)該創(chuàng)建一個強(qiáng)大的 Diffie-Hellman 組,用于與客戶端協(xié)商完美前向保密。
我們可以通過輸入以下內(nèi)容來實現(xiàn):
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
這可能需要幾分鐘的時間,但完成后,您將在/etc/ssl/certs/dhparam.pem上擁有一個強(qiáng)大的 DH 組,我們可以在我們的配置中使用。
步驟 2:配置 Nginx 使用 SSL
我們已經(jīng)在 /etc/ssl 目錄下創(chuàng)建了我們的密鑰和證書文件。現(xiàn)在我們只需要修改我們的 Nginx 配置以利用這些文件。
我們將對我們的配置進(jìn)行一些調(diào)整。
- 我們將創(chuàng)建一個包含 SSL 密鑰和證書文件位置的配置片段。
- 我們將創(chuàng)建一個包含強(qiá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;
當(dāng)您添加了這些行后,保存并關(guān)閉文件。
創(chuàng)建包含強(qiáng)加密設(shè)置的配置片段
接下來,我們將創(chuàng)建另一個片段,用于定義一些 SSL 設(shè)置。這將使用強(qiáng)大的 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 嚴(yán)格傳輸安全性(HSTS),特別是關(guān)于“preload”功能。預(yù)加載 HSTS 提供了增強(qiáng)的安全性,但如果意外啟用或錯誤啟用可能會產(chǎn)生深遠(yuǎn)的后果。在本指南中,我們不會預(yù)加載這些設(shè)置,但如果您確信理解了其影響,可以進(jìn)行修改:
# 來自 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ù)之前,讓我們先備份當(dāng)前的服務(wù)器塊文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
現(xiàn)在,打開服務(wù)器塊文件進(jìn)行調(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
您可以通過輸入以下命令來查看當(dāng)前設(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)在,我們準(zhǔn)備測試我們的 SSL 服務(wù)器。
打開您的 Web 瀏覽器,然后在地址欄中輸入 https://,后面跟上您服務(wù)器的域名或 IP:
https://server_domain_or_IP
由于我們創(chuàng)建的證書未經(jīng)您瀏覽器信任的證書頒發(fā)機(jī)構(gòu)簽名,您可能會看到以下類似的警告:
!Nginx self-signed cert warning
這是預(yù)期的和正常的。我們只關(guān)心證書的加密方面,而不是主機(jī)真實性的第三方驗證。點擊 “高級”,然后點擊提供的鏈接以繼續(xù)訪問您的主機(jī):
!Nginx self-signed override
您應(yīng)該會進(jìn)入您的站點。如果您查看瀏覽器地址欄,您會看到一個帶有 “x” 的鎖。在這種情況下,這只是意味著無法驗證證書。它仍然在加密您的連接。
如果您配置了 Nginx 兩個服務(wù)器塊,自動將 HTTP 內(nèi)容重定向到 HTTPS,您還可以檢查重定向是否正常工作:
http://server_domain_or_IP
如果結(jié)果顯示相同的圖標(biāo),這意味著您的重定向已經(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
當(dāng)您準(zhǔn)備好時,重新啟動 Nginx 以使重定向變?yōu)橛谰眯裕?/p>
sudo systemctl restart nginx
結(jié)論
您已經(jīng)配置了 Nginx 服務(wù)器以使用強(qiáng)加密來處理客戶端連接。這將允許您安全地提供請求,并防止外部方讀取您的流量。
到此這篇關(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項目部署思路分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪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-05
nginx 虛擬主機(jī)設(shè)置實例(多網(wǎng)站配置)
Nginx 虛擬主機(jī)設(shè)置一例,主要是針對虛擬主機(jī)的設(shè)置,多網(wǎng)站配置方法,需要的朋友可以參考下2013-02-02
Nginx實現(xiàn)灰度發(fā)布的常見方法小結(jié)
Nginx 就像是一個智能的交通指揮員,它位于用戶請求和后端服務(wù)之間,負(fù)責(zé)對請求進(jìn)行分發(fā)和管理,在灰度發(fā)布中,Nginx 可以根據(jù)我們設(shè)定的規(guī)則,這篇文章給大家介紹了Nginx實現(xiàn)灰度發(fā)布的常見方法小結(jié),需要的朋友可以參考下2024-07-07

