Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書
簡(jiǎn)介
TLS,即傳輸層安全協(xié)議,及其前身SSL,即安全套接字層,是用于將普通流量包裝在受保護(hù)的加密包裝中的網(wǎng)絡(luò)協(xié)議。
使用這項(xiàng)技術(shù),服務(wù)器可以在服務(wù)器和客戶端之間安全地發(fā)送流量,而不會(huì)被外部方攔截。證書系統(tǒng)還幫助用戶驗(yàn)證他們正在連接的站點(diǎn)的身份。
在本指南中,我們將向您展示如何在 Ubuntu 16.04 服務(wù)器上為 Nginx web 服務(wù)器設(shè)置自簽名 SSL 證書。
先決條件
在開(kāi)始之前,您應(yīng)該已經(jīng)配置了一個(gè)具有sudo權(quán)限的非根用戶。您可以按照我們的 Ubuntu 16.04 初始服務(wù)器設(shè)置指南來(lái)了解如何設(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)行操作。
完成先決條件后,請(qǐng)繼續(xù)以下操作。
步驟 1:創(chuàng)建 SSL 證書
TLS/SSL 通過(guò)使用公共證書和私鑰的組合來(lái)工作。SSL 密鑰在服務(wù)器上保密。它用于加密發(fā)送給客戶端的內(nèi)容。SSL 證書與請(qǐng)求內(nèi)容的任何人公開(kāi)共享。它可用于解密由相關(guān) SSL 密鑰簽名的內(nèi)容。
我們可以使用 OpenSSL 一次性創(chuàng)建自簽名密鑰和證書對(duì):
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
您將被要求回答一系列問(wèn)題。在我們討論這些問(wèn)題之前,讓我們看看我們正在發(fā)出的命令中發(fā)生了什么:
- openssl:這是用于創(chuàng)建和管理 OpenSSL 證書、密鑰和其他文件的基本命令行工具。
- req:此子命令指定我們要使用 X.509 證書簽名請(qǐng)求(CSR)管理。“X.509” 是 SSL 和 TLS 遵循的用于其密鑰和證書管理的公鑰基礎(chǔ)設(shè)施標(biāo)準(zhǔn)。我們要?jiǎng)?chuàng)建一個(gè)新的 X.509 證書,因此我們正在使用此子命令。
- -x509:這通過(guò)告訴實(shí)用程序我們要?jiǎng)?chuàng)建自簽名證書,而不是生成證書簽名請(qǐng)求,進(jìn)一步修改了前一個(gè)子命令。
- -nodes:這告訴 OpenSSL 跳過(guò)使用密碼短語(yǔ)保護(hù)我們的證書的選項(xiàng)。我們需要 Nginx 能夠在服務(wù)器啟動(dòng)時(shí)無(wú)需用戶干預(yù)地讀取文件。密碼短語(yǔ)會(huì)阻止這種情況發(fā)生,因?yàn)槲覀兠看沃匦聠?dòng)后都需要輸入密碼。
- -days 365:此選項(xiàng)設(shè)置證書被視為有效的時(shí)間長(zhǎng)度。我們?cè)谶@里設(shè)置為一年。
- -newkey rsa:2048:這指定我們要同時(shí)生成新證書和新密鑰。我們沒(méi)有在之前的步驟中創(chuàng)建用于簽署證書的密鑰,因此我們需要同時(shí)創(chuàng)建它和證書。
rsa:2048部分告訴它生成一個(gè)長(zhǎng)度為 2048 位的 RSA 密鑰。 - -keyout:此行告訴 OpenSSL 在哪里放置我們正在創(chuàng)建的生成私鑰文件。
- -out:這告訴 OpenSSL 在哪里放置我們正在創(chuàng)建的證書。
正如我們上面所述,這些選項(xiàng)將創(chuàng)建一個(gè)密鑰文件和一個(gè)證書。我們將被要求關(guān)于我們的服務(wù)器的一些問(wèn)題,以便將信息正確嵌入證書中。
適當(dāng)填寫提示。最重要的一行是請(qǐng)求“通用名稱(例如服務(wù)器 FQDN 或您的名稱)”。您需要輸入與您的服務(wù)器關(guān)聯(lián)的域名或更可能是您服務(wù)器的公共 IP 地址。
提示的全部?jī)?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)建的兩個(gè)文件將放置在/etc/ssl目錄的適當(dāng)子目錄中。
當(dāng)我們使用 OpenSSL 時(shí),我們還應(yīng)該創(chuàng)建一個(gè)強(qiáng)大的 Diffie-Hellman 組,用于與客戶端協(xié)商完美前向保密。
我們可以通過(guò)輸入以下內(nèi)容來(lái)實(shí)現(xiàn):
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
這可能需要幾分鐘的時(shí)間,但完成后,您將在/etc/ssl/certs/dhparam.pem上擁有一個(gè)強(qiáng)大的 DH 組,我們可以在我們的配置中使用。
步驟 2:配置 Nginx 使用 SSL
我們已經(jīng)在 /etc/ssl 目錄下創(chuàng)建了我們的密鑰和證書文件?,F(xiàn)在我們只需要修改我們的 Nginx 配置以利用這些文件。
我們將對(duì)我們的配置進(jìn)行一些調(diào)整。
- 我們將創(chuàng)建一個(gè)包含 SSL 密鑰和證書文件位置的配置片段。
- 我們將創(chuàng)建一個(gè)包含強(qiáng)大 SSL 設(shè)置的配置片段,這些設(shè)置可以在將來(lái)與任何證書一起使用。
- 我們將調(diào)整我們的 Nginx 服務(wù)器塊以處理 SSL 請(qǐng)求,并使用上述兩個(gè)片段。
這種配置 Nginx 的方法將允許我們保持清晰的服務(wù)器塊,并將常見(jiàn)的配置段放入可重用的模塊中。
創(chuàng)建指向 SSL 密鑰和證書的配置片段
首先,讓我們?cè)?nbsp;/etc/nginx/snippets 目錄下創(chuàng)建一個(gè)新的 Nginx 配置片段。
為了正確區(qū)分該文件的目的,讓我們將其命名為 self-signed.conf:
sudo nano /etc/nginx/snippets/self-signed.conf
在這個(gè)文件中,我們只需要將 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è)置的配置片段
接下來(lái),我們將創(chuàng)建另一個(gè)片段,用于定義一些 SSL 設(shè)置。這將使用強(qiáng)大的 SSL 密碼套件并啟用一些高級(jí)功能,有助于保持我們的服務(wù)器安全。
我們將設(shè)置的參數(shù)可以在將來(lái)的 Nginx 配置中重復(fù)使用,因此我們將給文件一個(gè)通用的名稱:
sudo nano /etc/nginx/snippets/ssl-params.conf
為了安全地設(shè)置 Nginx SSL,我們將使用 Remy van Elst 在 Cipherli.st 網(wǎng)站上的建議。該網(wǎng)站旨在為流行軟件提供易于消化的加密設(shè)置。您可以在這里閱讀更多關(guān)于他在 Nginx 選擇方面的決定。
對(duì)于我們的目的,我們可以完全復(fù)制所提供的設(shè)置。我們只需要做一些小的修改。
首先,我們將添加我們首選的上游請(qǐng)求的 DNS 解析器。在本指南中,我們將使用 Google 的解析器。我們還將設(shè)置 ssl_dhparam 設(shè)置,指向我們之前生成的 Diffie-Hellman 文件。
最后,您應(yīng)該花一點(diǎn)時(shí)間了解 HTTP 嚴(yán)格傳輸安全性(HSTS),特別是關(guān)于“preload”功能。預(yù)加載 HSTS 提供了增強(qiáng)的安全性,但如果意外啟用或錯(cuò)誤啟用可能會(huì)產(chǎn)生深遠(yuǎn)的后果。在本指南中,我們不會(huì)預(yù)加載這些設(shè)置,但如果您確信理解了其影響,可以進(jìn)行修改:
# 來(lái)自 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; # 暫時(shí)禁用預(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;
因?yàn)槲覀兪褂玫氖亲院灻C書,所以 SSL stapling 將不會(huì)被使用。Nginx 將簡(jiǎn)單地輸出警告,為我們的自簽名證書禁用 stapling,并繼續(xù)正常運(yùn)行。
完成后保存并關(guān)閉文件。
調(diào)整 Nginx 配置以使用 SSL
現(xiàn)在我們有了我們的片段,我們可以調(diào)整我們的 Nginx 配置以啟用 SSL。
在本指南中,我們假設(shè)您正在使用 /etc/nginx/sites-available 目錄中的 default 服務(wù)器塊文件。如果您使用不同的服務(wù)器塊文件,請(qǐng)?jiān)谙旅娴拿钪刑鎿Q其名稱。
在繼續(xù)之前,讓我們先備份當(dāng)前的服務(wù)器塊文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
現(xiàn)在,打開(kāi)服務(wù)器塊文件進(jìn)行調(diào)整:
sudo nano /etc/nginx/sites-available/default
在文件中,您的服務(wù)器塊可能開(kāi)始如下所示:
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
. . .
我們將修改此配置,以便將未加密的 HTTP 請(qǐng)求自動(dòng)重定向到加密的 HTTPS。這為我們的站點(diǎn)提供了最佳安全性。如果您希望允許 HTTP 和 HTTPS 流量,請(qǐng)使用以下備用配置。
我們將把配置分成兩個(gè)單獨(dú)的塊。在兩個(gè)第一條 listen 指令之后,我們將添加一個(gè) server_name 指令,設(shè)置為您的服務(wù)器域名或更可能的 IP 地址。然后,我們將設(shè)置一個(gè)重定向到我們將要?jiǎng)?chuàng)建的第二個(gè)服務(wù)器塊。之后,我們將關(guān)閉這個(gè)簡(jiǎ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;
. . .
接下來(lái),我們需要在下面直接開(kāi)始一個(gè)新的服務(wù)器塊,以包含剩余的配置。我們可以取消注釋使用端口 443 的兩個(gè) listen 指令。我們可以在這些行中添加 http2 以在此塊中啟用 HTTP/2。之后,我們只需要包含我們?cè)O(shè)置的兩個(gè)片段文件:
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。一般來(lái)說(shuō),如果可以避免,這通常是不建議的,但在某些情況下可能是必要的。基本上,我們將兩個(gè)單獨(dú)的服務(wù)器塊壓縮成一個(gè)塊,并刪除重定向:
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 流量。幸運(yùn)的是,Nginx 在安裝時(shí)會(huì)向 ufw 注冊(cè)一些配置文件。
我們可以通過(guò)輸入以下命令來(lái)查看可用的配置文件:
sudo ufw app list
您應(yīng)該會(huì)看到以下類似的列表:
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
您可以通過(guò)輸入以下命令來(lái)查看當(dāng)前設(shè)置:
sudo ufw status
它可能看起來(lái)像這樣,意味著只有 HTTP 流量被允許訪問(wèn) 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:?jiǎn)⒂?Nginx 中的更改
現(xiàn)在我們已經(jīng)做出了更改并調(diào)整了防火墻,我們可以重新啟動(dòng) Nginx 來(lái)實(shí)施我們的新更改。
首先,我們應(yīng)該檢查我們的文件中是否有語(yǔ)法錯(cuò)誤。我們可以通過(guò)輸入以下命令來(lái)執(zhí)行此操作:
sudo nginx -t
如果一切順利,您將會(huì)得到以下類似的結(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
請(qǐng)注意開(kāi)頭的警告。如前所述,由于我們的自簽名證書無(wú)法使用 SSL stapling,因此此特定設(shè)置會(huì)產(chǎn)生警告。這是預(yù)期的,我們的服務(wù)器仍然可以正確加密連接。
如果您的輸出與上述相匹配,則您的配置文件沒(méi)有語(yǔ)法錯(cuò)誤。我們可以安全地重新啟動(dòng) Nginx 來(lái)實(shí)施我們的更改:
sudo systemctl restart nginx
步驟 5:測(cè)試加密
現(xiàn)在,我們準(zhǔn)備測(cè)試我們的 SSL 服務(wù)器。
打開(kāi)您的 Web 瀏覽器,然后在地址欄中輸入 https://,后面跟上您服務(wù)器的域名或 IP:
https://server_domain_or_IP
由于我們創(chuàng)建的證書未經(jīng)您瀏覽器信任的證書頒發(fā)機(jī)構(gòu)簽名,您可能會(huì)看到以下類似的警告:
!Nginx self-signed cert warning
這是預(yù)期的和正常的。我們只關(guān)心證書的加密方面,而不是主機(jī)真實(shí)性的第三方驗(yàn)證。點(diǎn)擊 “高級(jí)”,然后點(diǎn)擊提供的鏈接以繼續(xù)訪問(wèn)您的主機(jī):
!Nginx self-signed override
您應(yīng)該會(huì)進(jìn)入您的站點(diǎn)。如果您查看瀏覽器地址欄,您會(huì)看到一個(gè)帶有 “x” 的鎖。在這種情況下,這只是意味著無(wú)法驗(yàn)證證書。它仍然在加密您的連接。
如果您配置了 Nginx 兩個(gè)服務(wù)器塊,自動(dòng)將 HTTP 內(nèi)容重定向到 HTTPS,您還可以檢查重定向是否正常工作:
http://server_domain_or_IP
如果結(jié)果顯示相同的圖標(biāo),這意味著您的重定向已經(jīng)正確工作。
步驟 6:更改為永久重定向
如果您的重定向工作正常,并且您確定只想允許加密流量,您應(yīng)該修改 Nginx 配置以使重定向變?yōu)橛谰眯浴?/p>
再次打開(kāi)您的服務(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)閉文件。
檢查您的配置是否存在語(yǔ)法錯(cuò)誤:
sudo nginx -t
當(dāng)您準(zhǔn)備好時(shí),重新啟動(dòng) Nginx 以使重定向變?yōu)橛谰眯裕?/p>
sudo systemctl restart nginx
結(jié)論
您已經(jīng)配置了 Nginx 服務(wù)器以使用強(qiáng)加密來(lái)處理客戶端連接。這將允許您安全地提供請(qǐng)求,并防止外部方讀取您的流量。
到此這篇關(guān)于Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書的文章就介紹到這了,更多相關(guān)Nginx創(chuàng)建自簽名SSL證書內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NGINX基于cookie針對(duì)同一域名進(jìn)行分流轉(zhuǎn)發(fā)
本文介紹了利用NGINX基于cookie進(jìn)行多環(huán)境分流的方法,通過(guò)在Docker中部署兩個(gè)后端NGINX容器,并在前端NGINX配置中設(shè)置map規(guī)則,根據(jù)cookie值將請(qǐng)求分發(fā)到不同后端,感興趣的可以了解一下2025-07-07
Nginx配置終極版學(xué)習(xí)指南(可能全網(wǎng)最詳細(xì))
Nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,特點(diǎn)是占用內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上Nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)好,這篇文章主要介紹了Nginx配置終極版學(xué)習(xí)指南的相關(guān)資料,需要的朋友可以參考下2026-02-02
Nginx轉(zhuǎn)發(fā)需求querystring轉(zhuǎn)寫示例解析
這篇文章主要為大家介紹了Nginx轉(zhuǎn)發(fā)需求querystring轉(zhuǎn)寫示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
關(guān)于Nginx跨域問(wèn)題及解決方案(CORS)
文章主要介紹了跨域資源共享(CORS)機(jī)制及其在現(xiàn)代Web開(kāi)發(fā)中的重要性,通過(guò)Nginx,可以簡(jiǎn)單地解決跨域問(wèn)題,適合新手學(xué)習(xí)和應(yīng)用,文章詳細(xì)講解了CORS的基本概念、常見(jiàn)的跨域場(chǎng)景、Nginx如何解決CORS問(wèn)題,以及如何配置Nginx來(lái)處理CORS請(qǐng)求2025-02-02
nginx代理部署Vue刷新頁(yè)面404的問(wèn)題解決
在上線vue開(kāi)發(fā)的前端網(wǎng)頁(yè)部署在服務(wù)器上后,刷新頁(yè)面顯示404,本文就來(lái)介紹一下nginx代理部署Vue刷新頁(yè)面404的問(wèn)題解決,感興趣的可以了解一下2023-12-12

