不管是游戲服務器開發,還是其它服務開發,越來越多的平台都要求服務端必須支持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交流
