X.509 证书

X.509 证书是代表用户、计算机、服务或设备的数字文档。 证书颁发机构 (CA)、从属 CA 或注册机构负责颁发 X.509 证书。 证书包含证书使用者的公钥。 它们不包含使用者的私钥(必须安全存储)。 RFC 5280 记录公钥证书,包括它们的字段和扩展名。 公钥证书经过数字签名,通常包含以下信息:

  • 证书使用者的信息
  • 与使用者私钥相对应的公钥
  • 证书颁发机构的信息
  • 支持的加密和/或数字签名算法
  • 用于确定证书吊销和有效性状态的信息

证书字段

X.509 证书标准有三个增量版本,每个后续版本都向标准添加了证书字段:

  • 1988 年发布的版本 1 (v1),遵循证书的初始 X.509 标准。
  • 1993 年发布的版本 2 (v2),向版本 1 中包含的字段添加了两个字段。
  • 2008 年发布的版本 3 (v3),即 X.509 标准的当前版本。 此版本添加了对证书扩展名的支持。

本部分旨在作为 X.509 证书中提供的证书字段和证书扩展名的常规参考。 有关证书字段和证书扩展名的详细信息(包括数据类型、约束和其他详细信息),请参阅 RFC 5280 规范。

版本 1 字段

下表描述了 X.509 证书的版本 1 证书字段。 此表中包含的所有字段都存在于后续的 X.509 证书版本中。

名称 说明
版本 标识证书版本号的整数。
序列号 一个整数,表示证书颁发机构 (CA) 颁发的每个证书的唯一编号。
Signature CA 用来签署证书的加密算法的标识符。 该值包括算法的标识符和该算法使用的任何可选参数(如果适用)。
颁发者 发证 CA 的证书的可分辨名称 (DN)。
有效期 证书有效的非独占时间段。
主题 证书使用者的可分辨名称 (DN)。
使用者公钥信息 证书使用者拥有的公钥。

版本 2 字段

下表描述了为版本 2 添加的字段,其中包含有关证书颁发者的信息。 不过,这些字段很少使用。 此表中包含的所有字段都存在于后续的 X.509 证书版本中。

名称 说明
颁发者唯一 ID 表示发证 CA 的唯一标识符,由发证 CA 定义。
使用者唯一 ID 辨识证书使用者的唯一标识符,由发证 CA 定义。

版本 3 字段

下表描述了为版本 3 添加的字段,它表示 X.509 证书扩展名的集合。

名称 说明
扩展 标准和 Internet 特定证书扩展名的集合。 有关可用于 X.509 v3 证书的证书扩展名的详细信息,请参阅证书扩展名

证书扩展名

版本 3 中引入的证书扩展名提供了将更多属性与用户或公钥关联的方法,以及管理证书颁发机构之间的关系的方法。 有关证书扩展名的详细信息,请参阅 RFC 5280 规范的证书扩展名部分。

标准扩展名

X.509 标准定义了本节中包含的用于 Internet 公钥基础结构 (PKI) 的扩展名。

名称 说明
授权密钥标识符 一个标识符,表示证书使用者和颁发此证书的 CA 证书的序列号,或发证 CA 的公钥的哈希。
使用者密钥标识符 当前证书公钥的哈希。
密钥使用情况 一个位图值,用于定义可以使用证书的服务。
私钥使用周期 密钥对的私钥部分的有效期。
证书策略 策略信息的集合,用于验证证书使用者。
策略映射 策略映射的集合,其中每个映射都将一个组织中的策略映射到另一个组织中的策略。
使用者可选名称 主题的备用名称集合。
颁发者备用名称 发证 CA 的备用名称集合。
使用目录属性 X.500 或 LDAP 目录中的属性集合。
基本约束 允许证书指定是将其颁发给 CA,还是用户、计算机、设备或服务的约束集合。 此扩展还包括一个路径长度约束,用于限制可以存在的从属 CA 的数量。
名称约束 约束集合,用于指定 CA 颁发的证书中允许哪些命名空间。
策略约束 可用于禁止 CA 之间的策略映射的约束集合。
扩展密钥用法 密钥用途值的集合,表示在“密钥用法”扩展中确定的用途之外可用如何使用证书的公钥。
CRL 分发点 发布基本证书吊销列表 (CRL) 的 URL 集合。
禁止 anyPolicy 禁止在从属 CA 证书中使用“所有颁发策略”OID (2.5.29.32.0)
最新 CRL 此扩展(也称为 Delta CRL 分发点)包含一个或多个发布发证 CA 的增量 CRL 的 URL。

