之前配置HTTPS協議都是直接網上找例子照搬,最近配置公司服務器時發現分佈式服務配置存在很多問題,於是寫一下配置過程,記錄一下
分佈式系統中大部分會使用到nginx+tomcat實現服務部署及負載均衡,尤其時springboot流行起來後,直接一個jar包放到服務器運行,使用內置tomcat,今天主要就是從一下幾個模塊開講。
- nginx配置https
- tomcat配置https
- springboot配置https
首先我們需要了解一下
https和http的區別:
HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此,HTTP協議不適合傳輸一些敏感信息。
爲了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS,爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。
HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全
HTTPS協議的主要作用可以分爲兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
主要區別:
- https協議需要到CA申請證書,一般免費證書較少,因而需要一定費用,也可以自己生成,但不安全。
- http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl/tls加密傳輸協議
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443
- http的連接很簡單,是無狀態的;HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
瞭解了兩者的不同,我們就開始今天的主要內容了
考慮到開發環境和部署環境的不同,我們分兩步介紹nginx的https配置
1)windows服務器下搭建nginx的https
-
安裝OpenSSL
OpenSSL下載地址
直接運行安裝即可,配置環境變量:
新增環境變量
變量名:OPENSSL_HOME
變量值:C:\OpenSSL-Win64\bin;
修改Path變量結尾添加一條: %OPENSSL_HOME% -
安裝Nginx(請自行百度,不再介紹)
nginx官網
進入到nginx目錄下,雙擊nginx.exe文件即可啓動服務器。
在瀏覽器地址欄輸入http://localhost,如果可以成功訪問到Nginx的歡迎界面,則說明安裝成功 -
生成證書
首先在Nginx安裝目錄中創建ssl文件夾用於存放證書
執行cmd cd
到nginx/config/ssl目錄
創建私鑰:openssl genrsa -des3 -out buduhuisi.key 1024
兩次輸入密碼,記住密碼,後邊會用到
創建csr證書:openssl req -new -key buduhuisi.key -out buduhuisi.csr
去除密碼校驗:複製buduhuisi.key並重命名爲buduhuisi.key.org然後執行命令以去除口令:
openssl rsa -in buduhuisi.key.org -out buduhuisi.key
這裏需要輸入上邊記錄的密碼了
生成crt證書:openssl x509 -req -days 365 -in buduhuisi.csr -signkey buduhuisi.key -out buduhuisi.crt
至此證書就生成完畢了
- 修改Nginx的nginx.conf配置文件
server {
listen 443 ssl; #直接放到端口後面可同時使用http和https
#ssl on; 開啓https
server_name localhost;
ssl_certificate C://nginx//config//ssl//buduhuisi.crt;
ssl_certificate_key C://nginx//config//ssl//buduhuisi.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
2)liunx服務器下搭建nginx的https(我已安裝nginx,所以直接添加模塊)
- 安裝nginx
可參考 nginx安裝教程 - 監測nginx是否包含ssl模塊
#跳轉到nginx路徑
cd /usr/local/nginx/sbin
#nginx 模塊
./nginx -V
- 安裝ssl模塊
#切換到源碼包
cd /usr/local/src/nginx-1.11.3
#重新配置nginx,加載ssl模塊
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#重新編譯,這裏不需要make install,否則會覆蓋安裝
make
#備份原有安裝的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
#覆蓋新的nginx
cp ./objs/nginx /usr/local/nginx/sbin/
#提示是否覆蓋,輸入Y
#重啓nginx
./nginx
#查看模塊信息
./nginx -V
- 生成證書
創建服務器證書密鑰文件 server.key:openssl genrsa -des3 -out server.key 1024
輸入密碼,確認密碼,自己隨便定義,但是要記住,後面會用到
創建服務器證書的申請文件 server.csr:openssl req -new -key server.key -out server.csr
按要求填寫信息
備份一份服務器密鑰文件:cp server.key server.key.org
去除文件口令:openssl rsa -in server.key.org -out server.key
生成證書文件server.crt:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
- 修改配置文件
server{
#比起默認的80 使用了443 默認 是ssl方式 多出default之後的ssl
listen 443 default ssl; #default 可省略
#開啓 如果把ssl on;這行去掉,ssl寫在443端口後面。這樣http和https的鏈接都可以用
ssl on;
#證書(公鑰.發送到客戶端的)
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
server_name www.daj.com;
location / {
proxy_redirect off;
proxy_pass https://www.tao.com/;
}
}
有時候我們的服務是nginx+tomcat的,所以我們需要開啓tomcat對https的支持,當然也可以直接配置證書到tomcat開啓服務的https
開啓tomcat的https支持:
(1)Connector節點加入 redirectPort="443" proxyPort="443"
//結合實際業務
(2)加入新的Value節點
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"/>
至此nginx配置https完成
接下來我們來實現tomcat服務器的https配置
-
生成證書(使用jdk生成,免費)
(1)在jdk的安裝目錄\bin\keytool.exe下打開keytool.exe(2)執行命令:
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"
(3)按要求填寫對應信息後執行完畢,到指定目錄查找證書文件
-
修改tomcat服務器配置server.xml
定位到tomcat服務器的安裝目錄, 找到conf下的server.xml文件,修改端口配置
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="g:\tomcat.keystore"
keystorePass="123456" />
- 重啓tomcat,訪問
https://localhost:8443/
至此tomcat配置https完成
最後一塊內容,修改springboot的內置服務器使用https
- 證書創建直接參考上述tomcat證書的生成流程
- 修改配置application.yml
server.port=8083
server.ssl.key-store=server.keystore //證書位置
server.ssl.key-alias=tomcat
server.ssl.enabled=true
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS
證書可以放在絕對路徑也可以放到系統的根路徑下
- 配置http訪問自動轉https訪問(可以不做,同時支持http和https請求)
向spring容器中注入兩個Bean,代碼如下
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}