SpringBoot配置Https訪問的詳細步驟
一、Https協(xié)議
- HTTP(Hypertext transfer protocal)是一種詳細規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間相互通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
- HTTPS(Hypertext transfer protocal over Secure Socket Layer)是以安全為目標(biāo)的http通道,https的安全基礎(chǔ)是ssl,因此加密的詳細內(nèi)容就需要ssl。https協(xié)議需要到ca申請證書(一般免費的證書很少)。
- http是超文本傳輸協(xié)議,信息是明文傳輸?shù)模╤ttp協(xié)議是不安全的,黑客可以在用戶和服務(wù)器之間設(shè)置攔截器竊取傳輸?shù)膬?nèi)容。也可以偽造用戶提交的表單向服務(wù)器發(fā)出請求,從而獲取到服務(wù)器的響應(yīng))。https則是具有安全性的ssl加密傳輸協(xié)議,http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
超文本傳輸安全協(xié)議(Https,也被稱作HTTP over TLS, HTTP over SSL或者HTTP Secure)是一種網(wǎng)絡(luò)安全的傳輸協(xié)議,SSL(Secure Socket Layer,安全套接字層),TLS(Transport Layer Security,傳輸層安全協(xié)議),HTTPS開發(fā)的主要目的,是提供對網(wǎng)絡(luò)服務(wù)器的認證,保證交換信息的機密性和完整性。
SSL是位于可靠的面向連接的網(wǎng)絡(luò)層協(xié)議和應(yīng)用層協(xié)議之間的一種協(xié)議。SSL通過相互認證、使用數(shù)字簽名保證完整性、使用加密確私密性,以實現(xiàn)客戶端和服務(wù)器之間的安全通訊。該協(xié)議由兩層組成:SSL加密協(xié)議和SSL握手協(xié)議。SSL的核心概念:加密算法,數(shù)字證書,CA。
TLS用于確保兩個通用程序之間提供保密性和數(shù)據(jù)完整性。該協(xié)議由兩層組成:TLS記錄協(xié)議和TLS握手協(xié)議(TLS是傳輸層加密協(xié)議,它的前身是SSL協(xié)議,如果沒有特殊要求,可以簡單理解為TLS和SSL都屬于同一協(xié)議)。
1.1 TLS、SSL加密算法
加密算法嚴(yán)格來說屬于編碼學(xué)(密碼編碼學(xué)),編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程,解碼是編碼的逆過程(對應(yīng)密碼學(xué)中的解密)。加密算法主要分為兩類,對稱加密算法和非對稱加密算法。
- 在對稱加密算法中,使用的密鑰只有一個,發(fā)收信雙方都使用這一個密鑰進行加密和解密,這就要求解密方事先知道加密密鑰。
- 非對稱加密算法需要兩個密鑰,公開密鑰和私有密鑰,公開密鑰與私有密鑰是一對,如果用公開密鑰進行數(shù)據(jù)加密,只有用對應(yīng)的私有密鑰才能解密,服務(wù)器端發(fā)送加密鎖給客戶端,公開密鑰需要定期更換。
身份認證是建立每一個TLS連接不可或缺的部分,比如你有可能跟任何一方建立一個加密的通道,包括攻擊者,除非我們確保通信的,在開始加密通道之前。服務(wù)端是我們可以信任的,否則所有的加密(保密)工作都沒有任何作用,而身份認證的方式就是通過證書以數(shù)字方式簽名的聲明,它將公鑰與持有相應(yīng)私鑰的主體(個人、設(shè)備或服務(wù))身份綁定在一起,通過在證書上簽名,CA可以核實與證書上公鑰相對應(yīng)的私鑰為證書所指定的主體所擁有??蛻舳撕头?wù)器首先必須建立連接和交換參數(shù),這個過程叫握手。
1.2 OpenSSL簽發(fā)證書
OpenSSL是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協(xié)議,并提供了豐富的應(yīng)用程序供測試或其他目的使用。通過在一定范圍內(nèi)部署一臺CA(Certificate Authority)服務(wù)器,可以實現(xiàn)局域網(wǎng)內(nèi)的證書認證和授權(quán),保證數(shù)據(jù)傳輸?shù)陌踩裕部梢酝ㄟ^具體的部署實踐,了解國際上大型CA機構(gòu)的工作原理,為企業(yè)級的證書管理提供知識積累。
使用centos7簽發(fā)證書流程如下:
簽發(fā)CA根證書
1.生成CA密鑰對(密鑰對長度2048字節(jié))
openssl genrsa -out /usr/local/srv/ftp/cas/cakey.pem 2048 RSA
2.生成根證書簽發(fā)申請(證書訪問時已域名出現(xiàn))
openssl req -new -key /usr/local/srv/ftp/cas/cakey.pem -out /usr/local/srv/ftp/cas/cacert.csr -subj /CN=cas.com
3.根證書簽發(fā)
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey /usr/local/srv/ftp/cas/cakey.pem -in /usr/local/srv/ftp/cas/cacert.csr -out /usr/local/srv/ftp/cas/ca.cer
簽發(fā)服務(wù)器證書
1.生成服務(wù)器私鑰
openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/server/server-key.pem 2048
2.生成服務(wù)器證書簽發(fā)申請
openssl req -new -key /usr/local/srv/ftp/cas/server/server-key.pem -out /usr/local/srv/ftp/cas/server/server.csr -subj /CN=cas.com
3.生成服務(wù)器證書
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA /usr/local/srv/ftp/cas/ca.cer -CAkey /usr/local/srv/ftp/cas/cakey.pem -CAserial /usr/local/srv/ftp/cas/server/ca.srl -CAcreateserial -in /usr/local/srv/ftp/cas/server/server.csr -out /usr/local/srv/ftp/cas/server/server.cer
簽發(fā)客戶端證書
1.生成客戶端私鑰
openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/client/client-key.pem 2048
2.生成客戶端證書申請
openssl req -new -key /usr/local/srv/ftp/cas/client/client-key.pem -out /usr/local/srv/ftp/cas/client/client.csr -subj /CN=cas.com
3.生成客戶端簽發(fā)證書
openssl x509 -req -days 365 -sha1 -CA /usr/local/srv/ftp/cas/ca.cer -CAkey /usr/local/srv/ftp/cas/cakey.pem -CAserial /usr/local/srv/ftp/cas/server/ca.srl -in /usr/local/srv/ftp/cas/client/client.csr -out /usr/local/srv/ftp/cas/client/client.cer
生成Java證書(證書轉(zhuǎn)換)
1.生成客戶端證書
openssl pkcs12 -export -clcerts -name cas-client -inkey /usr/local/srv/ftp/cas/client/client-key.pem -in /usr/local/srv/ftp/cas/client/client.cer -out /usr/local/srv/ftp/cas/client/client.p12
2.生成服務(wù)器證書
openssl pkcs12 -export -clcerts -name cas-server -inkey /usr/local/srv/ftp/cas/server/server-key.pem -in /usr/local/srv/ftp/cas/server/server.cer -out /usr/local/srv/ftp/cas/server/server.p12
3.服務(wù)器證書導(dǎo)入本機受信任證書
keytool -importcert -trustcacerts -alias cas.com -file /usr/local/srv/ftp/cas/ca.cer -keystore /usr/local/tomcat/ca-trust.p12
4.查看所有證書信息
keytool -list -keystore /usr/local/srv/ftp/cas/client/client.p12 -storetype pkcs12 -v
二、SpringBoot配置Https
在Tomcat容器或是在SpringBoot項目中配置Https,一般都屬于單體應(yīng)用。實際上的分布式系統(tǒng)應(yīng)該在Nginx代理上實現(xiàn)Https證書的配置。
2.1 生成證書
keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore
執(zhí)行上面的命令將會生成一個erver.keystore的證書文件,將此文件拷貝到資源目錄中。
2.2 修改配置
application.yml支持如下配置信息:
No. | 屬性名稱 | 描述 |
---|---|---|
1 | server.ssl.ciphers | 設(shè)置是否支持SSL Ciphers |
2 | server.ssl.client-auth | 設(shè)置client-Authentica是Wanted還是Needed |
3 | server.ssl.enabled | 設(shè)置是否開啟SSL |
4 | server.ssl.key-alias | 設(shè)置keystore中key的別名 |
5 | server.ssl.key-password | 設(shè)置keystore中key的密碼 |
6 | server.ssl.key-store | 設(shè)置keyStore的路徑 |
7 | server.ssl.key-store-password | 設(shè)置訪問keyStore的密碼 |
8 | server.ssl.key-store-provider | 設(shè)置keyStore的提供者 |
9 | server.ssl.key-store-type | 設(shè)置keyStore類型 |
10 | server.ssl.protocol | 設(shè)置SSL協(xié)議類型,默認為TLS |
11 | server.ssl.trust-store | 設(shè)置持有SSL Certificates的Trust Store |
12 | server.ssl.trust-store-password | 設(shè)置訪問Trust Store的密碼 |
13 | server.ssl.trust-store-provider | 設(shè)置Trust Store的提供者 |
14 | server.ssl.trust-store-type | 設(shè)置Trust Store的類型 |
修改application.yml文件:
server: port: 443 # https默認訪問端口 ssl: key-store: classpath:server.keystore # 證書存放的位置 key-alias: tomcat # 證書別名 key-store-type: JKS # P12證書格式 key-store-password: 123456
編寫SpringBoot啟動類:
@Controller @SpringBootApplication public class StartSpringBoot { public static void main(String[] args) { SpringApplication.run(StartSpringBoot.class, args); } @ResponseBody @RequestMapping("/home") public String home() { return "<h1>hello springboot !!! </h1>"; } }
啟動項目,發(fā)現(xiàn)Tomcat在443端口進行了啟動:
訪問https://localhost/home
:
2.3 配置轉(zhuǎn)換器
既然已經(jīng)配置了https訪問,那么原來使用http協(xié)議進行訪問的路徑也應(yīng)該重定向到https路徑下,這里僅以tomcat為例,新建配置類:
@Configuration public class HttpConnectorConfig { /** * 獲取Http連接器 * @return Connector */ public Connector getHttpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); // 使用http協(xié)議 connector.setSecure(false); // 非安全傳輸 connector.setPort(80); // HTTP監(jiān)聽端口 connector.setRedirectPort(443); // 重定向端口 return connector; } @Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); // 設(shè)置約束 SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); // 所有的路徑全部進行重定向處理 securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(getHttpConnector()); // 添加連接器 return tomcat; } }
重新啟動項目,發(fā)現(xiàn)項目同時監(jiān)聽了80和443端口。
訪問:http://localhost/home
發(fā)現(xiàn)自動跳轉(zhuǎn)為https訪問。
到此這篇關(guān)于SpringBoot配置Https訪問的文章就介紹到這了,更多相關(guān)SpringBoot配置Https訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot升級至2.4.0中出現(xiàn)的跨域問題分析及修改方案
這篇文章主要介紹了Springboot升級至2.4.0中出現(xiàn)的跨域問題分析及修改方案,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12SpringCloud客戶端的負載均衡Ribbon的實現(xiàn)
微服務(wù)架構(gòu),不可避免的存在單個微服務(wù)有多個實例,這篇文章主要介紹了SpringCloud客戶端的負載均衡Ribbon的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06