你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用证书进行的 MQTT 客户端身份验证

Azure 事件网格的 MQTT 代理支持使用 X.509 证书对客户端进行身份验证。 X.509 证书提供用于将特定客户端与租户关联的凭据。 在此模型中,身份验证通常在会话建立期间发生一次。 然后,假定使用同一会话的所有将来操作都来自该标识。

支持的身份验证模式包括:

  • 证书颁发机构 (CA) 颁发的证书
  • 自签名客户端证书 - 指纹
  • Microsoft Entra ID 令牌

本文的重点在于证书。 要了解如何使用 Microsoft Entra ID 令牌进行身份验证,请参阅使用 Microsoft Entra ID 令牌对客户端进行身份验证

证书颁发机构 (CA) 签名的证书

使用此方法时,会在服务中注册一个根或中间 X.509 证书。 本质上,用于为客户端证书签名的根证书或中间证书必须首先在服务中注册。

重要

  • 确保上传用于为客户端证书签名的根证书或中间证书。 不需要上传整个证书链。
  • 例如,如果你有根证书、中间证书和叶证书的链,请确保上传用于为叶/客户端证书签名的中间证书。

显示 CA 证书页的屏幕截图,其中显示了用于为客户端证书签名的根证书和中间证书。

注册客户端时,需要标识用于保存客户端身份验证名称的证书字段。 为了验证客户端,服务会将证书中的身份验证名称与客户端元数据中的客户端身份验证名称进行匹配。 服务还会通过验证客户端证书是否由先前已注册的根证书或中间证书签名,来验证客户端证书。

显示客户端元数据和五个基于证书链的验证方案的屏幕截图。

自签名客户端证书 - 指纹

使用这种身份验证方法时,客户端注册表会存储由客户端用来进行身份验证的证书的确切指纹。 当客户端尝试连接到服务时,服务会通过将客户端证书中提供的指纹与客户端元数据中存储的指纹进行比较来验证客户端。

显示客户端元数据和指纹身份验证方案的屏幕截图。

注意

  • 我们建议在客户端连接数据包的用户名字段中包含客户端身份验证名称。 使用此身份验证名称以及客户端证书,服务能够对客户端进行身份验证。
  • 如果不在用户名字段中提供身份验证名称,则需要在命名空间范围为客户端身份验证名称配置备用源字段。 服务在客户端证书的相应字段中查找客户端身份验证名称,以验证客户端连接。

在命名空间范围的配置页中,可以启用备用客户端身份验证名称源,然后选择包含客户端身份验证名称的客户端证书字段。

显示包含客户端身份验证名称备用源设置的命名空间配置页的屏幕截图。

命名空间配置页上的客户端证书字段选择顺序非常重要。 服务按照相同的顺序在客户端证书字段中查找客户端身份验证名称。

例如,如果你首先选择“证书 DNS”选项,然后选择“使用者名称”选项,则在对客户端连接进行身份验证时,

  • 服务将首先检查客户端证书的使用者备用名称 DNS 字段,以获取客户端身份验证名称
  • 如果 DNS 字段为空,则服务将检查客户端证书的“使用者名称”字段
  • 如果这两个字段中都没有客户端身份验证名称,则会拒绝客户端连接

在这两种客户端身份验证模式下,我们都需要在连接数据包的用户名字段或某个客户端证书字段中提供客户端身份验证名称。

客户端身份验证名称的备用源支持的客户端证书字段

可以使用以下字段之一在客户端证书中提供客户端身份验证名称。

身份验证名称源选项 证书字段 说明
证书使用者名称 tls_client_auth_subject_dn 证书的使用者可分辨名称。
证书 DNS tls_client_auth_san_dns 证书中的 dNSName SAN 条目。
证书 URI tls_client_auth_san_uri 证书中的 uniformResourceIdentifier SAN 条目。
证书 IP tls_client_auth_san_ip 证书的 iPAddress SAN 条目中提供的 IPv4 或 IPv6 地址。
证书电子邮件 tls_client_auth_san_email 证书中的 rfc822Name SAN 条目。

后续步骤