nginx多https證書配置實(shí)現(xiàn)
其實(shí)有很多方式,網(wǎng)上看到一個(gè)這個(gè)方法,給大家介紹一下。
首先,開啟支持-TLS SNI support
什么是SNI?
傳統(tǒng)的應(yīng)用場(chǎng)景中,一臺(tái)服務(wù)器對(duì)應(yīng)一個(gè)IP地址,一個(gè)域名,使用一張包含了域名信息的證書。隨著云計(jì)算技術(shù)的普及,在云中的虛擬機(jī)有了一個(gè)IP,對(duì)應(yīng)多個(gè)域名,使用多張證書的應(yīng)用場(chǎng)景,SNI技術(shù)應(yīng)運(yùn)而生。SNI(Server Name Indication),即實(shí)現(xiàn)了一個(gè)服務(wù)器使用多個(gè)域名證書的TLS擴(kuò)展,支持用戶配置多個(gè)域名證書。
SNI請(qǐng)求特點(diǎn)
HTTP請(qǐng)求的Host字段在請(qǐng)求的Header中。發(fā)起HTTPS請(qǐng)求時(shí),在TLS握手階段,還無法進(jìn)行HTTP數(shù)據(jù)的解析,此時(shí)TLS協(xié)議的Client Hello字段新增了一個(gè)Server Name字段,請(qǐng)求的客戶端可以通過這個(gè)字段填充請(qǐng)求的Host信息,而服務(wù)端在TLS握手階段就可以選擇請(qǐng)求處理的證書,實(shí)現(xiàn)SNI的功能。
支持-TLS SNI support
Nginx支持單IP多域名SSL證書需要OpenSSL支持,首先需要編譯安裝一個(gè)高版本的openssl。
Nginx支持SNI,允許在同一個(gè)TLS服務(wù)端口下,配置不同的域名,用戶通過請(qǐng)求不同的證書域名,可返回相應(yīng)的upstream響應(yīng)結(jié)果。
檢查nginx是否支持TLS SNI support:
/usr/local/nginx/sbin/nginx -V nginx version: nginx/1.10.2
TLS SNI support disabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
TLS SNI support disabled 這樣是不支持的。
下面開始升級(jí)openssl:
wget ftp://ftp.openssl.org/source/openssl-1.0.2h.tar.gz tar xzvf openssl-1.0.2h.tar.gz cd openssl-1.0.2h ./config --prefix=/usr/local/openssl/ enable-shared enable-tlsext make && make install
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55)
built with OpenSSL 1.0.2h 21 Dec 2016
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-openssl=/usr/local/openssl --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module
方法1:多server配置不同證書和域名
server { listen 443; server_name *.www.aabb.com; index index.html index.htm index.php; root /data/wwwroot/www.aabb.com/webroot; ssl on; ssl_certificate "/usr/local/nginx/conf/ssl/_.www.aabb.com.public.cer"; ssl_certificate_key "/usr/local/nginx/conf/ssl/_.www.aabb.com.private.key"; ...... } server { listen 443; server_name www.aabb.com; index index.html index.htm index.php; root /data/wwwroot/www.aabb.com/webroot; ssl on; ssl_certificate "/usr/local/nginx/conf/ssl/www.aabb.com.public.cer"; ssl_certificate_key "/usr/local/nginx/conf/ssl/www.aabb.com.private.key"; ...... }
方法2:根據(jù)ssl_server_name判斷配置
ssl_server_name例子1:
對(duì)于nginx多https站點(diǎn)通常的做法是這樣:
server 443 ssl; server_name nixops1.me; ssl_certificate /usr/local/nginx/keys/nixops1.me.crt; ssl_certificate_key /usr/local/nginx/keys/nixops1.me.key; ......
如果有多個(gè)https站點(diǎn),就是每個(gè)站點(diǎn)復(fù)制一份這個(gè)配置。如nixops2.me、nixops3.me等等,在只有幾十個(gè)https站點(diǎn)的時(shí)候還好,如果某個(gè)站點(diǎn)的域名特別多,例如有幾千個(gè)域名甚至上萬個(gè)域名的時(shí)候,這個(gè)配置就很恐怖了,需要精簡(jiǎn)并合并配置。
下面舉例說明,假設(shè)應(yīng)用場(chǎng)景為:
- 同一站點(diǎn)有大量域名需要配置https證書,其它配置一樣
- 每個(gè)之證書都是泛域名證書,如let's encrypt的wildcard證書
- 所有證書命名均為公鑰domain.com.crt、私鑰為domain.com.key 這樣的格式
- 所有證書保存在相同目錄中,如/usr/local/nginx/conf/keys/
具體做法可以用nginx的map和正則表達(dá)式,根據(jù)ssl_server_name(即https的訪問域名),獲取公鑰和私鑰的完整路徑做為變量。配置證書時(shí)使用該變量即可。先來看nginx配置文件中HTTP段的map配置:
map $ssl_server_name $NixopsCert { default /usr/local/nginx/conf/keys/nixops.me.crt; #指定一個(gè)默認(rèn)的證書 ~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.crt; } map $ssl_server_name $NixopsKey { default /usr/local/nginx/conf/keys/nixops.me.key; ~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.key; }
這樣配置好后,如果通過https訪問nixops1.me或*.nixops1.me,獲取到的路徑分別為:
$NixopsCert --> /usr/local/nginx/conf/keys/nixops1.me.crt; $NixopsKey --> /usr/local/nginx/conf/keys/nixops1.me.key;
然后配置server段證書公鑰和私鑰時(shí)就不需要按傳統(tǒng)作法復(fù)制配置,只需指定變量即可:
server { listen 80; listen 443 ssl http2; server_name nixops.me nixops1.me nixops2.me #...... ; ssl_certificate $NixopsCert; ssl_certificate_key $NixopsKey; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #其它server段配置 }
這樣同一站點(diǎn)有多個(gè)證書時(shí),就可以只在server_name里添加,不需要指定https配置了,和http站點(diǎn)添加域名綁定非常類似。
ssl_server_name例子2:
在1.7.0版本開始,Nginx支持通過$ssl_server_name 變量獲取TLS中的Server Name,我們可以據(jù)此結(jié)合map映射指令,提升配置的重用度,一種優(yōu)化后的配置方式如下:
# Settings for a TLS enabled server. ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; map $ssl_server_name $ssl_string { lwl.test.com lwl.test.com; lwl.test1.com lwl.test1.com; default lwl.default.com; } upstream lwl.test.com { server 192.168.58.196; } upstream lwl.test1.com { server 192.168.58.194:8081; } upstream lwl.default.com { server 192.168.58.195; } server { listen 443 ssl; listen [::]:443 ssl; server_name $ssl_string; root /usr/share/nginx/html; ssl_certificate /etc/nginx/ssl_sni/server/$ssl_string/server.crt; ssl_certificate_key /etc/nginx/ssl_sni/server/$ssl_string/server.key; include /etc/nginx/default.d/*.conf; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie; proxy_pass http://$ssl_string; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
本文通過結(jié)合Nginx的 $ssl_server_name 變量與map指令,提供了一種支持多個(gè)SNI證書配置的實(shí)現(xiàn)方式,提高了配置維護(hù)的重用度。
方法3:一個(gè)server設(shè)置多個(gè)域名和ssl證書(沒嘗試,有待驗(yàn)證)
多域名多證書可以使用多個(gè)server 多個(gè)子配置文件進(jìn)行設(shè)置并且方便管理
還有一種就是一個(gè)server設(shè)置多個(gè)域名和ssl證書
看圖 因?yàn)?0端口不涉及證書 所以這里以443端口為例
server_name 中第二個(gè)域名與第一個(gè)域名之間以空格隔開,
再復(fù)制一份 ssl_certificate ; 和 ssl_certificate_key ;輸入第二個(gè)域名的證書文件地址即可
參考:
nginx多https證書配置精簡(jiǎn) - 閱心筆記
nginx一個(gè)server配置多域名多ssl證書_nginx多證書-CSDN博客
到此這篇關(guān)于nginx多https證書配置實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx多https證書內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Nginx配置SSL證書實(shí)現(xiàn)Https訪問
這篇文章主要介紹了詳解Nginx配置SSL證書實(shí)現(xiàn)Https訪問,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07解決nginx 503 Service Temporarily Unavailable方法示例
這篇文章主要介紹了解決nginx 503 Service Temporarily Unavailable方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12詳解Nginx中的Rewrite的重定向配置與實(shí)踐
這篇文章主要介紹了詳解Nginx中的Rewrite的重定向配置與實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Windows設(shè)置nginx啟動(dòng)端口的方法
在服務(wù)器配置與開發(fā)過程中,nginx 作為一款高效的 HTTP 和反向代理服務(wù)器,被廣泛應(yīng)用,而在 Windows 系統(tǒng)中,合理設(shè)置 nginx 的啟動(dòng)端口,是確保其正常運(yùn)行與滿足業(yè)務(wù)需求的關(guān)鍵步驟,本文將詳細(xì)介紹 Windows 設(shè)置 nginx 啟動(dòng)端口的方法,需要的朋友可以參考下2025-02-02nginx代理服務(wù)器配置雙向證書驗(yàn)證的方法
今天小編就為大家分享一篇關(guān)于nginx代理服務(wù)器配置雙向證書驗(yàn)證的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02nginx配置location?root簡(jiǎn)單方法記錄
Location是Nginx中一個(gè)非常核心的配置,下面這篇文章主要給大家介紹了關(guān)于nginx配置location?root的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Nginx 平滑升級(jí)的實(shí)現(xiàn)(拒絕服務(wù)漏洞)
本文主要介紹了Nginx 平滑升級(jí)的實(shí)現(xiàn)(拒絕服務(wù)漏洞),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02