無論是遊戲服務器開發,仍是其它服務開發,愈來愈多的平臺都要求服務端必須支持https的訪問。以增長安全性。好比目前火熱的小程序,要求服務端必須支持https,蘋果商店也有說http請求要修改成https。因此https將會是遊戲服務器的廣泛需求。java
證書能夠本身使用jdk生成進行測試。可是在正常使用的時候,須要去第三方機構購買,網上也有免費的。不過有效期有限制。具體獲取證書的方法這裏再也不詳細說明了。通常拿到證書以後會獲得這幾個文件:nginx
cert.pem chain.pem fullchain.pem privkey.pemweb
若是使用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
首先是在application.properties中添加配置
server.port= 8446 server.ssl.key-store=/user/cert/my.keystore server.ssl.key-store-password=123456
這樣配置以後,啓動服務,就能夠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交流