使用 X.509 证书策略变量 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 X.509 证书策略变量

本主题提供有关如何使用证书策略变量的详细信息。X.509 证书策略变量对于您根据 X.509 证书属性创建授予权限的 Amazon IoT Core 策略至关重要。如果您的 X.509 证书不包含特定的证书属性,但在策略文档中使用了相应的证书策略变量,则策略评估可能会导致意外行为。这是因为缺少的策略变量不会在策略声明中进行评估。

X.509 证书示例

典型的 X.509 证书可能如下所示。此示例证书包括证书属性。在评估 Amazon IoT Core 策略期间,以下证书属性将填充为证书策略变量:Serial NumberIssuerSubjectX509v3 Issuer Alternative Name、和 X509v3 Subject Alternative Name

Certificate: Data: Version: 3 (0x2) Serial Number: 92:12:85:cb:b7:a5:e0:86 Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, O=IoT Devices, OU=SmartHome, ST=WA, CN=IoT Devices Primary CA, GN=Primary CA1/initials=XY/dnQualifier=Example corp, SN=SmartHome/ title=CA1/pseudonym=Primary_CA/generationQualifier=2/serialNumber=987 Validity Not Before: Mar 26 03:25:40 2024 GMT Not After : Apr 28 03:25:40 2025 GMT Subject: C=US, O=IoT Devices, OU=LightBulb, ST=NY, CN=LightBulb Device Cert, GN=Bulb/initials=ZZ/dnQualifier=Bulb001, SN=Multi Color/title=RGB/pseudonym=RGB Device/generationQualifier=4/serialNumber=123 Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: << REDACTED >> Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment X509v3 Subject Alternative Name: DNS:example.com, IP Address:1.2.3.4, URI:ResourceIdentifier001, email:device1@example.com, DirName:/C=US/O=IoT/OU=SmartHome/CN=LightBulbCert X509v3 Issuer Alternative Name: DNS:issuer.com, IP Address:5.6.7.8, URI:PrimarySignerCA, email:primary@issuer.com, DirName:/C=US/O=Issuer/OU=IoT Devices/CN=Primary Issuer CA Signature Algorithm: sha256WithRSAEncryption << REDACTED >>

使用证书颁发者属性作为证书策略变量

下表详细说明了如何在 Amazon IoT Core 策略中填充证书颁发者属性。

要在策略中填充的颁发者属性
证书颁发者属性 证书策略变量
  • C=US

  • O=IoT Devices

  • OU= SmartHome

  • ST=WA

  • CN=IoT Devices Primary CA

  • gn=主要 CA1

  • initials=XY

  • dnQualifier=Example corp

  • SN= SmartHome

  • 标题= CA1

  • pseudonym=Primary_CA

  • generationQualifier=2

  • serialNumber=987

  • iot:Certificate.Issuer.Country = US

  • iot:Certificate.Issuer.Organization = IoT Devices

  • iot:Certificate.Issuer.OrganizationalUnit = SmartHome

  • iot:Certificate.Issuer.State = WA

  • iot:Certificate.Issuer.CommonName = IoT Devices Primary CA

  • iot:Certificate.Issuer.GivenName = Primary CA1

  • iot:Certificate.Issuer.initials = XY

  • iot:Certificate.Issuer.DistinguishedNameQualifier = Example corp

  • iot:Certificate.Issuer.Surname = SmartHome

  • iot:Certificate.Issuer.Title = CA1

  • iot:Certificate.Issuer.Pseudonym = Primary_CA

  • iot:Certificate.Issuer.GenerationQualifier = 2

  • iot:Certificate.Issuer.SerialNumber = 987

使用证书主题属性作为证书策略变量

下表详细说明了如何在 Amazon IoT Core 策略中填充证书主题属性。

要在策略中填充的主题属性
证书主题属性 证书策略变量
  • C=US

  • O=IoT Devices

  • ST=NY

  • CN= LightBulb 设备证书

  • GN=Bulb

  • initials=ZZ

  • dnQualifier=Bulb001

  • SN=Multi Color

  • title=RGB

  • pseudonym=RGB Device

  • generationQualifier=4

  • serialNumber=123

  • iot:Certificate.Subject.Country = US

  • iot:Certificate.Subject.Organization = IoT Devices

  • iot:Certificate.Subject.State = NY

  • iot:Certificate.Subject.CommonName = LightBulb Device Cert

  • iot:Certificate.Subject.GivenName = Bulb

  • iot:Certificate.Subject.initials = ZZ

  • iot:Certificate.Subject.DistinguishedNameQualifier = Bulb001

  • iot:Certificate.Subject.Surname = Multi Color

  • iot:Certificate.Subject.Title = RGB

  • iot:Certificate.Subject.Pseudonym = RGB Device

  • iot:Certificate.Subject.GenerationQualifier = 4

  • iot:Certificate.Subject.SerialNumber = 123

