最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot發(fā)布https服務(wù)及調(diào)用的過程詳解

 更新時(shí)間:2025年11月28日 09:33:36   作者:v***794  
文章介紹了如何在Spring Boot中配置HTTPS服務(wù),包括生成自簽名證書和配置SSL證書的位置和密碼,此外,還討論了如何在Docker容器中啟動(dòng)HTTPS服務(wù),以及如何通過HTTP請(qǐng)求調(diào)用HTTPS服務(wù)并跳過證書校驗(yàn),感興趣的朋友跟隨小編一起看看吧

一、服務(wù)端發(fā)布https服務(wù)

1、準(zhǔn)備SSL證書

(1)自簽名證書:如果你只是用于開發(fā)或測(cè)試環(huán)境,可以生成一個(gè)自簽名證書。
(2)CA 簽名證書:對(duì)于生產(chǎn)環(huán)境,應(yīng)該使用由受信任的證書頒發(fā)機(jī)構(gòu) (CA) 簽名的證書。

這里采用生成自簽名證書,可以使用keytool工具生成自簽名證書(jdk工具):

keytool -genkeypair -alias myapp -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650

這將創(chuàng)建一個(gè)有效期為 10 年的自簽名證書,并將其存儲(chǔ)在 keystore.p12 文件中。你需要提供一些信息,如組織名稱等。注意記住密碼和別名。

如下圖:

2、配置springboot啟用HTTPS并指定SSL證書的位置和密碼

application.propertiesapplication.yml都可以。這樣配置可以讀取環(huán)境變量

把證書放在resource的ssl目錄下

server:
  port: 8443
  ssl:
    enabled: ${SSL_ENABLED:true}
    key-store: ${SSL_KEY_STORE:classpath:ssl/keystore.p12}
    key-store-password: ${SSL_KEY_STORE_PASSWORD:myapptest}
    keyStoreType: ${SSL_KEY_STORE_TYPE:PKCS12}
    keyAlias: ${SSL_KEY_ALIAS:myapp}

啟動(dòng)服務(wù)即可通過https訪問了,默認(rèn)可以設(shè)置成false

3、配置docker容器,啟動(dòng)https

把證書放在ssl目錄下

version: "3"
services:
  test-https:
    image: openjdk:8-jdk
    container_name: test-https
    restart: always
    ports:
      - 22443:22443
    command: java -jar /opt/test-https.jar
    volumes:
      - /home/services/test/:/opt/
      - /home/services/test/config/:/config/
      - /home/services/test/ssl/:/ssl/
      - /home/services/test/template_server/:/template_server/
      - /home/services/test/patch/:/patch/
      - /home/log/test/:/logs/
    environment:
      - TZ=Asia/Shanghai
      - SERVICE_HOST=${HOST_IP}
      - server.port=22443
      - NACOS_NAMESPACE=${NACOS_NAMESPACE}
      - NACOS_ADDR=${NACOS_ADDR}
       #開啟https,如果不開啟則配置為false
      - SSL_ENABLED=true
      #以下配置根據(jù)實(shí)際證書配置
      - SSL_KEY_STORE=ssl/keystore.p12
      - SSL_KEY_STORE_PASSWORD=myapptest
      - SSL_KEY_STORE_TYPE=PKCS12
      - SSL_KEY_ALIAS=myapp
      - JAVA_OPTS=-Xmx512m -XX:G1ConcRefinementThreads=4 -XX:MaxDirectMemorySize=1G

二、通過httpinvoke方法https服務(wù)

跳過證書校驗(yàn)

