欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot添加SSL證書(shū),開(kāi)啟HTTPS方式(單向認(rèn)證服務(wù)端)

 更新時(shí)間:2024年03月05日 09:10:13   作者:喵喵@香菜  
這篇文章主要介紹了SpringBoot添加SSL證書(shū),開(kāi)啟HTTPS方式(單向認(rèn)證服務(wù)端),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、前言

通過(guò)HTTP協(xié)議傳輸數(shù)據(jù),并不會(huì)對(duì)數(shù)據(jù)進(jìn)行加密,所以存在著一定的風(fēng)險(xiǎn),容易被抓包破解數(shù)據(jù),而且現(xiàn)在各種瀏覽器對(duì)使用HTTP協(xié)議的網(wǎng)站也會(huì)提示不安全。

通過(guò)將HTTP協(xié)議升級(jí)為HTTPS協(xié)議可以提高安全系數(shù)。使用HTTPS協(xié)議就需要了解一下SSL協(xié)議。

SSL(Secure Sockets Layer 安全套接字協(xié)議),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。

TLS與SSL在傳輸層與應(yīng)用層之間對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。

SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。

SSL協(xié)議可分為兩層:

  • SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。
  • SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。

服務(wù)器認(rèn)證階段:

1)客戶端向服務(wù)器發(fā)送一個(gè)開(kāi)始信息“Hello”以便開(kāi)始一個(gè)新的會(huì)話連接;

2)服務(wù)器根據(jù)客戶的信息確定是否需要生成新的主密鑰,如需要?jiǎng)t服務(wù)器在響應(yīng)客戶的“Hello”信息時(shí)將包含生成主密鑰所需的信息;

3)客戶根據(jù)收到的服務(wù)器響應(yīng)信息,產(chǎn)生一個(gè)主密鑰,并用服務(wù)器的公開(kāi)密鑰加密后傳給服務(wù)器;

4)服務(wù)器恢復(fù)該主密鑰,并返回給客戶一個(gè)用主密鑰認(rèn)證的信息,以此讓客戶認(rèn)證服務(wù)器。

用戶認(rèn)證階段:

  • 在此之前,服務(wù)器已經(jīng)通過(guò)了客戶認(rèn)證,這一階段主要完成對(duì)客戶的認(rèn)證。
  • 經(jīng)認(rèn)證的服務(wù)器發(fā)送一個(gè)提問(wèn)給客戶,客戶則返回(數(shù)字)簽名后的提問(wèn)和其公開(kāi)密鑰,從而向服務(wù)器提供認(rèn)證。

SSL協(xié)議提供的安全通道有以下三個(gè)特性:

  • 機(jī)密性:SSL協(xié)議使用密鑰加密通信數(shù)據(jù)。
  • 可靠性:服務(wù)器和客戶都會(huì)被認(rèn)證,客戶的認(rèn)證是可選的。
  • 完整性:SSL協(xié)議會(huì)對(duì)傳送的數(shù)據(jù)進(jìn)行完整性檢查。

從SSL 協(xié)議所提供的服務(wù)及其工作流程可以看出,SSL協(xié)議運(yùn)行的基礎(chǔ)是商家對(duì)消費(fèi)者信息保密的承諾,這就有利于商家而不利于消費(fèi)者。

在電子商務(wù)初級(jí)階段,由于運(yùn)作電子商務(wù)的企業(yè)大多是信譽(yù)較高的大公司,因此這問(wèn)題還沒(méi)有充分暴露出來(lái)。

但隨著電子商務(wù)的發(fā)展,各中小型公司也參與進(jìn)來(lái),這樣在電子支付過(guò)程中的單一認(rèn)證問(wèn)題就越來(lái)越突出。

雖然在SSL3.0中通過(guò)數(shù)字簽名和數(shù)字證書(shū)可實(shí)現(xiàn)瀏覽器和Web服務(wù)器雙方的身份驗(yàn)證,但是SSL協(xié)議仍存在一些問(wèn)題,比如,只能提供交易中客戶與服務(wù)器間的雙方認(rèn)證,在涉及多方的電子交易中,SSL協(xié)議并不能協(xié)調(diào)各方間的安全傳輸和信任關(guān)系。

