<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wesley Wong</title>
    <description>The latest articles on DEV Community by Wesley Wong (@wesley_wong_21f35bb258df3).</description>
    <link>https://dev.to/wesley_wong_21f35bb258df3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4131819%2Fbf0a615f-530b-4a1f-86b6-12a2a9068f39.png</url>
      <title>DEV Community: Wesley Wong</title>
      <link>https://dev.to/wesley_wong_21f35bb258df3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wesley_wong_21f35bb258df3"/>
    <language>en</language>
    <item>
      <title>AWS IoT: Step by step guide on fleet provisioning with CSR using ESP32-S3</title>
      <dc:creator>Wesley Wong</dc:creator>
      <pubDate>Sat, 19 Sep 2026 09:21:44 +0000</pubDate>
      <link>https://dev.to/wesley_wong_21f35bb258df3/aws-iot-step-by-step-guide-on-fleet-provisioning-with-csr-using-esp32-s3-2pjk</link>
      <guid>https://dev.to/wesley_wong_21f35bb258df3/aws-iot-step-by-step-guide-on-fleet-provisioning-with-csr-using-esp32-s3-2pjk</guid>
      <description>&lt;h3&gt;
  
  
  1. Introduction: Fleet provisioning with CSR
&lt;/h3&gt;

&lt;p&gt;Fleet provisioning is a secure method where an IoT device generates its own private key locally and sends a CSR to AWS to obtain a uniquely signed X.509 client certificate upon its first connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Key Generation&lt;/strong&gt;: The device creates its own private key and a CSR on the device itself. The private key never leaves the device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initial Connection&lt;/strong&gt;: The device connects to AWS IoT Core using a temporary mechanism (such as a provisioning claim certificate).
Signing Request: The device sends an MQTT request containing the CSR via the CreateCertificateFromCsr API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certificate Issuance&lt;/strong&gt;: AWS IoT Core signs the CSR—either using an AWS-managed CA or a self-managed certificate provider linked to an external PKI or AWS Private CA—and returns the signed certificate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registration &amp;amp; Activation&lt;/strong&gt;: Using a provisioning template, AWS IoT registers the "Thing," attaches security policies, and activates the certificate for normal operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Security&lt;/strong&gt;: The private key is generated on the device and is never transmitted over the network or exposed during manufacturing. It is also ideal for hardware that uses a secure element where private keys cannot be imported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Certificate Authorities&lt;/strong&gt;: Enables self-managed signing so you can use your own Public Key Infrastructure (PKI) or custom validity periods and algorithms instead of relying solely on AWS-managed certificates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1xjn6arfkj0a9ewln4u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1xjn6arfkj0a9ewln4u.jpg" alt="Fleet provisioning flow" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Fleet provisioning with CSR using ESP32-S3
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;2.1 My Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu 26.04 LTS&lt;/li&gt;
&lt;li&gt;ESP32-S3-WROOM-1-N16R8&lt;/li&gt;
&lt;li&gt;esp-idf v5.5.5

&lt;ul&gt;
&lt;li&gt;Please refer to the installation guide provided at this &lt;a href="https://docs.espressif.com/projects/esp-idf/en/v5.5.5/esp32/get-started/index.html" rel="noopener noreferrer"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;esp-aws-iot 202406.05-LTS-release

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git clone -b "202406.05-LTS-release" --recursive https://github.com/espressif/esp-aws-iot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The folder structure of this demo would be:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esp/
├── esp-aws-iot/
│   └── examples/
│       └── fleet_provisioning/
│           └── fleet_provisioning_with_csr/
│
└── esp-idf/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;2.2 Build the example&lt;/strong&gt;&lt;br&gt;
Execute the following commands sequentially to verify that the setup is properly configured.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;esp/esp-idf
&lt;span class="nb"&gt;.&lt;/span&gt; ./export.sh
&lt;span class="nb"&gt;cd
cd &lt;/span&gt;esp/esp-aws-iot/examples/fleet_provisioning/fleet_provisioning_with_csr
idf.py set-target esp32s3
idf.py build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;2.3 Create the provision policy&lt;/strong&gt;&lt;br&gt;
An AWS provisioning policy defines the permissions and rules used to automate, control, and secure the creation of cloud resources, accounts, or connected devices.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In AWS IoT panel, navigate to Security &amp;gt; Policies &amp;gt; Create policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6mkiqwo16yjkh6qpkr5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6mkiqwo16yjkh6qpkr5i.png" alt="AwsIot_Create_Policy" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter a policy name (e.g., FleetProvTestPolicy), and then select 'JSON' from the policy statements options.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv3skbrta2fp181j64zxs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv3skbrta2fp181j64zxs.png" alt="AwsIot_Edit_Policy" width="799" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste below JSON content into the policy document. [aws-region], [aws-account-id] and [template-name] should be changed according to your setup. For example:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;arn:aws:iot:eu-west-1:123456789012:topic/$aws/provisioning-templates/FleetProvTestTemplate/provision/*&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"iot:Connect"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"iot:Publish"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"iot:Receive"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iot:[aws-region]:[aws-account-id]:topic/$aws/certificates/create-from-csr/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iot:[aws-region]:[aws-account-id]:topic/$aws/provisioning-templates/[template-name]/provision/*"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iot:Subscribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iot:[aws-region]:[aws-account-id]:topicfilter/$aws/certificates/create-from-csr/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iot:[aws-region]:[aws-account-id]:topicfilter/$aws/provisioning-templates/[template-name]/provision/*"&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;2.4 Create claim certificate&lt;/strong&gt;&lt;br&gt;
A claim certificate in AWS IoT Core Fleet Provisioning is a shared, bootstrap X.509 certificate and private key pre-installed on devices during manufacturing to let them connect to AWS IoT for the first time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In AWS IoT Core, navigate to Security &amp;gt; Certificates &amp;gt; Add certificate &amp;gt; Create certificate&lt;/li&gt;
&lt;li&gt;Select "Auto-generate new certificate (recommended)" and set the status to "Active". Click "Create".&lt;/li&gt;
&lt;li&gt;Click "Download all".&lt;/li&gt;
&lt;li&gt;Copy downloaded private key and cert content into "claim_private.key" and "claim_cert.crt" in folder "fleet_provisioning_with_csr/spiffs_image/certs"&lt;/li&gt;
&lt;li&gt;Select the certificate you created. Click "Attach policies", choose your provisioning policy (&lt;strong&gt;FleetProvTestPolicy&lt;/strong&gt;), and click "Attach policy"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1prejwmgbg874f0rjr82.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1prejwmgbg874f0rjr82.png" alt="AwsIot_Attach_Policy" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;2.5 Create IAM role for fleet provisioning&lt;/strong&gt;&lt;br&gt;
An IAM role in AWS IoT Fleet Provisioning is needed because the AWS IoT service itself needs permission to create, configure, and register resources (like Things, certificates, and policies) on your behalf inside your AWS account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In IAM dashboard, navigate to Access Management &amp;gt; Roles. Click "Create role"&lt;/li&gt;
&lt;li&gt;Select "AWS service" in trust entity type. &lt;/li&gt;
&lt;li&gt;Select "IoT" in use case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynzt99gb8311nqxb17cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynzt99gb8311nqxb17cd.png" alt="AwsIot_Create_IAM_Role" width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click "Next" &amp;gt; "Next"&lt;/li&gt;
&lt;li&gt;Name the role. e.g: &lt;strong&gt;FleetProvRole&lt;/strong&gt; and then click "create role"&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;2.6 Create thing policy&lt;/strong&gt;&lt;br&gt;
A thing policy is needed because device thing would be created during fleet provisioning. It would be attached thing policy. Please refer to section 2.3 on how to create policy. You could use your own thing policy or copy below general policy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iot:Subscribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iot:Connect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iot:Receive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iot:Publish"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;2.7 Create provisioning template&lt;/strong&gt;&lt;br&gt;
A provisioning template is a JSON document that uses parameters to describe the resources your device must use to interact with AWS IoT. A provisioning template contains two sections: Parameters and Resources. There are two types of provisioning templates in AWS IoT. One is used for just-in-time provisioning (JITP) and bulk registration, and the second is used for fleet provisioning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In AWS IoT core, navigate to Connect &amp;gt; Connect to many devices &amp;gt; Provisioning templates&lt;/li&gt;
&lt;li&gt;Click "Create provisioning template"&lt;/li&gt;
&lt;li&gt;Select "Provisioning devices with claim certificates" and the click "Next"&lt;/li&gt;
&lt;li&gt;Follow pictures below to configure the template

&lt;ul&gt;
&lt;li&gt;Select "Active" in Provisioning template status.&lt;/li&gt;
&lt;li&gt;Select the IAM role created in section 2.5 in Provisioning role.&lt;/li&gt;
&lt;li&gt;Select the fleet provisioning policy created in section 2.3 in Claim certificate policy.&lt;/li&gt;
&lt;li&gt;Check the certificate created in section 2.4 in Claim certificates.&lt;/li&gt;
&lt;li&gt;Click "Next"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwcw97fbjvuj0cini7da.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwcw97fbjvuj0cini7da.png" alt="AwsIot_Create_PT1" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9t5six15o251bn1aeo0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9t5six15o251bn1aeo0v.png" alt="AwsIot_Create_PT2" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select "Don't use a pre-provisioning action", enable "Automatically create a thing resource when provisioning a device" and then click "Next"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frhqrbgijwqfje5zu6yw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frhqrbgijwqfje5zu6yw7.png" alt="AwsIot_Create_PT3" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the thing policy created in section 2.6 and then click "Next"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b39zp1wj9v5krhfqsag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b39zp1wj9v5krhfqsag.png" alt="AwsIot_Create_PT4" width="798" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the details and then click "Create template"&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;2.8 Config demo example program&lt;/strong&gt;&lt;br&gt;
2.8.1 Wifi router setup&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter your router setting (SSID and password) in menuconfig &amp;gt; Example Connection Configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg982rm849zn10vtx7il2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg982rm849zn10vtx7il2.png" alt="ESP32_Config_Wifi" width="471" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.8.2 AWS setup&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In AWS IoT core &amp;gt; Domain configurations, you could find the domain name.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mntvsjh9xl8kkb00cux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mntvsjh9xl8kkb00cux.png" alt="ESP32_Config_Aws1" width="799" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to AWS setup by menuconnfig &amp;gt; Example configuration.&lt;/li&gt;
&lt;li&gt;Copy and paste the domain name into "Endpoint of the MQTT broker to connect to".&lt;/li&gt;
&lt;li&gt;Paste the template name created in section 2.7 into "Name of the provisioning template".&lt;/li&gt;
&lt;li&gt;Set the device serial number, e.g: &lt;strong&gt;FleetProvTestThing&lt;/strong&gt;. This would be the name of thing created during fleet provisioning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F54d8xya09gjpqu61lzes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F54d8xya09gjpqu61lzes.png" alt="ESP32_Config_Aws2" width="762" height="251"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2.9 Build, flash and run demo example&lt;/strong&gt;&lt;br&gt;
After successful fleet provisioning, "FleetProvTestThing" thing should be created in AWS IoT core.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8idlaail9cqtude2pli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8idlaail9cqtude2pli.png" alt="Result1" width="799" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbajd5pgjdp90ed465h78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbajd5pgjdp90ed465h78.png" alt="Result2" width="800" height="141"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Demo source code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/WesleyWKH/awsiot_fleet_provisioning_with_csr" rel="noopener noreferrer"&gt;awsiot_fleet_provisioning_with_csr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>esp32</category>
      <category>awsiot</category>
      <category>iot</category>
      <category>provisioning</category>
    </item>
  </channel>
</rss>
