使用场景
“一机一证” 实际是双向认证的一种特殊情况,每个客户端(每台设备)使用自行签发的 CA 证书及 CA 证书签发的不同的客户端证书(设备证书)进行认证。
消息队列 MQTT 版专业集群额外支持了 ”一机一证“ 的功能,您在产品的控制台上自由注册和管理设备的 CA 证书和客户端证书(设备证书),在设备出厂前,通过给每台设备烧录独特的设备证书,这样极大程度上降低了单个设备证书泄漏的影响半径。
操作步骤
配置证书注册方式
1. 登录 MQTT 控制台。
2. 在左侧导航栏单击资源管理 > 集群管理,选择好地域后,单击要配置证书的集群的“ID”,进入集群基本信息页面。
3. 在认证管理页面,进入 X.509 证书管理页签,单击右侧的编辑图标 
,在弹窗中完成证书配置。

证书来源:选择 “自定义证书” 选项。
认证方式:选择 “一机一证” 选项。
服务端证书配置:
证书来源:根据您的业务需求选择合适的认证方式,当前仅支持选择来自腾讯云 SSL证书。
授权 MQTT 服务可以下载并应用 SSL 证书能力:必选,不勾选 MQTT 服务将无法应用 SSL 证书能力。
服务端证书:勾选您要配置的 SSL 证书,如果当前没有维护在腾讯云的 SSL 证书或者现有的证书不合适,您可以参见 SSL 快速入门申请证书。
CA 证书来源:当前仅支持手动上传 CA 证书并注册。开启 “一机一证” 功能后,在集群详情页面 CA 证书管理页面添加 CA 证书。下文将重点介绍。
客户端证书来源:支持自动注册和手动注册。
默认激活状态:支持注册后自动激活和手动激活。

4. 单击提交,完成证书配置。
5. 完成 “一机一证” 的配置后,集群详情页会新增 “CA 证书管理” 和 “客户端证书管理” 页面,如下图所示。


手动注册 CA 证书
开启 “一机一证” 认证模式后,客户需要先在 “CA 证书管理” 页面手动注册 CA 证书。
签发 CA 证书
在正式注册 CA 证书之前,需要自行签发 CA 证书,以下简要介绍签发 CA 证书的步骤,如您已有完成签发的 CA 证书可以跳过当前的“签发 CA 证书”步骤。
1. 下载并安装 OpenSSL。
注意:
如您使用的是 Windows 系统,需要将 OpenSSL 的安装目录的 bin 子目录添加到您的系统 PATH 环境变量中,如下图所示。

2. 以下均以 RSA 算法证书为例,使用以下命令生成一个密钥对。
openssl genrsa -out CA.key 2048
3. 使用上一步生成的密钥对中的私钥(private key)生成证书签发请求文件(csr)。
openssl req -new -key CA.key -out CA.csr
4. 页面会返回以下示例,根据提示输入对应的参数。
Country Name (2 letter code) [AU]:State or Province Name (full name) []:Locality Name (for example, city) []:Organization Name (for example, company) []:Organizational Unit Name (for example, section) []:Common Name (e.g. server FQDN or YOUR name) []:Email Address []:
注意:
Common Name 字段填写的域名需要和集群的接入点域名保持一致,推荐使用
*.mqtt.tencenttdmq.com
。如果需要保证该证书的配置仅对当前集群生效,可以根据使用场景(公网或 VPC 网络)写入对应的域名,例如公网可以填写
mqtt-xxxxxx-gz-public.mqtt.tencenttdmq.com
,内网可以填写 mqtt-xxxxxx-gz-vpce-xxxxxx.mqtt.tencenttdmq.com
。5. 生成自签名的 RSA 算法的 CA 证书
CA.crt
。openssl x509 -req -extfile /System/Library/OpenSSL/openssl.cnf -extensions v3_ca -in CA.csr -out CA.crt -signkey CA.key -CAcreateserial -days 3650
openssl x509 -req -extfile C:\\Progra~1\\OpenSSL-Win64\\bin\\cnf\\openssl.cnf -extensions v3_ca -in CA.csr -out CA.crt -signkey CA.key -CAcreateserial -days 3650
openssl x509 -req -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -in CA.csr -out CA.crt -signkey CA.key -CAcreateserial -days 3650
验证证书
在本地完成 CA 证书的签发后,您可以在控制台通过注册码后,生成对应的验证证书,验证证书用于验证 CA 证书本身有效性,包括证书是否由可信任的 CA 机构颁发。参考上述签发 CA 证书的流程,生成验证证书的流程如下:
1. 以下均以 RSA 算法证书为例,使用以下命令生成验证证书的密钥对。
openssl genrsa -out VerificationCert.key 2048
2. 使用上一步生成的密钥对中的私钥(private key)生成验证证书的签发请求文件(csr)。
openssl req -new -key VerificationCert.key -out VerificationCert.csr
3. 登录 MQTT 控制台,在左侧导航栏单击资源管理 > 集群管理,选择好地域后,单击要配置证书的集群的“ID”,进入集群基本信息页面。在 CA 证书管理页面,单击注册 CA 证书,进入注册配置页面。复制页面上方生成的注册码,填写到下一步的 Common Name 字段。