在這種情況下,Visa和 MasterCard兩大信用卡公司組織制定了SET協(xié)議,為網(wǎng)上信用卡支付提供了全球性的標(biāo)準(zhǔn)。

以上摘自百度。

二、SpringBoot中配置SSL(單向)

SSL證書(shū)的頒發(fā)必須是公開(kāi)公認(rèn)的CA機(jī)構(gòu)頒發(fā)的,在瀏覽器中才會(huì)被認(rèn)可是合法的;

SSL證書(shū)是針對(duì)域名的,單域名的SSL證書(shū)對(duì)非該域名也是無(wú)效的通配域名證書(shū)對(duì)一級(jí)域名和二級(jí)域名都有效。

例如:你有一個(gè)域名為 abc.com的一級(jí)域名,解析了一個(gè).abc.com的二級(jí)域名和 b.abc.com的二級(jí)域名。當(dāng)你為a.abc.com申請(qǐng)的單域名證書(shū)對(duì)b.abc.com域名是無(wú)效的。

(PS:我看了網(wǎng)上很多通過(guò)keytool生成證書(shū)的,通過(guò)keytool生成的證書(shū)是自簽證書(shū),不被瀏覽器鎖認(rèn)可)

1、環(huán)境

spring boot 2.2.2

maven

一個(gè)域名(各大域名商有售,阿里、騰訊、華為)

SSL證書(shū)(阿里云上有免費(fèi)的SSL證書(shū),有效期一年)

2、客戶端單向認(rèn)證服務(wù)端代碼實(shí)戰(zhàn)-JKS格式的證書(shū)

tomcat中支持JKS格式與PFX兩種格式的證書(shū),下面先進(jìn)行JKS格式的證書(shū)演示。

(1)準(zhǔn)備一個(gè)JKS后綴的SSL證書(shū)。(域名.jks)

(2)快速構(gòu)建一個(gè)springboot模塊

(3) 在resources下新建一個(gè)ssl目錄,復(fù)制SSL證書(shū)到該目錄下

(4)在項(xiàng)目配置文件application.yml中配置SSL

server:
  port: 8090 #端口配置
  ssl: #ssl配置
    enabled: true  # 默認(rèn)為true
    #key-alias: alias-key # 別名(可以不進(jìn)行配置)
    # 保存SSL證書(shū)的秘鑰庫(kù)的路徑
    key-store: classpath:ssl/service.一級(jí)域名.jks
    key-password: 私鑰密碼
    #key-store-password: 證書(shū)密碼
    key-store-type: JKS    證書(shū)類型

上述配置中 key-password 是私鑰密碼

key-store-password 是證書(shū)密碼。

如果這兩個(gè)密碼相同的只配置一個(gè)即可,因?yàn)閠omcat默認(rèn)先用keyStore的pass去解私鑰。(PS:如果你使用阿里云上的免費(fèi)SSL證書(shū),下載jks格式的證書(shū)的時(shí)候,只有一個(gè)密碼,是證書(shū)的密碼)

(5)添加一個(gè)controller,測(cè)試是否生效

@RestController
public class TestController {

    @RequestMapping(value = {"","/"})
    public String testHttps(){
        return "you success by https";
    }
}

(6)本地訪問(wèn) https://127.0.0.1:8090/

因?yàn)樵撟C書(shū)對(duì)應(yīng)的域名解析的服務(wù)器地址與現(xiàn)在訪問(wèn)的地址不同,所以瀏覽器會(huì)提示訪問(wèn)不安全,點(diǎn)擊【高級(jí)】后的【繼續(xù)前往…】繼續(xù)跳轉(zhuǎn),發(fā)現(xiàn)會(huì)有很明顯的不安全提示。

(7)打包,放到域名解析對(duì)應(yīng)的服務(wù)器上進(jìn)行測(cè)試,訪問(wèn):

https://域名:8090/

可以看到當(dāng)部署到域名解析對(duì)應(yīng)的服務(wù)器上時(shí),通過(guò)瀏覽器訪問(wèn),瀏覽器出現(xiàn)一個(gè)小鎖的標(biāo)識(shí)。

(8)本地使用http訪問(wèn): http://127.0.0.1:8090/

