前言
HTTP 具有相當(dāng)優(yōu)秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具兩面性,它也是有不足之處的。例如:
- 通信使用明文(不加密),內(nèi)容可能會被竊聽。
- 不驗證通信方的身份,因此有可能會遭遇偽裝。
- 無法證明報文的完整性,所以有可能會遭篡改等。
因HTTP有存在通信上的不足,HTTPS因此誕生(HTTPS 是身披 SSL 外殼的 HTTP),HTTPS采用非對稱加密,從而相對安全。
SSL協(xié)議介紹
SSL (Secure Sockets Layer)安全套接層,是一個不依賴于平臺和運(yùn)用程序的協(xié)議,位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通信提高安全支持。
是由Netscape公司于1990年開發(fā),用于保障Word Wide Web(WWW)通訊的安全。主要任務(wù)是提供私密性,信息完整性和身份認(rèn)證。
SSL原理詳解
SSL的體系結(jié)構(gòu)中包含兩個協(xié)議子層,其中底層是SSL記錄協(xié)議層(SSL Record Protocol Layer);高層是SSL握手協(xié)議層(SSL HandShake Protocol Layer)。
- SSL記錄協(xié)議層的作用是為高層協(xié)議提供基本的安全服務(wù)。SSL紀(jì)錄協(xié)議針對HTTP協(xié)議進(jìn)行了特別的設(shè)計,使得超文本的傳輸協(xié)議HTTP能夠在SSL運(yùn)行。紀(jì)錄封裝各種高層協(xié)議,具體實(shí)施壓縮解壓縮、加密解密、計算和校驗MAC等與安全有關(guān)的操作。
- SSL握手協(xié)議層包括SSL握手協(xié)議(SSL HandShake Protocol)、SSL密碼參數(shù)修改協(xié)議(SSL Change
Cipher Spec Protocol)和SSL告警協(xié)議(SSL Alert
Protocol)。握手層的這些協(xié)議用于SSL管理信息的交換,允許應(yīng)用協(xié)議傳送數(shù)據(jù)之間相互驗證,協(xié)商加密算法和生成密鑰等。
SSL握手協(xié)議的作用是協(xié)調(diào)客戶和服務(wù)器的狀態(tài),使雙方能夠達(dá)到狀態(tài)的同步。
其中最重要的是記錄協(xié)議和握手協(xié)議:
- SSL記錄協(xié)議:它建立在可靠的傳輸(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能
- SSL握手協(xié)議:它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開始之前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。
整合HTTPS
SSL證書的頒發(fā)必須是公開公認(rèn)的CA機(jī)構(gòu)頒發(fā)的,在瀏覽器中才會被認(rèn)可是合法的;
SSL證書是針對域名的,單域名的SSL證書對非該域名是無效的,通配域名證書對一級域名和二級域名都有效。
生成自簽名SSL
在JDK bin目錄下,運(yùn)行:
# D:\java\key 此地址為存放目錄,需要自己創(chuàng)建
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore D:\java\key\keystore.p12 -validity 3650 -ext san=ip:127.0.0.1,dns:localhost -storepass 123456
輸入密鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什么?
[Unknown]:
您的組織單位名稱是什么?
[Unknown]:
您的組織名稱是什么?
[Unknown]:
您所在的城市或區(qū)域名稱是什么?
[Unknown]:
您所在的省/市/自治區(qū)名稱是什么?
[Unknown]:
該單位的雙字母國家/地區(qū)代碼是什么?
[Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正確?
[否]: 是
各參數(shù)的含義:
- -storetype 指定密鑰倉庫類型
- -keyalg 生證書的算法名稱,RSA是一種非對稱加密算法
- -keysize 證書大小,秘鑰長度
- -keystore 生成的證書文件的存儲路徑
- -validity 證書的有效期,單位 天
- -alias 表示keystore的別名
- -genkey 表示要創(chuàng)建一個新秘鑰
- -ext san=ip: 安裝證書后,通過這個IP進(jìn)行訪問不會提示不安全,多個IP使用[,]分隔
- -ext san=dns: 安裝證書后,通過這個域名進(jìn)行訪問不會提示不安全,多個域名使用[,]分隔
執(zhí)行完上面一行命令后,在你的系統(tǒng)的當(dāng)前用戶目錄下會生成一個keystore.p12文件,我們也可以使用以下命令查看證書內(nèi)容:
keytool -list -v -storetype pkcs12 -keystore keystore.p12
如果你已經(jīng)有SSL證書,你也可將其導(dǎo)入到keystore里,供Spring Boot使用
keytool -import -alias tomcat -file myCertificate.crt -keystore keystore.p12 -storepass password
配置文件
將這個文件拷貝到我們項目的resources目錄下,然后修改application.properties文件,添加HTTPS支持。
server:
port: 443
servlet:
context-path: /
session:
timeout: PT24H # 超時24小時
ssl:
#文件地址
key-store: classpath:certificate/keystore.p12
#證書密碼
key-store-password: 123456
key-store-type: PKCS12
key-alias: tomcat
http2:
enabled: true
這樣就可以通過HTTPS來訪問我們的Web了。
配置HTTP重定向至HTTPS
光有HTTPS肯定還不夠,很多用戶可能并不知道,用戶有可能繼續(xù)使用HTTP來訪問你的網(wǎng)站,這個時候我們需要添加HTTP自動重定向到HTTPS的功能,當(dāng)用戶使用HTTP來進(jìn)行訪問的時候自動轉(zhuǎn)為HTTPS的方式。
配置很簡單,在入口類中添加相應(yīng)的重定向Bean就行了,如下:文章來源:http://www.zghlxwxcb.cn/news/detail-735694.html
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName: ConnectorConfig
* @description:
* @author: Liuxb
* @version: v1.0
* @date: 2023/10/26 14:47
*/
@Configuration
public class ConnectorConfig {
@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;
}
@Bean
public Connector connector (){
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
// 代理端口
connector.setPort(80);
// yml端口
connector.setRedirectPort(443);
return connector;
}
}
這個時候當(dāng)我們訪問http://localhost:80的時候系統(tǒng)會自動重定向到https://localhost:443這個地址上。文章來源地址http://www.zghlxwxcb.cn/news/detail-735694.html
到了這里,關(guān)于SpringBoot整合自簽名SSL證書,轉(zhuǎn)變HTTPS安全訪問(單向認(rèn)證服務(wù)端)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!