先简单介绍一下场景。
服务架构为:haproxy+keepalive + esb+应用。
在esb层实现 https双向认证。这样就需要 haproxy 使用 tcp 模式进行转发。
配置好 haproxy 后,用restclient模拟客户端发送https请求时 客户端报错:
“Unrecognized SSL message, plaintext connection?”
客户端对同一端口(https的端口)使用http协议发送消息时,服务端(esb)日志报错:
“Unrecognized SSL message, plaintext connection?”
网上搜到一篇文章解释这个问题:http://blog.csdn.net/dtlscsl/article/details/50462721
产生该问题的原因是:
客户端产生“Unrecognized SSL message, plaintext connection?”的异常 是因为对方提供的不是https服务的端口;
服务端产生该异常,是因为客户端以 http协议访问 服务端的https服务。
带着这个思路,查了下 haproxy的配置,发现
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
默认的方式为http的!
而esb的服务没有配置传输方式!
listen ESB_https 0.0.0.0:8243
mode tcp
log global
option tcplog
balance roundrobin
server ESB_https_126 172.16.0.126:8243 weight 1 maxconn 10000 check inter 3600s
server ESB_https_36 172.16.0.36:8243 weight 1 maxconn 10000 check inter 3600s
加上红字的3句,解决了这个问题。