1. 程式人生 > >如何在Nginx不繫結域名下使用SSL/TLS證書?

如何在Nginx不繫結域名下使用SSL/TLS證書?

# 前提 該文主要記錄如何在沒有購買域名的情況下使用SSL/TLS協議,即地址前面的**http**變成了**https**。但是這樣的SSL協議是會被瀏覽器認為是不安全的。在開發或者測試環境可以這樣搞,生產環境下還是乖乖的買個域名吧。 # SSL證書 ## 第一步 首先到[https://csr.chinassl.net/generator-csr.html](https://csr.chinassl.net/generator-csr.html)這裡生成SSL祕鑰(私鑰)和等會拿去生成SSL證書的CSR檔案。裡面內容可以隨便填,域名啥的隨便填都沒關係。儲存好這兩個檔案。 ## 第二步 拿剛才的CSR檔案到[https://csr.chinassl.net/free-ssl.html](https://csr.chinassl.net/free-ssl.html)這裡生成SSL證書。 到這裡為止,我們只需要記住**祕鑰**和**SSL證書**的儲存路徑,在nginx配置檔案當中需要使用到。 假設存到這裡吧。 ```bash /etc/ssl/my_domain/my_domain.ssl /etc/ssl/my_domain/my_domain.private ``` 我這裡只是改了檔案的字尾而已,並不影響使用。檔案的字尾名你們自行決定也可以。 # Nginx新增SSL模組 先檢視Nginx以前安裝過的模組,避免編譯後覆蓋了之前新增的模組。進入到你的nginx安裝包目錄。執行以下命令 ```bash # ./objs/nginx -V nginx version: nginx/1.16.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-http_realip_module ``` 主要看`configure arguments`這一行,那麼我之前的預編譯命令就是如下,而如果沒有自定義新增過任何模組那麼這裡應該為空的 ```bash ./configure --prefix=/usr/local/nginx --with-http_realip_module ``` 現在需要新增SSL模組,那麼命令如下: ```bash ./configure --prefix=/usr/local/nginx --with-http_realip_module \ --with-http_ssl_module ``` 然後執行`make`命令,已經安裝過安裝過nginx的(即執行過`make install`),就不要執行 `make install`,不然把你之前安裝好的nginx檔案覆蓋掉。 當然,未安裝Nginx的就可以執行`make install`命令了。 # 更新Nginx啟動檔案 ## 方式一:停止Nginx服務更新 ```bash cd /usr/local/nginx/sbin/ ./nginx -s stop mv ./nginx ./nginx.old cp nginx安裝包目錄/objs/nginx ./nginx ``` ## 方式二:熱部署更新 可以參考我公眾號的文章:[https://mp.weixin.qq.com/s/o7rkczakPNiys1KM7Z87EA](https://mp.weixin.qq.com/s/o7rkczakPNiys1KM7Z87EA) # 配置檔案 ```bash vim /usr/local/nginx/conf/nginx.conf ``` 配置檔案我只摘取了server模組,如下: ```nginx server { listen 80; server_name 127.0.0.1; location / { # 重定向到https rewrite ^/(.*) https://$host$1 permanent; } } server { listen 443 ssl; server_name 127.0.0.1; ssl_certificate /etc/ssl/my_domain/my_domain.ssl; # ssl證書儲存路徑 ssl_certificate_key /etc/ssl/my_domain/my_domain.private; # 祕鑰儲存路徑 # ssl的一些配置 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #開啟TLS協議 location / { root html; index index.html index.htm; } } ``` 此時輸入ip地址,你就能看到`https`了。 # 擴充套件知識 ## 多個SSL模組 當nginx的多個模組都需要使用SSL協議時,如PC端的前端專案使用了80埠轉發,手機端使用了81埠轉發。那麼可以改成如下: ```nginx server { # PC端 listen 80; server_name 127.0.0.1; location / { # 重定向到https,https預設埠是443 rewrite ^/(.*) https://$host$1 permanent; } } server { # 手機端 listen 81; server_name 127.0.0.1; location / { # 重定向到https,指定跳轉到8443埠 rewrite ^/(.*) https://$host:8443$1 permanent; } } server { listen 443 ssl; server_name 127.0.0.1; ssl_certificate /etc/ssl/my_domain/my_domain.ssl; # ssl證書儲存路徑 ssl_certificate_key /etc/ssl/my_domain/my_domain.private; # 祕鑰儲存路徑 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #開啟TLS協議 location / { root html; index index.html index.htm; } } server { listen 8443 ssl; server_name 127.0.0.1; ssl_certificate /etc/ssl/my_domain/my_domain.ssl; # ssl證書儲存路徑 ssl_certificate_key /etc/ssl/my_domain/my_domain.private; # 祕鑰儲存路徑 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #開啟TLS協議 location / { root html; index index.html index.htm; } } ``` ## 443埠轉發 https的預設埠是443,而沒有root許可權的使用者啟動時,nginx會提示沒有許可權使用443埠,此時則需要使用埠轉發規則,把443轉發到其它埠,如8443。那麼需要root使用者執行以下命令 ```bash iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 iptables -t nat -nL --line service iptables save ``` 然後把nginx配置檔案的監聽埠改成`8443 ssl` ```nginx server { listen 80; server_name 127.0.0.1; location / { # 重定向到https,https預設埠是443,因為埠轉發規則,轉發到8443 rewrite ^/(.*) https://$host$1 permanent; } } server { listen 8443 ssl; server_name 127.0.0.1; ... } ``` # 總結 OK,這就是最近工作上需要完成的一個功能,還是自己太菜了。總結以下,希望也能幫到別人。~Thanks♪(・ω・)ノ > 個人部落格網址: https://colablog.cn/ 如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您 ![微信公眾號](http://qiniuyun.colablog.cn/%E4%BA%8C%E7%BB%B4%E7%A0%