public class HttpInvokerRequestExecutorWithSession extends SimpleHttpInvokerRequestExecutor {
	private int connectTimeout=0;
	private int readTimeout=0;
	private SSLContext sslContext;
	private HostnameVerifier hostnameVerifier;
	private void initSsl() {
		try {
			sslContext = SSLContext.getInstance("TLS");
			sslContext.init(null, new TrustManager[]{new X509TrustManager() {
				public java.security.cert.X509Certificate[] getAcceptedIssuers() {
					return null;
				}
				public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
				public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
			}}, new SecureRandom());
		} catch (KeyManagementException | NoSuchAlgorithmException e) {
			logger.error("ssl init error:",e);
			throw new MsrRuntimeException(e.getMessage());
		}
		hostnameVerifier = (hostname, session) -> true;
	}
	/**
	 *
	 * (non-Javadoc)
	 *
	 * @see org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor
	 *      #prepareConnection(java.net.HttpURLConnection, int)
	 */
	protected void prepareConnection(HttpURLConnection con, int contentLength) throws IOException {
		super.prepareConnection(con, contentLength);
		if (con instanceof HttpsURLConnection) {
			if (sslContext == null) {
				initSsl();
			}
			((HttpsURLConnection) con).setSSLSocketFactory(sslContext.getSocketFactory());
			((HttpsURLConnection) con).setHostnameVerifier(hostnameVerifier);
		}
		con.setConnectTimeout(connectTimeout);
		con.setReadTimeout(readTimeout);
	}
	/**
	 *
	 * (non-Javadoc)
	 *
	 * @see org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor
	 *      #validateResponse(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration,
	 *      java.net.HttpURLConnection)
	 */
	protected void validateResponse(HttpInvokerClientConfiguration config, HttpURLConnection con)
			throws IOException {
		super.validateResponse(config, con);
	}
	public int getConnectTimeout() {
		return connectTimeout;
	}
	public void setConnectTimeout(int connectTimeout) {
		this.connectTimeout = connectTimeout;
	}
	public int getReadTimeout() {
		return readTimeout;
	}
	public void setReadTimeout(int readTimeout) {
		this.readTimeout = readTimeout;
	}
}

三、feign接口調(diào)用https服務(wù)

跳過證書校驗(yàn)。feign接口的地址還是正常配置http或https都支持

import feign.Client;
import feign.Contract;
import feign.RequestInterceptor;
import feign.codec.ErrorDecoder;
import feign.jaxrs.JAXRSContract;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
@Configuration
public class FeignConfiguration {
    @Autowired
    private BusinessConfig businessConfig;
    /**
     * yaml中的配置未生效,暫時(shí)在配置類中配置
     */
    @Bean
    public Contract getFeignContract() {
        return new JAXRSContract();
    }
    @Bean
    public ErrorDecoder getFeignErrorDecoder() {
        return new FeignExceptionDecoder();
    }
    @Bean
    public OkHttpClient okHttpClient() {
        if(businessConfig.getRootServiceUrl() != null && businessConfig.getRootServiceUrl().contains("https")){
            try {
                TrustManager[] trustManagers = getTrustManager();
                if (trustManagers == null || trustManagers.length == 0) {
                    throw new IllegalStateException("Failed to create trust managers");
                }
                SSLSocketFactory sslSocketFactory = getSSLSocketFactory();
                if (sslSocketFactory == null) {
                    throw new IllegalStateException("Failed to initialize SSL socket factory");
                }
                return new OkHttpClient.Builder()
                        .readTimeout(60, TimeUnit.SECONDS)
                        .connectTimeout(60, TimeUnit.SECONDS)
                        .writeTimeout(120, TimeUnit.SECONDS)
                        .connectionPool(new ConnectionPool())
                        .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustManagers[0])
                        .hostnameVerifier((hostname, session) -> true)
                        .build();
            } catch (Exception e) {
                throw new RuntimeException("Failed to create OkHttpClient", e);
            }
        }
        return new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(120, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool())
                .build();
    }
    @Bean
    public RequestInterceptor requestInterceptor() {
        return new CustomRequestInterceptor(businessConfig);
    }
    @Bean
    public Client feignClient(OkHttpClient okHttpClient) {
        return new CustomClient(new feign.okhttp.OkHttpClient(okHttpClient));
    }
    private TrustManager[] getTrustManager() {
        try {
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[0];
                        }
                        public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                        public void checkServerTrusted(X509Certificate[] certs, String authType) {}
                    }
            };
            return trustAllCerts;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private SSLSocketFactory getSSLSocketFactory() {
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, getTrustManager(), new SecureRandom());
            return sc.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

