SpringBoot配置Https訪問(wèn)的詳細(xì)步驟
一、Https協(xié)議
- HTTP(Hypertext transfer protocal)是一種詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)服務(wù)器之間相互通信的規(guī)則,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
- HTTPS(Hypertext transfer protocal over Secure Socket Layer)是以安全為目標(biāo)的http通道,https的安全基礎(chǔ)是ssl,因此加密的詳細(xì)內(nèi)容就需要ssl。https協(xié)議需要到ca申請(qǐng)證書(shū)(一般免費(fèi)的證書(shū)很少)。
- http是超文本傳輸協(xié)議,信息是明文傳輸?shù)模╤ttp協(xié)議是不安全的,黑客可以在用戶和服務(wù)器之間設(shè)置攔截器竊取傳輸?shù)膬?nèi)容。也可以偽造用戶提交的表單向服務(wù)器發(fā)出請(qǐng)求,從而獲取到服務(wù)器的響應(yīng))。https則是具有安全性的ssl加密傳輸協(xié)議,http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

超文本傳輸安全協(xié)議(Https,也被稱(chēng)作HTTP over TLS, HTTP over SSL或者HTTP Secure)是一種網(wǎng)絡(luò)安全的傳輸協(xié)議,SSL(Secure Socket Layer,安全套接字層),TLS(Transport Layer Security,傳輸層安全協(xié)議),HTTPS開(kāi)發(fā)的主要目的,是提供對(duì)網(wǎng)絡(luò)服務(wù)器的認(rèn)證,保證交換信息的機(jī)密性和完整性。

SSL是位于可靠的面向連接的網(wǎng)絡(luò)層協(xié)議和應(yīng)用層協(xié)議之間的一種協(xié)議。SSL通過(guò)相互認(rèn)證、使用數(shù)字簽名保證完整性、使用加密確私密性,以實(shí)現(xiàn)客戶端和服務(wù)器之間的安全通訊。該協(xié)議由兩層組成:SSL加密協(xié)議和SSL握手協(xié)議。SSL的核心概念:加密算法,數(shù)字證書(shū),CA。
TLS用于確保兩個(gè)通用程序之間提供保密性和數(shù)據(jù)完整性。該協(xié)議由兩層組成:TLS記錄協(xié)議和TLS握手協(xié)議(TLS是傳輸層加密協(xié)議,它的前身是SSL協(xié)議,如果沒(méi)有特殊要求,可以簡(jiǎn)單理解為T(mén)LS和SSL都屬于同一協(xié)議)。
1.1 TLS、SSL加密算法
加密算法嚴(yán)格來(lái)說(shuō)屬于編碼學(xué)(密碼編碼學(xué)),編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過(guò)程,解碼是編碼的逆過(guò)程(對(duì)應(yīng)密碼學(xué)中的解密)。加密算法主要分為兩類(lèi),對(duì)稱(chēng)加密算法和非對(duì)稱(chēng)加密算法。
- 在對(duì)稱(chēng)加密算法中,使用的密鑰只有一個(gè),發(fā)收信雙方都使用這一個(gè)密鑰進(jìn)行加密和解密,這就要求解密方事先知道加密密鑰。

- 非對(duì)稱(chēng)加密算法需要兩個(gè)密鑰,公開(kāi)密鑰和私有密鑰,公開(kāi)密鑰與私有密鑰是一對(duì),如果用公開(kāi)密鑰進(jìn)行數(shù)據(jù)加密,只有用對(duì)應(yīng)的私有密鑰才能解密,服務(wù)器端發(fā)送加密鎖給客戶端,公開(kāi)密鑰需要定期更換。