注意:
在本地生成并上传验证证书前,请不要关闭当前弹窗。弹窗关闭后会导致注册码重新生成,导致验证证书校验不通过。
4. 页面会返回以下示例,根据提示输入对应的参数。将上一步复制的注册码填写到 Common Name 字段中,其他字段视实际情况填写,可以为空。
You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:State or Province Name (full name) []:Locality Name (for example, city) []:Organization Name (for example, company) []:Organizational Unit Name (for example, section) []:Common Name (e.g. server FQDN or YOUR name) []:your_registration_codeEmail Address []:Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []:
5. 执行如下命令,生成CA证书的验证证书 VerificationCert.crt。
openssl x509 -req -in VerificationCert.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out VerificationCert.crt -days 600 -sha512
上传证书
返回到控制台弹窗,上传 CA 证书 和 验证证书,确定后单击 提交。
上传证书后,服务端会使用验证证书中的公钥对 CA 证书的签名进行解密,并与验证证书中内容的哈希值进行比较。如果两者匹配,则表明签名有效,进而证明 CA 证书是可信的。

管理 CA 证书
CA 证书完成注册后,您可以随时在页面管理已注册的 CA 证书。
在 CA 证书的列表页,可以查看已经注册的 CA 证书的状态,CA 证书有两种状态:已激活和未激活,未激活的证书可以被删除。


注意:
CA 证书取消激活后,使用当前 CA 证书的客户端证书在连接时会被拒绝,因此在进行 CA 证书的状态流转时需要特别注意对于客户端连接的影响。
CA 证书在删除时,会校验当前 CA 证书下是否有处于“已激活”状态下的客户端证书(设备证书),如果有的话会禁止当前的删除 CA 证书操作;如当前 CA 证书下的客户端证书(设备证书)处于“未激活”或者“已吊销”状态,则CA证书可以正常删除。
单击列表操作栏的查看详情,进入 CA 证书详情页,可以查看 CA 证书的相关信息。
在基础信息部分,页面展示 CA 证书的状态,Common Name,Serial Number 等信息。基础信息里的 “失效时间” 为在控制台,CA 证书取消激活的时间,并非证书失效的时间。如果证书为激活状态,则不展示“失效时间”,如下图所示。
同时,详情页还会展示关联了当前 CA 证书的客户端证书,单击客户端证书的序列号可以进入客户端证书的详情。


使用 CA 证书生成服务端/客户端证书
以下以 RSA 算法为例,简单介绍如何使用 CA 证书生成服务端或客户端证书。
1. 创建一个名称为
client.csr.cfg
的文件,文件内容按照实际情况对下文进行修改。[req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn [dn] C=CN ST=SHXXX L=SH O=TX OU=MQTT emailAddress=xxx@xxx CN=client-test
2. 创建一个名称为
client.crt.cfg
的文件,内容如下:authorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign
3. 生成客户端证书私钥和验证证书的签发请求文件(csr)。
openssl req -new -sha256 -nodes -out client.csr -newkey rsa:2048 -keyout client.key -config <(cat client.csr.cfg)
openssl req -new -sha256 -nodes -out client.csr -newkey rsa:2048 -keyout client.key -config client.csr.cfg
4. 生成客户端证书。
openssl x509 -req -in client.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out client.crt -days 500 -sha256 -extfile client.crt.cfg
注册客户端证书
自动注册客户端证书
如果选择自动注册客户端,则客户端在和服务端连接时,服务端会校验客户端证书关联的 CA 证书是否已经注册,如果对应的 CA 证书未注册,则认证不通过,客户端连接会被拒绝。
如果对应的 CA 证书已注册,则认证通过,客户端证书会自动出现在 “客户端证书管理” 的列表页。
手动注册客户端证书
1. 登录 MQTT 控制台。
2. 在左侧导航栏单击资源管理 > 集群管理,选择好地域后,单击要配置证书的集群的“ID”,进入集群基本信息页面。
3. 进入客户端证书管理页面,单击注册客户端证书。在以下弹窗填写客户端证书的相关信息:
证书来源:手动注册。
CA 证书:选择已经注册了的 CA 证书。
客户端证书:按照文件格式要求上传证书,见上文的 “使用 CA 证书生成客户端证书” 部分。
客户端 ID:“一机一证” 场景下的补充字段,不必填,您可以根据实际场景填写。如果客户端连接时传的 client id 为空,该字段会被认为表示 client id;如果client id 和该字段均为空,则服务端会以客户端证书的 Common Name 字段为准。因此假设客户端没有传 client id 的情况下,请注意保证该字段不要有重复的情况。
是否激活:客户端证书注册后的生效状态,默认开启。您也可以在注册完成后,在控制台手动开启。

管理客户端证书
客户端证书完成注册后,您可以随时在页面管理已注册的客户端证书。
在客户端证书的列表页,可以查看已经注册的证书的状态,客户端证书有三种状态:已激活、未激活、已吊销。已吊销的证书可以被删除。

客户端生效/失效时间支持筛选,可以选出已失效和即将失效(30天内即将过期)的客户端证书。
单击列表操作栏的查看详情,进入客户端证书详情页,可以查看客户端证书的相关信息。
在基础信息部分,页面展示证书的状态,Common Name,Serial Number,关联的 CA 证书等信息。基础信息里的 “失效时间” 为在控制台,CA 证书取消激活的时间,并非证书失效的时间。如果证书为激活状态,则不展示“失效时间”,如上图所示。
同时,详情页还会展示关联了当前 CA 证书的客户端证书,单击客户端证书的序列号可以进入客户端证书的详情。