到此這篇關(guān)于springBoot發(fā)布https服務(wù)及調(diào)用的過程詳解的文章就介紹到這了,更多相關(guān)springBoot發(fā)布https服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死200的錯(cuò)誤

    SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死200的錯(cuò)誤

    這篇文章主要介紹了SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死200的錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 深入理解java中Arrays.sort()的用法

    深入理解java中Arrays.sort()的用法

    這篇文章主要介紹了深入理解java中Arrays.sort()的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java中使用注解校驗(yàn)手機(jī)號(hào)格式的詳細(xì)指南

    Java中使用注解校驗(yàn)手機(jī)號(hào)格式的詳細(xì)指南

    在現(xiàn)代的Web應(yīng)用開發(fā)中,數(shù)據(jù)校驗(yàn)是一個(gè)非常重要的環(huán)節(jié),本文將詳細(xì)介紹如何在Java中使用注解對(duì)手機(jī)號(hào)格式進(jìn)行校驗(yàn),感興趣的小伙伴可以了解下
    2025-03-03
  • 解決IDEA錯(cuò)誤 Cause: java.sql.SQLException: The server time zone value的問題

    解決IDEA錯(cuò)誤 Cause: java.sql.SQLException: The server time zone

    這篇文章主要介紹了解決IDEA錯(cuò)誤 Cause: java.sql.SQLException: The server time zone value的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springboot利用aspose預(yù)覽office文件的實(shí)現(xiàn)過程

    springboot利用aspose預(yù)覽office文件的實(shí)現(xiàn)過程

    這篇文章主要給大家介紹了關(guān)于springboot利用aspose預(yù)覽office文件的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友可以參考下
    2021-06-06
  • 深度解析Java @Serial 注解及常見錯(cuò)誤案例

    深度解析Java @Serial 注解及常見錯(cuò)誤案例

    Java14引入@Serial注解,用于編譯時(shí)校驗(yàn)序列化成員,替代傳統(tǒng)方式解決運(yùn)行時(shí)錯(cuò)誤,適用于Serializable類的方法/字段,需注意簽名和位置校驗(yàn),建議新項(xiàng)目采用,本文給大家介紹Java @Serial 注解的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-07-07
  • Java使用Spire.Doc for Java合并多個(gè)Word文檔

    Java使用Spire.Doc for Java合并多個(gè)Word文檔

    在Java開發(fā)中,我們經(jīng)常需要將多個(gè)Word文檔合并為一個(gè)單一文件,本文將借助Spire.Doc for Java快速實(shí)現(xiàn)文檔合并,下面小編就為大家簡(jiǎn)單介紹一下吧
    2025-09-09
  • Zookeeper和Eureka哪個(gè)更好?

    Zookeeper和Eureka哪個(gè)更好?

    今天小編就為大家分享一篇關(guān)于Zookeeper和Eureka哪個(gè)更好?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • grpc-java?k8s下的負(fù)載均衡處理方法

    grpc-java?k8s下的負(fù)載均衡處理方法

    這篇文章主要為大家介紹了grpc-java?k8s下的負(fù)載均衡的處理方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • java客戶端Etcd官方倉庫jetcd中KeepAlive接口實(shí)現(xiàn)

    java客戶端Etcd官方倉庫jetcd中KeepAlive接口實(shí)現(xiàn)

    這篇文章主要為大家介紹了java客戶端Etcd官方倉庫jetcd中KeepAlive接口實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,多多加薪
    2022-02-02

最新評(píng)論

泰兴市| 博罗县| 锦屏县| 临泉县| 洛宁县| 迭部县| 右玉县| 天祝| 凤城市| 维西| 万全县| 鲜城| 昌宁县| 达尔| 中方县| 大丰市| 阿合奇县| 龙南县| 长沙市| 清丰县| 微山县| 察哈| 扎赉特旗| 勐海县| 米林县| 武冈市| 定南县| 聂拉木县| 获嘉县| 临海市| 田东县| 将乐县| 中山市| 福州市| 张家界市| 南涧| 枞阳县| 浠水县| 康保县| 逊克县| 庐江县|