身份認(rèn)證是建立每一個(gè)TLS連接不可或缺的部分,比如你有可能跟任何一方建立一個(gè)加密的通道,包括攻擊者,除非我們確保通信的,在開(kāi)始加密通道之前。服務(wù)端是我們可以信任的,否則所有的加密(保密)工作都沒(méi)有任何作用,而身份認(rèn)證的方式就是通過(guò)證書(shū)以數(shù)字方式簽名的聲明,它將公鑰與持有相應(yīng)私鑰的主體(個(gè)人、設(shè)備或服務(wù))身份綁定在一起,通過(guò)在證書(shū)上簽名,CA可以核實(shí)與證書(shū)上公鑰相對(duì)應(yīng)的私鑰為證書(shū)所指定的主體所擁有??蛻舳撕头?wù)器首先必須建立連接和交換參數(shù),這個(gè)過(guò)程叫握手。

1.2 OpenSSL簽發(fā)證書(shū)
OpenSSL是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,囊括了主要的密碼算法、常用的密鑰和證書(shū)封裝管理功能以及SSL協(xié)議,并提供了豐富的應(yīng)用程序供測(cè)試或其他目的使用。通過(guò)在一定范圍內(nèi)部署一臺(tái)CA(Certificate Authority)服務(wù)器,可以實(shí)現(xiàn)局域網(wǎng)內(nèi)的證書(shū)認(rèn)證和授權(quán),保證數(shù)據(jù)傳輸?shù)陌踩?,也可以通過(guò)具體的部署實(shí)踐,了解國(guó)際上大型CA機(jī)構(gòu)的工作原理,為企業(yè)級(jí)的證書(shū)管理提供知識(shí)積累。

使用centos7簽發(fā)證書(shū)流程如下:

簽發(fā)CA根證書(shū)
1.生成CA密鑰對(duì)(密鑰對(duì)長(zhǎng)度2048字節(jié))
openssl genrsa -out /usr/local/srv/ftp/cas/cakey.pem 2048 RSA
2.生成根證書(shū)簽發(fā)申請(qǐng)(證書(shū)訪問(wèn)時(shí)已域名出現(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.根證書(shū)簽發(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ù)器證書(shū)
1.生成服務(wù)器私鑰
openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/server/server-key.pem 2048
2.生成服務(wù)器證書(shū)簽發(fā)申請(qǐng)
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ù)器證書(shū)
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ā)客戶端證書(shū)
1.生成客戶端私鑰
openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/client/client-key.pem 2048
2.生成客戶端證書(shū)申請(qǐng)
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ā)證書(shū)
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證書(shū)(證書(shū)轉(zhuǎn)換)
1.生成客戶端證書(shū)
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ù)器證書(shū)
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ù)器證書(shū)導(dǎo)入本機(jī)受信任證書(shū)
keytool -importcert -trustcacerts -alias cas.com -file /usr/local/srv/ftp/cas/ca.cer -keystore /usr/local/tomcat/ca-trust.p12
4.查看所有證書(shū)信息
keytool -list -keystore /usr/local/srv/ftp/cas/client/client.p12 -storetype pkcs12 -v
二、SpringBoot配置Https
在Tomcat容器或是在SpringBoot項(xiàng)目中配置Https,一般都屬于單體應(yīng)用。實(shí)際上的分布式系統(tǒng)應(yīng)該在Nginx代理上實(shí)現(xiàn)Https證書(shū)的配置。
2.1 生成證書(shū)
keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore

執(zhí)行上面的命令將會(huì)生成一個(gè)erver.keystore的證書(shū)文件,將此文件拷貝到資源目錄中。
2.2 修改配置
application.yml支持如下配置信息:
| No. | 屬性名稱(chēng) | 描述 |
|---|---|---|
| 1 | server.ssl.ciphers | 設(shè)置是否支持SSL Ciphers |
| 2 | server.ssl.client-auth | 設(shè)置client-Authentica是Wanted還是Needed |
| 3 | server.ssl.enabled | 設(shè)置是否開(kāi)啟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è)置訪問(wèn)keyStore的密碼 |
| 8 | server.ssl.key-store-provider | 設(shè)置keyStore的提供者 |
| 9 | server.ssl.key-store-type | 設(shè)置keyStore類(lèi)型 |
| 10 | server.ssl.protocol | 設(shè)置SSL協(xié)議類(lèi)型,默認(rèn)為T(mén)LS |
| 11 | server.ssl.trust-store | 設(shè)置持有SSL Certificates的Trust Store |
| 12 | server.ssl.trust-store-password | 設(shè)置訪問(wèn)Trust Store的密碼 |
| 13 | server.ssl.trust-store-provider | 設(shè)置Trust Store的提供者 |
| 14 | server.ssl.trust-store-type | 設(shè)置Trust Store的類(lèi)型 |
修改application.yml文件:
server:
port: 443 # https默認(rèn)訪問(wèn)端口
ssl:
key-store: classpath:server.keystore # 證書(shū)存放的位置
key-alias: tomcat # 證書(shū)別名
key-store-type: JKS # P12證書(shū)格式
key-store-password: 123456編寫(xiě)SpringBoot啟動(dòng)類(lèi):
@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>";
}
}啟動(dòng)項(xiàng)目,發(fā)現(xiàn)Tomcat在443端口進(jìn)行了啟動(dòng):

訪問(wèn)https://localhost/home :

2.3 配置轉(zhuǎn)換器
既然已經(jīng)配置了https訪問(wèn),那么原來(lái)使用http協(xié)議進(jìn)行訪問(wèn)的路徑也應(yīng)該重定向到https路徑下,這里僅以tomcat為例,新建配置類(lèi):
@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)聽(tīng)端口
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("/*"); // 所有的路徑全部進(jìn)行重定向處理
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(getHttpConnector()); // 添加連接器
return tomcat;
}
}重新啟動(dòng)項(xiàng)目,發(fā)現(xiàn)項(xiàng)目同時(shí)監(jiān)聽(tīng)了80和443端口。

訪問(wèn):http://localhost/home 發(fā)現(xiàn)自動(dòng)跳轉(zhuǎn)為https訪問(wèn)。

到此這篇關(guān)于SpringBoot配置Https訪問(wèn)的文章就介紹到這了,更多相關(guān)SpringBoot配置Https訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SSL證書(shū)部署+SpringBoot實(shí)現(xiàn)HTTPS安全訪問(wèn)的操作方法
- SpringBoot配置SSL同時(shí)支持http和https訪問(wèn)實(shí)現(xiàn)
- SpringBoot2.x配置HTTPS訪問(wèn)的過(guò)程
- SpringBoot 改造成https訪問(wèn)的實(shí)現(xiàn)
- springboot+nginx+https+linux實(shí)現(xiàn)負(fù)載均衡加域名訪問(wèn)簡(jiǎn)單測(cè)試
- springboot配置https訪問(wèn)的方法
- SpringBoot應(yīng)用的接口訪問(wèn)從HTTP改為HTTPS
相關(guān)文章
Springboot熱部署實(shí)現(xiàn)原理及實(shí)例詳解
這篇文章主要介紹了Springboot熱部署實(shí)現(xiàn)原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Springboot升級(jí)至2.4.0中出現(xiàn)的跨域問(wèn)題分析及修改方案
這篇文章主要介紹了Springboot升級(jí)至2.4.0中出現(xiàn)的跨域問(wèn)題分析及修改方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Java Socket報(bào)錯(cuò)打開(kāi)文件過(guò)多的問(wèn)題
這篇文章主要介紹了Java Socket報(bào)錯(cuò)打開(kāi)文件過(guò)多的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringCloud客戶端的負(fù)載均衡Ribbon的實(shí)現(xiàn)
微服務(wù)架構(gòu),不可避免的存在單個(gè)微服務(wù)有多個(gè)實(shí)例,這篇文章主要介紹了SpringCloud客戶端的負(fù)載均衡Ribbon的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
淺談Java 將圖片打包到j(luò)ar中的路徑問(wèn)題
下面小編就為大家分享一篇淺談Java 將圖片打包到j(luò)ar中的路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02

