MySQL 从 5.7.27 升级到 5.7.30。完成后应用连接测试发现页面异常,mysql error 日志显示:
2020-05-05T22:10:57.976402+08:00 2 [Note] Bad handshake
没有报错,但这条 Note 级别的日志,引起了我的注意,之前从来没有见过。由于时间紧急,决定先回退 MySQL 版本。
回退后,问题未能解决。
Bad handshake,”不好的握手”,网上查了资料,发现和 SSL 可能有关。这时业务也发来应用日志,日志有明显的 SSL 相关报错。
然后,我们去检查了 jdbc 连接串,连接串使用了
useSSL=true
,改为
useSSL=false
后解决了。
5.7.27 版本
mysql> select @@version;
+------------+
| @@version |
+------------+
| 5.7.27-log |
+------------+
1 row in set (0.00 sec)
mysql> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
+---------------+----------+
9 rows in set (0.00 sec)
5.7.28 版本
mysql> show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
9 rows in set (0.00 sec)
上面日志,能看出是 SSL 相关异常。
并且能发现一个关键的报错,是握手异常,并且有证书相关的报错。
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
后面我证实了,jdbc 连接要求 SSL 和 证书认证要一起使用。
[root@fander ~]# tcpdump -i ens33 port 3307 -l -s 0 -w - | strings
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
@8q=*
8q=+P
@8q=+
5.7.30-log
=LQIKF7
mysql_native_password
8q=}P
@8q=}
B 8q=}P
@8q=}
@8q=}
0<1:08
1MySQL_Server_5.7.30_Auto_Generated_CA_Certificate0
200506110938Z
300504110938Z0@1>0<
5MySQL_Server_5.7.30_Auto_Generated_Server_Certificate0
2nh
=zFx
3[x=
o(*c0
Ty5B
0A,IY
-{u6
0<1:08
1MySQL_Server_5.7.30_Auto_Generated_CA_Certificate0
200506110938Z
300504110938Z0<1:08
1MySQL_Server_5.7.30_Auto_Generated_CA_Certificate0
>*[]dG
^!!$
y[(j
kh(nPjd
VU{h
MMojb
U38P
3.^Z
2. 那么为什么 5.7.28 会自动生成这些文件?
mysql --verbose --help |less
--auto-generate-certs
Auto generate SSL certificates at server startup if --ssl
is set to ON and none of the other SSL system variables
are specified and certificate/key files are not present
in data directory.
(Defaults to on; use --skip-auto-generate-certs to disable.)
在 5.7.28 版本,存在该服务器参数,但 5.7.27 未见此参数。
参数写的很清楚,默认是开的,用于自动生成”SSL 密钥和证书文件”,如果数据目录没有这堆文件的话。
-
auto
_generate_
certs
-
sha256_
password_
auto_
generate_
rsa_keys
-
sha256_
password_
private_
key_
path
-
sha256_
password_
public_
key_
path
-
Rsa_
public_
key
官方文档并没有告诉我们这些参数是 5.7.28 新增的,原因是因为这些参数压根就不是新增的!这些参数是一直都有的!
如果你的 MySQL 源码编译时用 openssl,替代 yassl,那就有这些参数!
所以 Only OpenSSL 这个新特性,实际上影响比官方文档写的要大,因为他实际上影响了 MySQL 参数!影响了 MyS
QL 默认开启了 SSL 的支持!