Nginx+Tomcat配置https的實(shí)現(xiàn)
自已公司內(nèi)部的系統(tǒng),需要修改為https訪問,使用Nginx+Tomcat,此文記錄了整個過程,因?yàn)橄到y(tǒng)使用了jsp,而且頁面中大量使用了request.getScheme()+“: //”+request.getServerName()+“:”+request.getServerPort()來組合URL進(jìn)行數(shù)據(jù)的提交,導(dǎo)致最終界面中出現(xiàn)了http://協(xié)議,為了不改動代碼,最終方案采用nginx和tomcat都開啟https,由nginx轉(zhuǎn)發(fā)到tomcat的https上,最終完美搭建成功。
一、獲取證書
如果是互聯(lián)網(wǎng)應(yīng)用,需要向權(quán)威機(jī)構(gòu)申請證書,
此處給出局域網(wǎng)生成私有證書的方法(在linux下執(zhí)行):
1.創(chuàng)建服務(wù)器證書密鑰文件 server.key:
openssl genrsa -des3 -out server.key 1024
輸入密碼,確認(rèn)密碼,自己隨便定義,但是要記住,后面會用到。
2.創(chuàng)建服務(wù)器證書的申請文件 server.csr
openssl req -new -key server.key -out server.csr
輸出內(nèi)容為:
Enter pass phrase for root.key: ← 輸入前面創(chuàng)建的密碼 Country Name (2 letter code) [AU]:CN ← 國家代號,中國輸入CN State or Province Name (full name) [Some-State]:HeNan ← 省的全名,拼音 Locality Name (eg, city) []:ZhengZhou ← 市的全名,拼音 Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany. ← 公司英文名 Organizational Unit Name (eg, section) []: ← 可以不輸入 Common Name (eg, YOUR name) []: ← 此時不輸入 Email Address []:admin@mycompany.com ← 電子郵箱,可隨意填 Please enter the following ‘extra' attributes to be sent with your certificate request A challenge password []: ← 可以不輸入 An optional company name []: ← 可以不輸入
3.備份一份服務(wù)器密鑰文件
cp server.key server.key.org
4.去除文件口令,生成私鑰
openssl rsa -in server.key.org -out server.key
5.生成證書文件server.crt(公鑰,會發(fā)送給瀏覽器)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
6.有用的就是server.key和server.crt文件,下面配置Nginx時會用到
二、配置Nginx
修改conf/nginx.conf文件,修改server段的端口監(jiān)聽部分
server { #listen 80; #比起默認(rèn)的80 使用了443 默認(rèn) 是ssl方式 listen 443 default ssl; #開啟 如果把ssl on;這行去掉,ssl寫在443端口后面。這樣http和https的鏈接都可以用 ssl on; #證書(公鑰.發(fā)送到客戶端的) ssl_certificate ssl/server.crt; #私鑰 ssl_certificate_key ssl/server.key;
修改反向代理的部分
location / { proxy_pass https://127.0.0.1:8443; proxy_redirect off; proxy_set_header Host $host:$server_port; proxy_set_header Remote_Addr $remote_addr; proxy_set_header X-REAL-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; add_header Content-Security-Policy upgrade-insecure-requests; index index.html index.htm index.jsp; }
將http請求重寫為https請求的配置(寫在server段內(nèi))
error_page 497 https://$host:$server_port$uri;
三、配置Tomcat,打開https請求
修改conf/server.xml文件,打開Https的配置段,配置證書路徑,同時將server.crt和server.key文件拷貝至Tomcat/ssl目錄下
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https"> <SSLHostConfig> <Certificate certificateFile="ssl/server.crt" certificateKeyFile="ssl/server.key" type="RSA" /> </SSLHostConfig> </Connector>
四、各類問題解決
1、將訪問https端口的http請求地址重寫為https協(xié)議
在nginx.conf文件內(nèi)的server段中,增加對497狀態(tài)碼的轉(zhuǎn)發(fā)配置
error_page 497 https://$host:$server_port$uri;
原理:當(dāng)站點(diǎn)只允許https訪問時,使用http訪問時會報(bào)出497錯誤碼,此時使用error_page指令將497代碼的URL重定向到https的正確路徑
HTTP CODE 497的官方解釋:
497 - normal request was sent to HTTPS
2、redirect轉(zhuǎn)發(fā)時丟失端口號的處理
網(wǎng)上查到的各種配置中,很多配置中對Host的設(shè)置使用了h o s t 變量,因?yàn)?host變量,因?yàn)閔ost變量,因?yàn)閔ost中不含端口號信息,所以會丟失端口號,解決辦法為修改h o s t 為 host為host為http_post或h o s t : host:host:server_port
proxy_set_header Host $host:$server_port; #這兩種配置都可以,其中$http_post是$http_HEADER的匹配規(guī)則,取的是請求頭中host的屬性值 proxy_set_header Host $http_host;
3、Jsp中使用request.getScheme()只得到http問題處理
這個問題目前只找到了一種解決方案,就是將Tomcat也開啟https協(xié)議,nginx轉(zhuǎn)發(fā)時使用https://協(xié)議進(jìn)行轉(zhuǎn)發(fā),就能完美解決這個問題。
附表 nginx.conf中可以使用的變量
變量名 | 定義 |
---|---|
$arg_PARAMETER | GET請求中變量名PARAMETER參數(shù)的值 |
$args | 這個變量等于GET請求中的參數(shù)。例如,foo=123&bar=blahblah;這個變量只可以被修改 |
$binary_remote_addr | 二進(jìn)制碼形式的客戶端地址。 |
$body_bytes_sent | 傳送頁面的字節(jié)數(shù) |
$content_length | 請求頭中的Content-length字段。 |
$content_type | 請求頭中的Content-Type字段。 |
$cookie_COOKIE | cookie COOKIE的值。 |
$document_root | 當(dāng)前請求在root指令中指定的值。 |
$document_uri | 與$uri相同。 |
$host | 請求中的主機(jī)頭(Host)字段,如果請求中的主機(jī)頭不可用或者空,則為處理請求的server名稱(處理請求的server的server_name指令的值)。值為小寫,不包含端口。 |
$hostname | 機(jī)器名使用 gethostname系統(tǒng)調(diào)用的值 |
$http_HEADER | HTTP請求頭中的內(nèi)容,HEADER為HTTP請求中的內(nèi)容轉(zhuǎn)為小寫,-變?yōu)開(破折號變?yōu)橄聞澗€),例如:$http_user_agent(Uaer-Agent的值); |
$sent_http_HEADER | HTTP響應(yīng)頭中的內(nèi)容,HEADER為HTTP響應(yīng)中的內(nèi)容轉(zhuǎn)為小寫,-變?yōu)開(破折號變?yōu)橄聞澗€),例如: $sent_http_cache_control, $sent_http_content_type…; |
$is_args | 如果$args設(shè)置,值為"?“,否則為”"。 |
$limit_rate | 這個變量可以限制連接速率。 |
$nginx_version | 當(dāng)前運(yùn)行的nginx版本號。 |
$query_string | 與$args相同。 |
$remote_addr | 客戶端的IP地址。 |
$remote_port | 客戶端的端口。 |
$remote_user | 已經(jīng)經(jīng)過Auth Basic Module驗(yàn)證的用戶名。 |
$request_filename | 當(dāng)前連接請求的文件路徑,由root或alias指令與URI請求生成。 |
$request_body | 這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義。 |
$request_body_file | 客戶端請求主體信息的臨時文件名。 |
$request_completion | 如果請求成功,設(shè)為"OK";如果請求未完成或者不是一系列請求中最后一部分則設(shè)為空。 |
$request_method | 這個變量是客戶端請求的動作,通常為GET或POST。包括0.8.20及之前的版本中,這個變量總為main request中的動作,如果當(dāng)前請求是一個子請求,并不使用這個當(dāng)前請求的動作。 |
$request_uri | 這個變量等于包含一些客戶端請求參數(shù)的原始URI,它無法修改,請查看$uri更改或重寫URI。 |
$scheme | 所用的協(xié)議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect; |
$server_addr | 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個值,如果要繞開系統(tǒng)調(diào)用,則必須在listen中指定地址并且使用bind參數(shù)。 |
$server_name | 服務(wù)器名稱。 |
$server_port | 請求到達(dá)服務(wù)器的端口號。 |
$server_protocol | 請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。 |
$uri | 請求中的當(dāng)前URI(不帶請求參數(shù),參數(shù)位于args,不同于瀏覽器傳遞的args),不同于瀏覽器傳遞的request_uri的值,它可以通過內(nèi)部重定向,或者使用index指令進(jìn)行修改。不包括協(xié)議和主機(jī)名,例如/foo/bar.html |
到此這篇關(guān)于Nginx+Tomcat配置https的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx+Tomcat配置https內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx下Frp強(qiáng)制重定向?yàn)閔ttps配置詳解
這篇文章主要介紹了Nginx下Frp強(qiáng)制重定向?yàn)閔ttps配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04nginx網(wǎng)站服務(wù)如何配置防盜鏈(推薦)
這篇文章主要介紹了nginx網(wǎng)站服務(wù)如何配置防盜鏈,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01深入探究Nginx體系化之虛擬主機(jī)分類及配置實(shí)現(xiàn)
Nginx,這款備受推崇的高性能 Web 服務(wù)器,以其強(qiáng)大的性能和靈活的配置而廣受歡迎,在實(shí)際應(yīng)用中,虛擬主機(jī)是一項(xiàng)重要的功能,允許我們在單個服務(wù)器上托管多個網(wǎng)站,本文將深入探討 Nginx 虛擬主機(jī)的分類和配置實(shí)現(xiàn),幫助您構(gòu)建一個高效多站點(diǎn)托管平臺2023-08-08