专栏首页CoffeeLandspringboot 1.5.20.RELEASE可能会将http请求变成https
原创

springboot 1.5.20.RELEASE可能会将http请求变成https

us backgroud

系统的有一个写log的微服务A, spring boot的version是2.1.5.RELEASE

另有一个service B, spring boot version是1.5.20.RELEASE

Service B 通过resttemplate 去调用service A去写log

会出现以下error

Unrecognized SSL message, plaintext connection?; nested exception is javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?",

{
  "timestamp": 1587885892307,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.web.client.ResourceAccessException",
  "message": "I/O error on POST request for \"http://systemlogging-v1/\": Unrecognized SSL message, plaintext connection?; nested exception is javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?",
  "path": "/execution-control/_execute"
}

issue invesigation

这是由于1.5.20.RELEASE版本里的bug导致的

public class EurekaServerIntrospector extends DefaultServerIntrospector {

	@Override
	public boolean isSecure(Server server) {
		if (server instanceof DiscoveryEnabledServer) {
			DiscoveryEnabledServer discoveryServer = (DiscoveryEnabledServer) server;
			return discoveryServer.getInstanceInfo().isPortEnabled(InstanceInfo.PortType.SECURE);
		}
		return super.isSecure(server);
	}
package org.springframework.cloud.netflix.ribbon;

import java.util.Collections;
import java.util.Map;

import com.netflix.loadbalancer.Server;

/**
 * @author Spencer Gibb
 */
public class DefaultServerIntrospector implements ServerIntrospector {
	@Override
	public boolean isSecure(Server server) {
		// Can we do better?
		return (""+server.getPort()).endsWith("443"); 
		// 这样会导致serviceA的端口如果是以443结尾, 比如40443, 会误以为secure, 从而将http请求转换成https
	}

	@Override
	public Map<String, String> getMetadata(Server server) {
		return Collections.emptyMap();
	}
}

How to fix issue

upgrade the springboot version to 2.1.0.RELEASE

@ConfigurationProperties("ribbon")
public class ServerIntrospectorProperties {

	private List<Integer> securePorts = Arrays.asList(443,8443);

	public List<Integer> getSecurePorts() {
		return securePorts;
	}	
}

public class EurekaServerIntrospector extends DefaultServerIntrospector {

	@Override
	public boolean isSecure(Server server) {
		if (server instanceof DiscoveryEnabledServer) {
			DiscoveryEnabledServer discoveryServer = (DiscoveryEnabledServer) server;
			return discoveryServer.getInstanceInfo().isPortEnabled(InstanceInfo.PortType.SECURE);
		}
		return super.isSecure(server);
	}
}

/**
 * @author Spencer Gibb
 */
public class DefaultServerIntrospector implements ServerIntrospector {

	private ServerIntrospectorProperties serverIntrospectorProperties = new ServerIntrospectorProperties();

	@Autowired(required = false)
	public void setServerIntrospectorProperties(ServerIntrospectorProperties serverIntrospectorProperties){
		this.serverIntrospectorProperties = serverIntrospectorProperties;
	}

	@Override
	public boolean isSecure(Server server) {
	//这里使用了List<Integer> securePorts = Arrays.asList(443,8443);。 判断list里是否包含指定端口, 而不是盘算以什么结尾
		return serverIntrospectorProperties.getSecurePorts().contains(server.getPort());
	}
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring IOC的理解

    Sping IoC is Inversion of Control. 控制反转.

    CoffeeLand
  • Springframwork.Util之StopWatch 多任务计时

    StopWatch是spring框架提供的一个util, 用来做多任务的计时, 隐藏了System.currentTimeMillis()的使用, 增加应用程序...

    CoffeeLand
  • Fortinet面试总结

    https://stackoverflow.com/questions/29225745/where-is-the-local-final-variable-i...

    CoffeeLand
  • HeadFirst设计模式

    抽象父类只负责实现相应功能不用管具体是哪一个实现。 子类想调用哪一个行为,就new一个新的行为。

    黑白格
  • 聊聊EurekaRibbonClientConfiguration

    spring-cloud-netflix-eureka-client-2.0.0.RELEASE-sources.jar!/org/springframewor...

    codecraft
  • 访问者模式

    静态绑定,是重写的时候就断定要绑定那个,例如定义年轻演员的时候,重写的act方法,此时为静态绑定了KungFuRole,

    mySoul
  • 第76节:Java中的基础知识

    设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat

    达达前端
  • 六、门面模式与装饰器模式详解

    门面模式(Facade Pattern)又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接 口。其主要特征是定义了一个高层接口,让子系统更容易使用,...

    编程之心
  • Java泛型基础(一)目的泛型类总结

    利用Java开发的时候,肯定会有一个类持有另一个或几个类的情况,在编写一些比较基础的组件,例如缓存操作组件,这类组件的逻辑差不多,但是希望能够处理不同的类型。

    阿杜
  • Java开发中的23种设计模式详解(转)

                                      ——可复用面向对象软件的基础

    肖哥哥

扫码关注云+社区

领取腾讯云代金券