使用证书颁发者备用名称属性作为证书策略变量

下表详细说明了如何在 Amazon IoT Core 策略中填充证书颁发者备用名称属性。

要在策略中填充的颁发者备用名称属性
X509v3 颁发者备用名称 策略中的属性
  • DNS:issuer.com

  • IP Address:5.6.7.8

  • URI:PrimarySignerCA

  • email:primary@issuer.com

  • DirName: /C= US/O=Issuer/OU=IoT Devices/CN =主要发行人 CA

  • iot:Certificate.Issuer.AlternativeName.DNSName = issuer.com

  • iot:Certificate.Issuer.AlternativeName.IPAddress = 5.6.7.8

  • iot:Certificate.Issuer.AlternativeName.UniformResourceIdentifier = PrimarySignerCA

  • iot:Certificate.Issuer.AlternativeName.RFC822Name = primary@issuer.com

  • iot:Certificate.Issuer.AlternativeName.DirectoryName = cn=Primary Issuer CA,ou=IoT Devices,o=Issuer,c=US

使用证书主题备用名称属性作为证书策略变量

下表详细说明了如何在 Amazon IoT Core 策略中填充证书主题备用名称属性。

要在策略中填充的主题备用名称属性
X509v3 主题备用名称 策略中的属性
  • DNS:example.com

  • IP Address:1.2.3.4

  • URI:ResourceIdentifier001

  • email:device1@example.com

  • DirName: /C= = US/O=IoT/OU=SmartHome/CN LightBulbCert

  • iot:Certificate.Subject.AlternativeName.DNSName = example.com

  • iot:Certificate.Subject.AlternativeName.IPAddress = 1.2.3.4

  • iot:Certificate.Subject.AlternativeName.UniformResourceIdentifier = ResourceIdentifier001

  • iot:Certificate.Subject.AlternativeName.RFC822Name = device1@example.com

  • iot:Certificate.Subject.AlternativeName.DirectoryName = cn=LightBulbCert,ou=SmartHome,o=IoT,c=US

使用其他证书属性作为证书策略变量

下表详细介绍了如何在 Amazon IoT Core 策略中填充其他证书属性。

要在策略中填充的其他属性
其他证书属性 证书策略变量

Serial Number: 92:12:85:cb:b7:a5:e0:86

iot:Certificate.SerialNumber = 10525622389124227206

X.509 证书策略变量限制

以下限制适用于 X.509 证书策略变量:

缺少的策略变量

如果您的 X.509 证书不包含特定的证书属性,但在策略文档中使用了相应的证书策略变量,则策略评估可能会导致意外行为。这是因为缺少的策略变量不会在策略声明中进行评估。

证书 SerialNumber 格式

Amazon IoT Core 将证书序列号视为十进制整数的字符串表示形式。例如,如果策略只允许使用与证书序列号匹配的客户端 ID 进行连接,则客户端 ID 必须是十进制格式的序列号。

通配符

如果证书属性中有通配符,则策略变量不会由证书属性值替换。这将会在策略文档中保留 ${policy-variable} 文本。这可能会导致授权失败。可以使用以下通配符:*$+?#

数组字段

包含数组的证书属性限制为五项。其它的项将被忽略。

字符串长度

所有字符串值的长度限制为 1024 个字符。如果证书属性包含超过 1024 个字符的字符串,则策略变量不会由证书属性值替换。这将会在策略文档中保留 ${policy-variable}。这可能会导致授权失败。

特殊字符

在策略变量中使用时,任何特殊字符(例如 ,"\+=<>;)都必须使用反斜杠 (\) 作为前缀。例如,Amazon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US 改为 Amazon Web Service O\=Amazon.com Inc. L\=Seattle ST\=Washington C\=US

使用证书策略变量的策略示例

以下策略文档允许使用与证书序列号匹配的客户端 ID 进行连接,并允许发布到与下列模式匹配的主题:${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*

重要

如果您的 X.509 证书不包含特定的证书属性,但在策略文档中使用了相应的证书策略变量,则策略评估可能会导致意外行为。这是因为缺少的策略变量不会在策略声明中进行评估。例如,如果您将以下策略文档附加到不包含 iot:Certificate.Subject.Organization 属性的证书,则在策略评估期间将不会填充 iot:Certificate.Subject.Organization 证书策略变量。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Certificate.SerialNumber}" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*" ] } ] }

您也可以使用 Null 条件运算符来确保在策略评估期间填充策略中所用的证书策略变量。以下策略文档仅在存在证书序列号和证书主题公用名属性时才允许在证书中使用 iot:Connect

所有证书策略变量都具有字符串值,因此支持所有字符串条件运算符

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/*" ], "Condition": { "Null": { "iot:Certificate.SerialNumber": "false", "iot:Certificate.Subject.CommonName": "false" } } } ] }