今天主要是在给gateway配置ssl证书的时候遇到一些问题,记下来,给有需要的同学做个参考。
证书的下载就不在这篇文章里赘述了,在阿里云或者其他云厂商都可以免费申请ssl证书。
yml 配置文件信息
server:
#https 监听端口
port: 443
#http 监听端口
http:
port: 80
ssl:
enabled: true
key-alias: tomcat
key-store-password: 证书密码
key-store: classpath:cert/server.jks
key-store-type: JKS
spring:
cloud:
gateway:
httpclient:
ssl:
# 实现微服务之间https调用
useInsecureTrustManager: true
http 自动跳转https
package com.laiya.gateway.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @author :chao.z
* @date :Created in 2020/6/24 7:07 下午
*/
@Configuration
public class HttpToHttpsRedirectConfig {
@Value("${server.http.port}")
private int httpPort;
@Value("${server.port}")
private int serverPort;
@PostConstruct
public void startRedirectServer() {
NettyReactiveWebServerFactory httpNettyReactiveWebServerFactory = new NettyReactiveWebServerFactory(httpPort);
httpNettyReactiveWebServerFactory.getWebServer((request, response) -> {
URI uri = request.getURI();
URI httpsUri;
try {
httpsUri = new URI("https", uri.getUserInfo(), uri.getHost(), serverPort, uri.getPath(), uri.getQuery(), uri.getFragment());
} catch (URISyntaxException e) {
return Mono.error(e);
}
response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
response.getHeaders().setLocation(httpsUri);
return response.setComplete();
}).start();
}
- 443端口为https请求端口
- 80 端口为http请求端口
- 通过启动项目会自动加载配置,实现http自动跳转https
Springcloud gateway 是netty启动,所以用netty的替换方式,目前官方没有具体的解决方案。
Tips:
1.端口可以自己定义,在云服务器上注意检查端口是开启
2.设置80和443 是为了输入域名请求时不带端口号。
3.设置https 请求后,注意静态页面引用的地址也需要改成https
建议修改成"<src = //xxxx />"
3.以"//"开头表示相对协议,页面使用的是什么协议,文件请求也自动是什么协议。同样的异步请求也应该这样适应。