专用 Internet 扩展名

本节中包含的扩展名类似于标准扩展名,可用于将应用程序定向到有关发证 CA 或证书主体的在线信息。

名称 说明
颁发机构信息访问 描述发证 CA 提供的其他信息的格式和位置的条目集合。
使用者信息访问 描述证书使用者提供的其他信息的格式和位置的条目集合。

证书格式

可采用多种格式保存证书。 Azure IoT 中心身份验证通常使用隐私增强邮件 (PEM) 和个人信息交换 (PFX) 格式。 下表描述了用于表示证书的常用文件和格式。

格式 说明
二进制证书 使用可辨别编码规则 (DER) ASN.1 编码的原始格式二进制证书。
ASCII PEM 格式 PEM 证书 (.pem) 文件包含以 -----BEGIN CERTIFICATE----- 开头且以 -----END CERTIFICATE----- 结尾的 Base64 编码证书。 上传某些证书时(如设备证书),IoT 中心需要 PEM 格式(X.509 证书最常见的格式之一)。
ASCII PEM 密钥 包含 Base64 编码的 DER 密钥,可以选择包含有关用于密码保护的算法的其他元数据。
PKCS #7 证书 一种用于传输已签名或已加密数据的格式。 它可以包括整个证书链。 RFC 2315 定义此格式。
PKCS #8 密钥 私钥存储的格式。 RFC 5208 定义此格式。
PKCS #12 密钥和证书 一种复杂的格式,可以存储和保护密钥和整个证书链。 它通常与 .p12 或 .pfx 扩展名一起使用。 PKCS #12 等同于 PFX 格式。 RFC 7292 定义此格式。

自签名证书

出于测试目的,可以使用两个自签名证书在 IoT 中心对设备进行身份验证。 这种类型的身份验证有时称为指纹身份验证,因为证书由称为指纹拇指纹的计算哈希值进行标识。 IoT 中心使用这些计算的哈希值对设备进行身份验证。

重要

建议使用证书颁发机构 (CA) 签名的证书,即使是出于测试目的。 切勿在生产环境中使用自签名证书。

创建自签名证书

可以使用 OpenSSL 来创建自签名证书。 以下步骤演示如何在 bash shell 中运行 OpenSSL 命令,以创建自签名证书并检索可用于在 IoT 中心对设备进行身份验证的证书指纹。

注意

