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

springBoot發(fā)布https服務及調用的過程詳解

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

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

1、準備SSL證書

(1)自簽名證書:如果你只是用于開發(fā)或測試環(huán)境,可以生成一個自簽名證書。
(2)CA 簽名證書:對于生產環(huán)境,應該使用由受信任的證書頒發(fā)機構 (CA) 簽名的證書。

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

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

這將創(chuàng)建一個有效期為 10 年的自簽名證書,并將其存儲在 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}

啟動服務即可通過https訪問了,默認可以設置成false

3、配置docker容器,啟動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
      #以下配置根據實際證書配置
      - 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服務

跳過證書校驗

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接口調用https服務

跳過證書校驗。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中的配置未生效,暫時在配置類中配置
     */
    @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);
        }
    }
}

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

相關文章

  • SpringBoot Filter修改返回內容,解決請求卡死200的錯誤

    SpringBoot Filter修改返回內容,解決請求卡死200的錯誤

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

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

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

    Java中使用注解校驗手機號格式的詳細指南

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

    解決IDEA錯誤 Cause: java.sql.SQLException: The server time zone

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

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

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

    深度解析Java @Serial 注解及常見錯誤案例

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

    Java使用Spire.Doc for Java合并多個Word文檔

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

    Zookeeper和Eureka哪個更好?

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

    grpc-java?k8s下的負載均衡處理方法

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

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

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

最新評論

泰和县| 衡山县| 凉城县| 新营市| 田林县| 南部县| 高雄市| 论坛| 临西县| 休宁县| 文山县| 长阳| 贺兰县| 肇州县| 怀远县| 沈丘县| 山阴县| 红河县| 吴川市| 池州市| 台安县| 横山县| 大理市| 桃源县| 浮山县| 岳池县| 额尔古纳市| 博野县| 尖扎县| 个旧市| 巴彦淖尔市| 扎囊县| 冀州市| 汝南县| 祥云县| 鹿泉市| 奉贤区| 祥云县| 扎囊县| 高阳县| 金华市|