

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

# 使用 X.509 证书策略变量
<a name="use-policy-variables"></a>

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

**Topics**
+ [X.509 证书示例](#certificate-example)
+ [使用证书颁发者属性作为证书策略变量](#issuer-attributes-policy)
+ [使用证书主题属性作为证书策略变量](#subject-attributes-policy)
+ [使用证书颁发者备用名称属性作为证书策略变量](#issuer-alternate-name-attributes-policy)
+ [使用证书主题备用名称属性作为证书策略变量](#subject-alternate-name-attributes-policy)
+ [使用其他证书属性作为证书策略变量](#other-attributes-policy)
+ [X.509 证书策略变量限制](#policy-limits)
+ [使用证书策略变量的策略示例](#example-attributes-policy)

## X.509 证书示例
<a name="certificate-example"></a>

典型的 X.509 证书可能如下所示。此示例证书包括证书属性。在评估 Amazon IoT Core 策略期间，以下证书属性将填充为证书策略变量：`Serial Number`、`Issuer`、`Subject`、`X509v3 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 >>
```

## 使用证书颁发者属性作为证书策略变量
<a name="issuer-attributes-policy"></a>

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


**要在策略中填充的颁发者属性**  

| 证书颁发者属性 | 证书策略变量 | 
| --- | --- | 
|  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  |  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用证书主题属性作为证书策略变量
<a name="subject-attributes-policy"></a>

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


**要在策略中填充的主题属性**  

| 证书主题属性 | 证书策略变量 | 
| --- | --- | 
|  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  |  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用证书颁发者备用名称属性作为证书策略变量
<a name="issuer-alternate-name-attributes-policy"></a>

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


**要在策略中填充的颁发者备用名称属性**  

| X509v3 颁发者备用名称 | 策略中的属性 | 
| --- | --- | 
|  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  |  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用证书主题备用名称属性作为证书策略变量
<a name="subject-alternate-name-attributes-policy"></a>

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


**要在策略中填充的主题备用名称属性**  

| X509v3 主题备用名称 | 策略中的属性 | 
| --- | --- | 
|  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  |  [See the AWS documentation website for more details](http://docs.amazonaws.cn/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用其他证书属性作为证书策略变量
<a name="other-attributes-policy"></a>

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


**要在策略中填充的其他属性**  

| 其他证书属性 | 证书策略变量 | 
| --- | --- | 
| `Serial Number: 92:12:85:cb:b7:a5:e0:86` | `iot:Certificate.SerialNumber = 10525622389124227206` | 

## X.509 证书策略变量限制
<a name="policy-limits"></a>

以下限制适用于 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`。

## 使用证书策略变量的策略示例
<a name="example-attributes-policy"></a>

以下策略文档允许使用与证书序列号匹配的客户端 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 条件运算符](https://docs.amazonaws.cn//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)来确保在策略评估期间填充策略中所用的证书策略变量。以下策略文档仅在存在证书序列号和证书主题公用名属性时才允许在证书中使用 `iot:Connect`。

所有证书策略变量都具有字符串值，因此支持所有[字符串条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)。

****  

```
{
	"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"
				}
			}
		}
	]
}
```