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


前提

該文主要記錄如何在沒有購買域名的情況下使用SSL/TLS協議,即地址前面的http變成了https。但是這樣的SSL協議是會被瀏覽器認為是不安全的。在開發或者測試環境可以這樣搞,生產環境下還是乖乖的買個域名吧。

SSL證書

第一步

首先到https://csr.chinassl.net/generator-csr.html這里生成SSL秘鑰(私鑰)和等會拿去生成SSL證書的CSR文件。里面內容可以隨便填,域名啥的隨便填都沒關系。保存好這兩個文件。

第二步

拿剛才的CSR文件到https://csr.chinassl.net/free-ssl.html這里生成SSL證書。

到這里為止,我們只需要記住秘鑰SSL證書的存儲路徑,在nginx配置文件當中需要使用到。
假設存到這里吧。

/etc/ssl/my_domain/my_domain.ssl
/etc/ssl/my_domain/my_domain.private

我這里只是改了文件的后綴而已,並不影響使用。文件的后綴名你們自行決定也可以。

Nginx添加SSL模塊

先查看Nginx以前安裝過的模塊,避免編譯后覆蓋了之前添加的模塊。進入到你的nginx安裝包目錄。執行以下命令

# ./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這一行,那么我之前的預編譯命令就是如下,而如果沒有自定義添加過任何模塊那么這里應該為空的

./configure --prefix=/usr/local/nginx --with-http_realip_module

現在需要添加SSL模塊,那么命令如下:

./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服務更新

cd /usr/local/nginx/sbin/
./nginx -s stop
mv ./nginx ./nginx.old
cp nginx安裝包目錄/objs/nginx ./nginx

方式二:熱部署更新

可以參考我公眾號的文章:https://mp.weixin.qq.com/s/o7rkczakPNiys1KM7Z87EA

配置文件

vim /usr/local/nginx/conf/nginx.conf

配置文件我只摘取了server模塊,如下:

    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端口轉發。那么可以改成如下:

    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用戶執行以下命令

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

    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/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您
微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM