

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用憑證提供者進行自我管理 AWS IoT Core 的憑證簽署
<a name="provisioning-cert-provider"></a>

您可以建立 AWS IoT Core 憑證提供者，在 AWS IoT 機群佈建中簽署憑證簽署請求 CSRs)。憑證提供者參考 Lambda 函數和 [`CreateCertificateFromCsr` MQTT API 進行機群佈建](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)。Lambda 函數接受 CSR 並傳回已簽署的用戶端憑證。

當您的 沒有憑證提供者時 AWS 帳戶，會在機群佈建中呼叫 [CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)，以從 CSR 產生憑證。建立憑證提供者之後，[CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 的行為會變更，而對此 MQTT API 的所有呼叫都會叫用憑證提供者來發出憑證。

透過 AWS IoT Core 憑證提供者，您可以實作解決方案，利用私有憑證授權單位 (CAs)，例如 [AWS 私有 CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)、其他公開信任CAs，或您自己的公有金鑰基礎設施 (PKI) 來簽署 CSR。此外，您可以使用憑證提供者自訂用戶端憑證的欄位，例如有效期間、簽署演算法、發行者和延伸項目。

**重要**  
每個 只能建立一個憑證提供者 AWS 帳戶。簽署行為變更適用於呼叫 [CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 的整個機群，直到您從 中刪除憑證提供者為止 AWS 帳戶。

**Topics**
+ [自我管理憑證簽署如何在機群佈建中運作](#provisioning-cert-provider-how-it-works)
+ [憑證提供者 Lambda 函數輸入](#provisioning-cert-provider-lambda-input)
+ [憑證提供者 Lambda 函數傳回值](#provisioning-cert-provider-lambda-return)
+ [Lambda 函數範例](#provisioning-cert-provider-lambda)
+ [機群佈建的自我管理憑證簽署](#provisioning-self-certificate-signing)
+ [AWS CLI 憑證提供者的 命令](#provisioning-cert-provider-cli)

## 自我管理憑證簽署如何在機群佈建中運作
<a name="provisioning-cert-provider-how-it-works"></a>

### 重要概念
<a name="provisioning-cert-provider-concepts"></a>

下列概念提供詳細資訊，可協助您了解自我管理憑證簽署如何在 AWS IoT 機群佈建中運作。如需詳細資訊，請參閱[使用機群佈建佈建沒有裝置憑證的裝置](https://docs.aws.amazon.com//iot/latest/developerguide/provision-wo-cert.html)。

**AWS IoT 機群佈建**  
透過機 AWS IoT 群佈建 （機群佈建的簡稱）， 會在 AWS IoT Core 裝置第一次連線至 時 AWS IoT Core ，產生並安全地將裝置憑證交付至您的裝置。您可以使用機群佈建來連接沒有裝置憑證的裝置 AWS IoT Core。

**憑證簽署請求 (CSR)**  
在機群佈建過程中，裝置 AWS IoT Core 會透過[機群佈建 MQTT APIs](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html) 向 發出請求。此請求包含憑證簽署請求 (CSR)，該請求將簽署以建立用戶端憑證。

**AWS 機群佈建中的受管憑證登入**  
AWS 受管是機群佈建中憑證簽署的預設設定。透過 AWS 受管憑證簽署， AWS IoT Core 將使用自己的 CAs簽署 CSRs。

**機群佈建中的自我管理憑證簽署**  
自我管理是在機群佈建中簽署憑證的另一個選項。透過自我管理憑證簽署，您可以建立 AWS IoT Core 憑證提供者來簽署 CSRs。您可以使用自我管理憑證簽署，透過 AWS 私有 CA、其他公開信任 CA 或您自己的公有金鑰基礎設施 (PKI) 產生的 CA 簽署 CSRs。

**AWS IoT Core 憑證提供者**  
AWS IoT Core 憑證提供者 （憑證提供者的簡稱） 是客戶管理的資源，用於在機群佈建中進行自我管理憑證簽署。

### 圖表
<a name="provisioning-cert-provider-diagram"></a>

下圖是自我認證簽署如何在機 AWS IoT 群佈建中運作的簡化說明。

![\[AWS IoT Core 機群佈建的憑證供應商\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/provisioning-cert-provider.png)

+ 當新的 IoT 裝置製造或引入機群時，它需要用戶端憑證才能進行自我驗證 AWS IoT Core。
+ 在機群佈建程序中，裝置會透過機[群佈建 MQTT APIs](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html) 向 提出用戶端憑證 AWS IoT Core 的請求。此請求包含憑證簽署請求 (CSR)。
+ AWS IoT Core 叫用憑證提供者，並將 CSR 做為輸入傳遞給提供者。
+ 憑證提供者會將 CSR 視為輸入，並發出用戶端憑證。

  對於 AWS 受管憑證簽署， 會使用自己的 CA AWS IoT Core 簽署 CSR 並發出用戶端憑證。
+ 使用發行的用戶端憑證，裝置會繼續機群佈建，並與 建立安全連線 AWS IoT Core。

## 憑證提供者 Lambda 函數輸入
<a name="provisioning-cert-provider-lambda-input"></a>

AWS IoT Core 當裝置向 Lambda 函數註冊時， 會將下列物件傳送至該函數。的值`certificateSigningRequest`是`CreateCertificateFromCsr`請求中提供的[隱私權增強郵件 (PEM) 格式](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-format.html)的 CSR。`principalId` 是在提出`CreateCertificateFromCsr`請求 AWS IoT Core 時用來連線 的委託人 ID。 `clientId`是 MQTT 連線的用戶端 ID 集。

```
{
	"certificateSigningRequest": "string",
	"principalId": "string",
	"clientId": "string"
}
```

## 憑證提供者 Lambda 函數傳回值
<a name="provisioning-cert-provider-lambda-return"></a>

Lambda 函數必須傳回包含 `certificatePem`值的回應。以下是成功回應的範例。 AWS IoT Core 將使用傳回值 (`certificatePem`) 來建立憑證。

```
{
	"certificatePem": "string"
}
```

如果註冊成功， `CreateCertificateFromCsr`會在`CreateCertificateFromCsr`回應`certificatePem`中傳回相同的 。如需詳細資訊，請參閱 [CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 的回應承載範例。

## Lambda 函數範例
<a name="provisioning-cert-provider-lambda"></a>

在建立憑證提供者之前，您必須建立 Lambda 函數來簽署 CSR。以下是 Python 中的 Lambda 函數範例。此函數 AWS 私有 CA 會使用私有 CA 和`SHA256WITHRSA`簽署演算法呼叫 來簽署輸入 CSR。傳回的用戶端憑證有效期為一年。如需 AWS 私有 CA 和如何建立私有 CA 的詳細資訊，請參閱[什麼是 AWS 私有 CA？](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)和[建立私有 CA](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)。

```
import os
import time
import uuid
import boto3

def lambda_handler(event, context):
    ca_arn = os.environ['CA_ARN']
    csr = (event['certificateSigningRequest']).encode('utf-8')

    acmpca = boto3.client('acm-pca')
    cert_arn = acmpca.issue_certificate(
        CertificateAuthorityArn=ca_arn, 
        Csr=csr,
        Validity={"Type": "DAYS", "Value": 365}, 
        SigningAlgorithm='SHA256WITHRSA',
        IdempotencyToken=str(uuid.uuid4())
    )['CertificateArn']
    
    # Wait for certificate to be issued
    time.sleep(1)    
    cert_pem = acmpca.get_certificate(
        CertificateAuthorityArn=ca_arn,
        CertificateArn=cert_arn
    )['Certificate']
    
    return {
        'certificatePem': cert_pem
    }
```

**重要**  
Lambda 函數傳回的憑證必須具有與憑證簽署請求 (CSR) 相同的主體名稱和公有金鑰。
Lambda 函數必須在 5 秒內完成執行。
Lambda 函數必須與憑證提供者資源位於相同的 AWS 帳戶 和 區域。
必須授予 AWS IoT 服務主體叫用 Lambda 函數的許可。為了避免[混淆代理人問題](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html)，建議您`sourceAccount`為調用許可設定 `sourceArn`和 。如需詳細資訊，請參閱[預防跨服務混淆代理人](https://docs.aws.amazon.com//iot/latest/developerguide/cross-service-confused-deputy-prevention.html)。

下列以資源為基礎的 [Lambda](https://docs.aws.amazon.com//lambda/latest/dg/access-control-resource-based.html) 政策範例 AWS IoT 會授予叫用 Lambda 函數的許可：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Id": "InvokePermission",
	"Statement": [
		{
			"Sid": "LambdaAllowIotProvider",
			"Effect": "Allow",
			"Principal": {
				"Service": "iot.amazonaws.com"
			},
			"Action": "lambda:InvokeFunction",
			"Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
			"Condition": {
				"StringEquals": {
					"AWS:SourceAccount": "123456789012"
				},
				"ArnLike": {
				"AWS:SourceArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider/my-certificate-provider"
				}
			}
		}
	]
}
```

## 機群佈建的自我管理憑證簽署
<a name="provisioning-self-certificate-signing"></a>

您可以使用 或 為機群佈建 AWS CLI 選擇自我管理憑證簽署 AWS 管理主控台。

### AWS CLI
<a name="provisioning-self-certificate-signing-cli"></a>

若要選擇自我管理憑證簽署，您必須建立 AWS IoT Core 憑證提供者以在機群佈建中簽署 CSRs。 會 AWS IoT Core 叫用憑證提供者，以 CSR 做為輸入並傳回用戶端憑證。若要建立憑證提供者，請使用 `CreateCertificateProvider` API 操作或 CLI `create-certificate-provider` 命令。

**注意**  
建立憑證提供者之後，機[`CreateCertificateFromCsr`群佈建 API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 的行為將會變更，因此 的所有呼叫`CreateCertificateFromCsr`都會叫用憑證提供者來建立憑證。建立憑證提供者之後，此行為可能需要幾分鐘的時間才能變更。

```
aws iot create-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-1 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

以下顯示此命令的範例輸出：

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

如需詳細資訊，請參閱 *AWS IoT* API `[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)` 參考中的 。 **

### AWS 管理主控台
<a name="provisioning-self-certificate-signing-console"></a>

若要使用 選擇自我管理憑證簽署 AWS 管理主控台，請遵循下列步驟：

1. 前往 [AWS IoT 主控台](https://console.aws.amazon.com//iot/home)。

1. 在左側導覽的 **安全性**下，選擇**憑證簽署**。

1. 在**憑證簽署**頁面的**憑證簽署詳細資訊**下，選擇**編輯憑證簽署方法**。

1. 在**編輯憑證簽署方法**頁面的**憑證簽署方法**下，選擇**自我管理**。

1. 在**自我管理設定**區段中，輸入憑證提供者的名稱，然後建立或選擇 Lambda 函數。

1. 選擇**更新憑證簽署**。

## AWS CLI 憑證提供者的 命令
<a name="provisioning-cert-provider-cli"></a>

### 建立憑證提供者
<a name="provisioning-create-cert-provider"></a>

若要建立憑證提供者，請使用 `CreateCertificateProvider` API 操作或 CLI `create-certificate-provider` 命令。

**注意**  
建立憑證提供者之後，機[`CreateCertificateFromCsr`群佈建 API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 的行為將會變更，因此 的所有呼叫`CreateCertificateFromCsr`都會叫用憑證提供者來建立憑證。建立憑證提供者之後，此行為可能需要幾分鐘的時間才能變更。

```
aws iot create-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-1 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

以下顯示此命令的範例輸出：

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

如需詳細資訊，請參閱 *AWS IoT* API `[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)` 參考中的 。 **

### 更新憑證提供者
<a name="provisioning-update-cert-provider"></a>

若要更新憑證提供者，請使用 `UpdateCertificateProvider` API 操作或 CLI `update-certificate-provider` 命令。

```
aws iot update-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-2 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

以下顯示此命令的範例輸出：

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

如需詳細資訊，請參閱 API `[UpdateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateCertificateProvider.html)` 參考中的 。 *AWS IoT** *

### 描述憑證提供者
<a name="provisioning-describe-cert-provider"></a>

若要描述憑證提供者，請使用 `DescribeCertificateProvider` API 操作或 CLI `describe-certificate-provider` 命令。

```
aws iot describe-certificate-provider --certificateProviderName my-certificate-provider
```

以下顯示此命令的範例輸出：

```
{
	"certificateProviderName": "my-certificate-provider",
	"lambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
	"accountDefaultForOperations": [
		"CreateCertificateFromCsr"
	],
	"creationDate": "2022-11-03T00:15",
	"lastModifiedDate": "2022-11-18T00:15"
}
```

如需詳細資訊，請參閱 *AWS IoT* API `[DescribeCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DescribeCertificateProvider.html)` 參考中的 。 **

### 刪除憑證提供者
<a name="provisioning-delete-cert-provider"></a>

若要刪除憑證提供者，請使用 `DeleteCertificateProvider` API 操作或 CLI `delete-certificate-provider` 命令。如果您刪除憑證提供者資源， 的行為`CreateCertificateFromCsr`將會繼續，並且 AWS IoT 會從 AWS IoT CSR 建立由 簽署的憑證。

```
aws iot delete-certificate-provider --certificateProviderName my-certificate-provider
```

此命令不會產生任何輸出。

如需詳細資訊，請參閱 *AWS IoT* API `[DeleteCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DeleteCertificateProvider.html)` 參考中的 。 **

### 列出憑證提供者
<a name="provisioning-list-cert-provider"></a>

若要列出 中的憑證提供者 AWS 帳戶，請使用 `ListCertificateProviders` API 操作或 CLI `list-certificate-providers` 命令。

```
aws iot list-certificate-providers
```

以下顯示此命令的範例輸出：

```
{
	"certificateProviders": [
		{
			"certificateProviderName": "my-certificate-provider",
			"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
		}
	]
}
```

如需詳細資訊，請參閱 *AWS IoT* API [https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html](https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html) 參考中的 。 **