不管是游戲服務(wù)器開發(fā)剃毒,還是其它服務(wù)開發(fā)病袄,越來越多的平臺都要求服務(wù)端必須支持https的訪問。以增加安全性赘阀。比如目前火熱的小程序益缠,要求服務(wù)端必須支持https,蘋果商店也有說http請求要修改為https基公。所以https將會是游戲服務(wù)器的普遍需求幅慌。
一,證書生成
? ?證書可以自己使用jdk生成進(jìn)行測試轰豆。但是在正常使用的時候胰伍,需要去第三方機構(gòu)購買,網(wǎng)上也有免費的酸休。不過有效期有限制骂租。具體獲取證書的方法這里不再詳細(xì)說明了。一般拿到證書之后會得到這幾個文件:
? ?cert.pem chain.pem? ?fullchain.pem??privkey.pem
二斑司,將pem文件轉(zhuǎn)化為keystore文件
如果使用nginx跳轉(zhuǎn)的話渗饮,上面的證書文件可以直接使用,但是在tomcat中宿刮,證書的配置文件格式必須是.keystore的文件互站。所以需要做一下轉(zhuǎn)化。
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
這樣配置之后标捺,啟動服務(wù),就可以https訪問了揉抵。
四亡容,同時支持http和https訪問
1,http請求不跳轉(zhuǎn)成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請求強制跳轉(zhuǎn)到https
有時候我們的一些舊業(yè)務(wù)是使用的http桐磁,但是新業(yè)務(wù)以及將來的框架都必須強制使用https悔耘,那就需要做一下跳轉(zhuǎn),把收到的http請求強制跳轉(zhuǎn)到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();
// 這里不知道為什么衬以,只能配置以/*結(jié)尾的path。這樣配置表示全部請求使用安全模式校摩,必須走h(yuǎn)ttps
collection.addPattern("/*");
//另外還可以配置哪些請求必須走h(yuǎn)ttps看峻,這表示以/home/開頭的請求必須走h(yuǎn)ttps
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請求跳轉(zhuǎn)到https的端口
connector.setRedirectPort(8446);
return connector;
}
}
以上跳轉(zhuǎn)也可以使用nginx實現(xiàn)衙吩。