常见错误

    提示

    4.3 已兼容 caching_sha2_password,该问题仅在 4.3 以下的版本中出现。

    不同于以往版本,MySQL 8.0 对账号密码配置默认使用插件,需要将密码插件改成mysql_native_password

    • 修改 mysql.user

    • 修改 my.conf

      my.cnf 配置文件里面的 [mysqld] 下面加一行

      1. default_authentication_plugin=mysql_native_password
    • 重启 MySQL 即可

    标签: 启动失败

    执行 ./bin/emqx console 输出的错误内容包含:

    1. {application_start_failure,kernel,{{shutdown,{failed_to_start_child,kernel_safe_sup,{on_load_function_failed,crypto}}}, ..}

    它表示,EMQX 依赖的 Erlang/OTP 中的 crypto 应用启动失败。

    解决方法

    Linux

    进入到 EMQX 的安装目录(如果使用包管理工具安装 EMQX,则应该进入与 EMQX 的 lib 目录同级的位置)

    1. ## 安装包安装
    2. ## 包管理器安装,例如 yum。则它的 lib 目录应该在 /lib/emqx
    3. $ cd /lib/emqx

    查询 crypto依赖的 .so 动态库列表及其在内存中的地址:

    源码编译安装 OPENSSL 1.1.1,并将其 so 文件放置到可以被系统识别的路径:

    1. ## 下在最新版本 1.1.1
    2. $ wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
    3. ## 上传至 ct-test-ha
    4. $ scp openssl-1.1.1c.tar.gz ct-test-ha:~/
    5. ## 解压并编译安装
    6. $ tar zxf openssl-1.1.1c.tar.gz
    7. $ cd openssl-1.1.1c
    8. $ ./config
    9. $ make test # 执行测试;如果输出 PASS 则继续
    10. $ make install
    11. ## 确保库的引用
    12. $ ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1

    完成后,执行在 EMQX 的 lib 同级目录下执行 ldd lib/crypto-*/priv/lib/crypto.so ,检查是否已能正确识别。如果不在有 not found.so 库,即可正常启动 EMQX。

    macOS

    进入到 EMQX 的安装目录:

    1. ## 安装包安装
    2. $ cd emqx
    3. ## brew 安装

    查询 crypto依赖的 .so 动态库列表:

    1. $ otool -L lib/crypto-*/priv/lib/crypto.so
    2. lib/crypto-4.4.2.1/priv/lib/crypto.so:
    3. /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
    4. /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)

    检查其显示 OPENSSL 已成功安装至指定的目录:

    若不存在该文件,则需安装与 otool 打印出来的对应的 OPENSSL 版本,例如此处显示的为 openssl@1.1

    1. $ brew install openssl@1.1

    安装完成后,即可正常启动 EMQX。

    标签: 启动失败

    Windows 执行 ./bin/emqx console 弹出错误窗口:

    1. 无法启动次程序,因为计算机中丢失 MSVCR120.dll。请尝试重新安装该程序以解决此问题。

    解决方法

    安装

    客户端无法与 EMQX 建立 SSL 连接。

    解决方法

    1. certificate_expired

      日志中出现 certificate_expired 关键字,说明证书已经过期,请及时续签。

    2. no_suitable_cipher

      日志中出现 no_suitable_cipher 关键字,说明握手过程中没有找到合适的密码套件,可能原因有证书类型与密码套件不匹配、没有找到服务端和客户端同时支持的密码套件等等。

    3. handshake_failure

      日志中出现 handshake_failure 关键字,原因有很多,可能要结合客户端的报错来分析,例如,可能是客户端发现连接的服务器地址与服务器证书中的域名不匹配。

    4. unknown_ca

      日志中出现 unknown_ca 关键字,意味着证书校验失败,常见原因有遗漏了中间 CA 证书、未指定 Root CA 证书或者指定了错误的 Root CA 证书。在双向认证中我们可以根据日志中的其他信息来判断是服务端还是客户端的证书配置出错。如果是服务端证书存在问题,那么报错日志通常为:

      1. {ssl_error,{tls_alert,{unknown_ca,"TLS server: In state certify received CLIENT ALERT: Fatal - Unknown CA\n"}}}

      看到 CLIENT ALERT 就可以得知,这是来自客户端的警告信息,服务端证书未能通过客户端的检查。

      如果是客户端证书存在问题,那么报错日志通常为:

      看到 SERVER ALERT 就能够得知,表示服务端在检查客户端证书时发现该证书无法通过认证,而客户端将收到来自服务端的警告信息。

    5. protocol_version