如果想要使用自签名证书进行测试,则必须为每个设备创建两个证书。

  1. 运行以下命令以生成私钥并创建 PEM 编码的私钥 (.key) 文件,将以下占位符替换为相应的值。 以下命令生成的私钥使用具有 2048 位加密的 RSA 算法。

    {KeyFile}。 私钥文件的名称。

    openssl genpkey -out {KeyFile} -algorithm RSA -pkeyopt rsa_keygen_bits:2048
    
  2. 运行以下命令以生成 PKCS #10 证书签名请求 (CSR) 并创建 CSR (.csr) 文件,将以下占位符替换为相应的值。 在出现提示时,确保为自签名证书指定 IoT 设备的设备 ID。

    {KeyFile}。 私钥文件的名称。

    {CsrFile}。 CSR 文件的名称。

    {DeviceID}。 IoT 设备的名称。

    openssl req -new -key {KeyFile} -out {CsrFile}
    
    Country Name (2 letter code) [XX]:.
    State or Province Name (full name) []:.
    Locality Name (eg, city) [Default City]:.
    Organization Name (eg, company) [Default Company Ltd]:.
    Organizational Unit Name (eg, section) []:.
    Common Name (eg, your name or your server hostname) []:{DeviceID}
    Email Address []:.
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:.
    An optional company name []:.
    
  3. 运行以下命令以检查并验证你的 CSR,将以下占位符替换为相应的值。

    {CsrFile}。 证书文件的名称。

    openssl req -text -in {CsrFile} -verify -noout
    
  4. 运行以下命令以生成自签名证书并创建 PEM 编码的证书 (.crt) 文件,将以下占位符替换为相应的值。 该命令使用你的私钥转换 CSR 并为其签名,从而生成 365 天后过期的自签名证书。

    {KeyFile}。 私钥文件的名称。

    {CsrFile}。 CSR 文件的名称。

    {CrtFile}。 证书文件的名称。

    openssl x509 -req -days 365 -in {CsrFile} -signkey {KeyFile} -out {CrtFile}
    
  5. 运行以下命令以检索证书的指纹,将以下占位符替换为相应的值。 证书的指纹是该证书唯一的计算哈希值。 需要指纹才能在 IoT 中心配置 IoT 设备以进行测试。

    {CrtFile}。 证书文件的名称。

    openssl x509 -in {CrtFile} -noout -fingerprint
    

上传后手动验证证书

将根证书颁发机构 (CA) 证书或从属 CA 证书上传到 IoT 中心后,可以选择自动验证该证书。 如果未选择在上传过程中自动验证证书,则显示的证书的状态设置为“未验证”。 必须执行以下步骤来手动验证证书。

  1. 选择证书以查看“证书详细信息”对话框。

  2. 在对话框中选择“生成验证码”。

    屏幕截图显示证书详细信息对话框。

  3. 将验证码复制到剪贴板。 必须在后续步骤中将此验证码用作证书主题。 例如,如果验证码为 75B86466DA34D2B04C0C4C9557A119687ADAE7D4732BDDB3,则将其添加为证书使用者,如下一步所示。

  4. 你可以通过三种方式生成验证证书:

    • 如果使用 Microsoft 提供的 PowerShell 脚本,请运行 New-CACertsVerificationCert "<verification code>" 以创建名为 VerifyCert4.cer 的证书,并将 <verification code> 替换为以前生成的验证码。 有关详细信息,请参阅适用于 C 的 Azure IoT 中心设备 SDK 的 GitHub 存储库中的管理测试 CA 证书示例和教程

    • 如果你使用的是 Microsoft 提供的 Bash 脚本,请运行 ./certGen.sh create_verification_certificate "<verification code>" 以创建名为 verification-code.cert.pem 的证书,从而将 <verification code> 替换为之前生成的验证码。 有关详细信息,请参阅适用于 C 的 Azure IoT 中心设备 SDK 的 GitHub 存储库中的管理示例和教程的测试 CA 证书

    • 如果使用 OpenSSL 来生成证书,则必须先生成私钥,然后生成证书签名请求 (CSR) 文件。 在以下示例中,请将 <verification code> 替换为以前生成的验证码:

    openssl genpkey -out pop.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
    
    openssl req -new -key pop.key -out pop.csr
    
    -----
    Country Name (2 letter code) [XX]:.
    State or Province Name (full name) []:.
    Locality Name (eg, city) [Default City]:.
    Organization Name (eg, company) [Default Company Ltd]:.
    Organizational Unit Name (eg, section) []:.
    Common Name (eg, your name or your server hostname) []:<verification code>
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    

    然后,使用根 CA 或从属 CA 的相应配置文件以及 CSR 文件创建证书。 以下示例演示如何使用 OpenSSL 从根 CA 配置文件和 CSR 文件创建证书。

    openssl ca -config rootca.conf -in pop.csr -out pop.crt -extensions client_ext
    

    有关详细信息,请参阅教程 - 创建和上传用于测试的证书

  5. 在“证书详细信息”视图中选择新证书。

  6. 上载证书后,选择“验证”。 证书状态应更改为“已验证”。

更多信息

有关 X.509 证书以及如何在 IoT 中心使用它们的详细信息,请参阅以下文章: