springBoot發(fā)布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.properties 或 application.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的錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
解決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文件的相關資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考價值,需要的朋友可以參考下2021-06-06
Java使用Spire.Doc for Java合并多個Word文檔
在Java開發(fā)中,我們經常需要將多個Word文檔合并為一個單一文件,本文將借助Spire.Doc for Java快速實現(xiàn)文檔合并,下面小編就為大家簡單介紹一下吧2025-09-09
java客戶端Etcd官方倉庫jetcd中KeepAlive接口實現(xiàn)
這篇文章主要為大家介紹了java客戶端Etcd官方倉庫jetcd中KeepAlive接口實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,多多加薪2022-02-02