服務(wù)器http訪問(wèn):http://域名:8090/

通過(guò)上述訪問(wèn)發(fā)現(xiàn),如果通過(guò)http訪問(wèn)會(huì)提示訪問(wèn)需要組合TLS,但是如果用戶直接通過(guò)這種方式訪問(wèn)的話,存在著極差的用戶體驗(yàn)。

3、HTTP 轉(zhuǎn)HTTPS

當(dāng)用戶使用http訪問(wèn)的時(shí)候,將http協(xié)議重定向到https端口

(1)修改配置文件

custom:  # 自定義http啟動(dòng)端口
  http-port: 8089
配置
server:
  port: 8090 #端口配置  
  ssl: #ssl配置
    enabled: true  # 默認(rèn)為true
    #key-alias: alias-key # 別名(可以不進(jìn)行配置)
    # 保存SSL證書(shū)的秘鑰庫(kù)的路徑
    key-store: classpath:ssl/service.一級(jí)域名.jks
    key-password: 私鑰密碼
    #key-store-password: 證書(shū)密碼
    key-store-type: JKS

(2)添加配置類

package cn.zlc.servicehttps.config;

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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * https配置,將http請(qǐng)求全部轉(zhuǎn)發(fā)到https
 * @author Jacob
 */
@Configuration
public class HttpsConfig {

    @Value("${custom.http-port: 8080}")
    private Integer httpPort;

    @Value("${server.port}")
    private Integer port;

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        // 將http請(qǐng)求轉(zhuǎn)換為https請(qǐng)求
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                // 默認(rèn)為NONE
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                // 所有的東西都https
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    /**
     * 強(qiáng)制將所有的http請(qǐng)求轉(zhuǎn)發(fā)到https
     * @return httpConnector
     */
    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        // connector監(jiān)聽(tīng)的http端口號(hào)
        connector.setPort(httpPort);
        connector.setSecure(false);
        // 監(jiān)聽(tīng)到http的端口號(hào)后轉(zhuǎn)向到的https的端口號(hào)
        connector.setRedirectPort(port);
        return connector;
    }
}

(3)啟動(dòng)成功后可以看見(jiàn)http啟動(dòng)端口和https端口

(4)本地訪問(wèn)http的8089端口 http://127.0.0.1:8089/

程序會(huì)將http端口的請(qǐng)求轉(zhuǎn)發(fā)到https端口,而用戶無(wú)需做操作。

本地直接訪問(wèn)https端口和在服務(wù)器上直接訪問(wèn)就不貼圖了。

4、同時(shí)開(kāi)啟HTTP和HTTPS

如果我們不想強(qiáng)制所有的請(qǐng)求都重定向到https或者某些功能接口需要http的支持等等,我們也可以同時(shí)開(kāi)啟http協(xié)議和https協(xié)議。

(1)修改配置類

package cn.zlc.servicehttps.config;

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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * https配置,將http請(qǐng)求全部轉(zhuǎn)發(fā)到https
 * @author Jacob
 */
@Configuration
public class HttpsConfig {

    @Value("${custom.http-port: 8080}")
    private Integer httpPort;
    
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(httpPort);
        return connector;
    }

}

(2)本地訪問(wèn)http協(xié)議的8089端口:http://127.0.0.1:8089/

(3)本地訪問(wèn)https的8090端口

通過(guò)對(duì)比發(fā)現(xiàn),如果我們通過(guò)http端口請(qǐng)求的話,不會(huì)自動(dòng)重定向到https端口,而且也不會(huì)提示需要TLS端口請(qǐng)求。

而使用https請(qǐng)求的時(shí)候就會(huì)提示不安全(如果是放到服務(wù)器上訪問(wèn)https就正常了);

5、客戶端單向認(rèn)證服務(wù)端代碼實(shí)戰(zhàn)-PFX格式的證書(shū)

(1)配置文件如下:

custom:
  http-port: 8070
server:
  port: 8060 #端口配置
  ssl: #ssl配置
    enabled: true  # 默認(rèn)為true
    #key-alias: alias-key # 別名(可以不進(jìn)行配置)
    # 保存SSL證書(shū)的秘鑰庫(kù)的路徑
    key-store: classpath:ssl/5986342_一級(jí)域名.pfx
    #key-password: 私鑰密碼 pfx格式的使用key-password 無(wú)法正常啟動(dòng)
    key-store-type: PKCS12  #證書(shū)類型
    key-store-password: 證書(shū)密碼

(2)不同點(diǎn)

主要的不同點(diǎn)就是key-store-type類型不同,同時(shí)如果是JKS的證書(shū),使用私鑰密碼或者是證書(shū)密碼都行,但是pfx的證書(shū)如果只配置私鑰密碼無(wú)法正常啟動(dòng)。

三、異常解決

使用jks格式的證書(shū)時(shí),通過(guò)maven打包會(huì)出現(xiàn)證書(shū)內(nèi)容被修改,導(dǎo)致證書(shū)驗(yàn)證失敗,出現(xiàn)Invalid keystore format sl證書(shū)格式不合法的異常,可在maven中添加一個(gè)插件

 <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <nonFilteredFileExtensions>
                        <!--<nonFilteredFileExtension>p12</nonFilteredFileExtension>-->
                        <nonFilteredFileExtension>jks</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>

其它解決方案,可查看我的另一篇博客:

異常:Invalid keystore format,spring boot配置ssl證書(shū)格式不合法解決

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA2021.2永久激活碼最新超詳細(xì)(激活到2099)

    IDEA2021.2永久激活碼最新超詳細(xì)(激活到2099)

    這篇文章主要介紹了IDEA2021.2永久激活碼,是idea2021版最新激活方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實(shí)例

    在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實(shí)例

    下面小編就為大家?guī)?lái)一篇在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • Java行為型模式中命令模式分析

    Java行為型模式中命令模式分析

    在軟件設(shè)計(jì)中,我們經(jīng)常需要向某些對(duì)象發(fā)送請(qǐng)求,但是并不知道請(qǐng)求的接收者是誰(shuí),也不知道被請(qǐng)求的操作是哪個(gè),我們只需在程序運(yùn)行時(shí)指定具體的請(qǐng)求接收者即可,此時(shí)可以使用命令模式來(lái)進(jìn)行設(shè)計(jì)
    2023-02-02
  • Spring Boot命令行運(yùn)行器的實(shí)現(xiàn)方法

    Spring Boot命令行運(yùn)行器的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Boot命令行運(yùn)行器的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊

    Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊

    這篇文章主要介紹了Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java如何處理圖片保存之后變紅色的問(wèn)題

    Java如何處理圖片保存之后變紅色的問(wèn)題

    這篇文章主要介紹了Java如何處理圖片保存之后變紅色的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • JavaSE-面向?qū)ο?方法重寫(xiě))

    JavaSE-面向?qū)ο?方法重寫(xiě))

    子類在調(diào)用父類的私有方法中不能直接調(diào)用,但是可以通過(guò)get方法進(jìn)行調(diào)用,修改屬性的值可以通過(guò)set方法進(jìn)行修改。而子類想要修改父類中的方法可以使用方法重寫(xiě)進(jìn)行操作。
    2021-08-08
  • Java集合框架之Stack Queue Deque使用詳解刨析

    Java集合框架之Stack Queue Deque使用詳解刨析

    早在 Java 2 中之前,Java 就提供了特設(shè)類。比如:Dictionary, Vector, Stack, 和 Properties 這些類用來(lái)存儲(chǔ)和操作對(duì)象組。雖然這些類都非常有用,但是它們?nèi)鄙僖粋€(gè)核心的,統(tǒng)一的主題。由于這個(gè)原因,使用 Vector 類的方式和使用 Properties 類的方式有著很大不同
    2021-10-10
  • JavaWeb中Struts2攔截器深入分析(一)

    JavaWeb中Struts2攔截器深入分析(一)

    這篇文章主要為大家詳細(xì)介紹了JavaWeb中Struts2攔截器的功能,感興趣的小伙伴們可以參考一下
    2016-06-06
  • springboot控制層傳遞參數(shù)為非必填值的操作

    springboot控制層傳遞參數(shù)為非必填值的操作

    這篇文章主要介紹了springboot控制層傳遞參數(shù)為非必填值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論