SpringBoot Web Https 配置

無論是遊戲服務器開發,仍是其它服務開發,愈來愈多的平臺都要求服務端必須支持https的訪問。以增長安全性。好比目前火熱的小程序,要求服務端必須支持https,蘋果商店也有說http請求要修改成https。因此https將會是遊戲服務器的廣泛需求。java

一,證書生成

   證書能夠本身使用jdk生成進行測試。可是在正常使用的時候,須要去第三方機構購買,網上也有免費的。不過有效期有限制。具體獲取證書的方法這裏再也不詳細說明了。通常拿到證書以後會獲得這幾個文件:nginx

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

 

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

若是使用nginx跳轉的話,上面的證書文件能夠直接使用,可是在tomcat中,證書的配置文件格式必須是.keystore的文件。因此須要作一下轉化。spring

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

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

(注:此過程當中須要輸入密碼:123456)tomcat

二、生成keystore:安全

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

成功以後會得到my.keystore文件。app

 

三,在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交流

相關文章
相關標籤/搜索