共计 2907 个字符,预计需要花费 8 分钟才能阅读完成。
作者:胡呈清
爱可生 DBA 团队成员,善于故障剖析、性能优化,集体博客:https://www.jianshu.com/u/a95…,欢送探讨。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
一个报错
在应用客户端登录 MySQL8.0 时,咱们常常会遇到上面这个报错:
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
网络上很多帖子教咱们将用户认证插件批改成 mysql_native_password 来解决,那么事实上这是怎么一回事呢?本文就来探讨一二。
caching_sha2_password 简介
caching_sha2_password 是 MySQL 8.0.4 引入的一个新的身份验证插件,它的特点从其命名就能够窥探出一二:
- sha2_password:其实就是 sha256_password,这是 MySQL5.6 就引入的身份验证插件,其长处是对加盐明码进行多轮 SHA256 哈希,以确保哈希转换更平安。其毛病为它要求应用平安连贯或应用 RSA 密钥对进行明码替换的未加密连贯,因而其身份验证的效率较低。
- caching:在 sha256_password 的根底上减少缓存,有缓存的状况下不须要加密连贯或 RSA 密钥对,已达到平安和效率并存。
其实下面这个介绍不太容易懂,上面咱们以问答形式来揭开 caching_sha2_password 的面纱。
Q:要求应用平安连贯或应用 RSA 密钥对进行明码替换的未加密连贯是什么意思?
caching_sha2_password 对明码安全性要求更高,要求用户认证过程中在网络传输的明码是加密的:
- 如果是 SSL 加密连贯,则应用 SSL 证书和密钥对来实现 “ 对称加密密钥对(在 TSL 握手中生成)” 的替换,后续应用“对称加密密钥对”加密明码和数据。具体见:MySQL:SSL 连贯浅析;
- 如果是非 SSL 加密连贯,则在连贯建设时客户端应用 MySQL Server 端的 RSA 公钥加密用户明码,Server 端应用 RSA 私钥解密验证明码的正确性,能够避免明码在网络传输时被窥探。
tips:SSL 加密连贯会不止会加密用户明码,还会加密数据(SQL 申请、返回的后果);非加密连贯只应用 RSA 密钥对进行用户明码的加密。
Q:未加密连贯是怎么应用 RSA 密钥对进行明码替换的?
当用户验证胜利后,会把用户明码哈希缓存起来。新连贯客户端发动登录申请时,MySQL Server 端会判断是否命中缓存,如果没有缓存,对于未加密的连贯,caching_sha2_password 插件要求连贯建设时应用 RSA 进行加密明码替换,否则报错,其过程为:
- 客户端如果领有服务端的 RSA 公钥,则应用 –server-public-key-path 选项指定 RSA 公钥文件;
- 客户端应用 RSA 公钥对用户明码进行加密,申请连贯;
- 服务端应用 RSA 私钥进行解密,验证明码的正确性。
如果客户端没有保留服务端的 RSA 公钥文件,也能够应用 –get-server-public-key 选项从服务器申请公钥,则在建设连贯时,服务端会先将 RSA 公钥发送给客户端。
如果 –server-public-key-path、–get-server-public-key 都没有指定,则会报上面这个经典的谬误:
[root@172-16-21-5 ~] mysql -h172.16.21.4 -utest -ptestpass --ssl-mode=disable
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
指定 –get-server-public-key 则能胜利登录:
[root@172-16-21-5 ~] mysql -h172.16.21.4 -utest -ptestpass --ssl-mode=disable --get-server-public-key -e "select 1"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 1 |
+---+
如果 test 用户登陆胜利,有了缓存,则下次认证时未加密连贯不再要求应用 RSA 密钥对:
[root@172-16-21-5 ~] mysql -h172.16.21.4 -utest -ptestpass --ssl-mode=disable -e "select 1"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 1 |
+---+
留神:上述客户端是指 mysql 默认命令行客户端,–server-public-key-path、–get-server-public-key 参数也只实用于 mysql 客户端
RSA 密钥对保留在哪里?
RSA 钥对默认保留 MySQL datadir 下,用于非 SSL 连贯时的明码加密替换:应用 RSA 公钥加密明码,应用 RSA 私钥解密:
private_key.pem RSA 公钥
public_key.pem RSA 私钥
Q:明码哈希缓存何时生效?
当用户验证胜利后,明码哈希会缓存起来,缓存会在以下状况被清理:
- 当用户的明码被更改时;
- 当应用 RENAME USER 重命名用户时;
- 执行 FLUSH PRIVILEGES 时;
- MySQL 重启。
Q:复制用户应用 caching_sha2_password 插件须要留神什么?
对于 MGR,如果设置 group_replication_ssl_mode=DISABLED,则也必须应用上面的变量来指定 RSA 公钥,否则报错:
- group_replication_recovery_get_public_key:向服务端申请 RSA 公钥;
- group_replication_recovery_public_key_path:指定本地 RSA 公钥文件。
设置一个就行,思考拷贝 RSA 公钥到各节点麻烦,倡议设置 group_replication_recovery_get_public_key=ON。
对于异步 / 半同步复制,须要在 change master 命令中指定:MASTER_PUBLIC_KEY_PATH = 'key_file_path'
或 GET_MASTER_PUBLIC_KEY = {0|1}
含意同上,倡议:GET_MASTER_PUBLIC_KEY = 1
参考资料
https://dev.mysql.com/blog-ar…
https://dev.mysql.com/doc/ref…