該文主要記錄如何在沒有購買域名的狀況下使用SSL/TLS協議,即地址前面的http變成了https。可是這樣的SSL協議是會被瀏覽器認爲是不安全的。在開發或者測試環境能夠這樣搞,生產環境下仍是乖乖的買個域名吧。html
首先到https://csr.chinassl.net/generator-csr.html這裏生成SSL祕鑰(私鑰)和等會拿去生成SSL證書的CSR文件。裏面內容能夠隨便填,域名啥的隨便填都不要緊。保存好這兩個文件。前端
拿剛纔的CSR文件到https://csr.chinassl.net/free-ssl.html這裏生成SSL證書。nginx
到這裏爲止,咱們只須要記住祕鑰和SSL證書的存儲路徑,在nginx配置文件當中須要使用到。
假設存到這裏吧。vim
/etc/ssl/my_domain/my_domain.ssl /etc/ssl/my_domain/my_domain.private
我這裏只是改了文件的後綴而已,並不影響使用。文件的後綴名大家自行決定也能夠。瀏覽器
先查看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
這一行,那麼我以前的預編譯命令就是以下,而若是沒有自定義添加過任何模塊那麼這裏應該爲空的bash
./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
命令了。session
cd /usr/local/nginx/sbin/ ./nginx -s stop mv ./nginx ./nginx.old cp nginx安裝包目錄/objs/nginx ./nginx
能夠參考我公衆號的文章:https://mp.weixin.qq.com/s/o7rkczakPNiys1KM7Z87EAdom
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
了。
當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; } }
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/
若是個人文章幫助到您,能夠關注個人微信公衆號,第一時間分享文章給您