SpringBoot Web Https 配置


不管是游戲服務器開發,還是其它服務開發,越來越多的平台都要求服務端必須支持https的訪問。以增加安全性。比如目前火熱的小程序,要求服務端必須支持https,蘋果商店也有說http請求要修改為https。所以https將會是游戲服務器的普遍需求。

一,證書生成

   證書可以自己使用jdk生成進行測試。但是在正常使用的時候,需要去第三方機構購買,網上也有免費的。不過有效期有限制。具體獲取證書的方法這里不再詳細說明了。一般拿到證書之后會得到這幾個文件:

   cert.pem chain.pem   fullchain.pem  privkey.pem

 

二,將pem文件轉化為keystore文件

如果使用nginx跳轉的話,上面的證書文件可以直接使用,但是在tomcat中,證書的配置文件格式必須是.keystore的文件。所以需要做一下轉化。

1、生成pkcs12格式的密鑰文件:

$ openssl pkcs12 -export -in cert.pem -inkey privkey.pem -out my.pk12 -name mykey

(注:此過程中需要輸入密碼:123456)

2、生成keystore:

$ keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore my.keystore -srckeystore my.pk12 -srcstoretype PKCS12 -srcstorepass 123456 -alias shkey

成功之后會獲得my.keystore文件。

 

三,在Spring boot web中配置https

首先是在application.properties中添加配置

server.port= 8446

server.ssl.key-store=/user/cert/my.keystore

server.ssl.key-store-password=123456

  

這樣配置之后,啟動服務,就可以https訪問了。

 

四,同時支持http和https訪問

1,http請求不跳轉成https訪問

這種方式是http請求單獨走一個端口,https請求單獨走一個端口。但是spring boot 的appplication.properties只能配置一個端口,這就需要我們手動再添加一個Connector了。

@Configuration

public class TomcatConfig {

@Bean

public EmbeddedServletContainerFactory servletContainerFactory(){

TomcatEmbeddedServletContainerFactory tomcatConfig = new TomcatEmbeddedServletContainerFactory();

tomcatConfig.addAdditionalTomcatConnectors(this.newHttpConnector());

return tomcatConfig;

}

private Connector newHttpConnector() {

Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");

connector.setScheme("http");

connector.setPort(8080);

connector.setSecure(false);

return connector;

}

}

  

這樣普通 的http請求,可以訪問8080端口了。

2,將http請求強制跳轉到https

有時候我們的一些舊業務是使用的http,但是新業務以及將來的框架都必須強制使用https,那就需要做一下跳轉,把收到的http請求強制跳轉到https上面。

@Configuration

public class TomcatConfig {

@Bean

public EmbeddedServletContainerFactory servletContainerFactory(){

TomcatEmbeddedServletContainerFactory tomcatConfig = new TomcatEmbeddedServletContainerFactory(){

@Override

protected void postProcessContext(Context context) {

SecurityConstraint securityConstraint = new SecurityConstraint();

securityConstraint.setUserConstraint("CONFIDENTIAL");

SecurityCollection collection = new SecurityCollection();

// 這里不知道為什么,只能配置以/*結尾的path。這樣配置表示全部請求使用安全模式,必須走https

collection.addPattern("/*");

//另外還可以配置哪些請求必須走https,這表示以/home/開頭的請求必須走https

collection.addPattern("/home/*");

securityConstraint.addCollection(collection);

context.addConstraint(securityConstraint);

}

};

tomcatConfig.addAdditionalTomcatConnectors(this.newHttpConnector());

return tomcatConfig;

}

private Connector newHttpConnector() {

Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");

connector.setScheme("http");

connector.setPort(8080);

connector.setSecure(false);

// 如果只需要支持https訪問,這里把收到的http請求跳轉到https的端口

connector.setRedirectPort(8446);

return connector;

}

}

 

以上跳轉也可以使用nginx實現。如果有什么問題可以評論留言或加QQ群:66728073交流

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM