

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Aprovisionamiento de dispositivos
<a name="iot-provision"></a>

AWS proporciona varias formas diferentes de aprovisionar un dispositivo e instalar certificados de cliente únicos en él. En esta sección se describe cada forma y cómo seleccionar la mejor para su solución de IoT. Estas opciones se describen en detalle en el documento técnico titulado [Fabricación y aprovisionamiento de dispositivos con certificados X.509](https://docs.aws.amazon.com/whitepapers/latest/device-manufacturing-provisioning/device-manufacturing-provisioning.html) en AWS IoT Core. 

**Seleccionar la opción que mejor se adapte a su situación**
+ 

**Puede instalar certificados en dispositivos de IoT antes de que se entreguen**  
Si puede instalar de forma segura certificados de cliente únicos en sus dispositivos de IoT antes de que se entreguen para su uso por el usuario final, querrá usar el [*just-in-time*aprovisionamiento (JITP)](jit-provisioning.md) o el [*just-in-time*registro (JITR](auto-register-device-cert.md)).

  Con el JITP y el JITR, la autoridad de certificación (CA) utilizada para firmar el certificado del dispositivo se registra AWS IoT y se reconoce AWS IoT cuando el dispositivo se conecta por primera vez. El dispositivo se aprovisiona AWS IoT en su primera conexión mediante los detalles de su plantilla de aprovisionamiento.

  Para obtener más información sobre el aprovisionamiento de un solo objeto, el aprovisionamiento JITP, el aprovisionamiento JITR y el aprovisionamiento masivo de dispositivos con certificados únicos, consulte [Aprovisionamiento de dispositivos que tienen certificados de dispositivo](provision-w-cert.md).
+ 

**Los usuarios finales o los instaladores pueden usar una aplicación para instalar certificados en sus dispositivos de IoT**  
Si no puede instalar de forma segura certificados únicos de cliente en su dispositivo de IoT antes de entregarlos al usuario final, pero el usuario final o un instalador pueden usar una aplicación para registrar los dispositivos e instalar los certificados de dispositivo únicos, es recomendable utilizar el proceso de [aprovisionamiento por usuario de confianza](provision-wo-cert.md#trusted-user).

  El uso de un usuario de confianza, como un usuario final o un instalador con una cuenta conocida, puede simplificar el proceso de fabricación del dispositivo. En lugar de un certificado de cliente único, los dispositivos tienen un certificado temporal que permite al dispositivo conectarse solo AWS IoT durante 5 minutos. Durante ese periodo de 5 minutos, el usuario de confianza obtiene un certificado de cliente único con una vida útil más larga y lo instala en el dispositivo. La vida útil limitada del certificado de reclamación minimiza el riesgo de que el certificado se vea comprometido.

  Para obtener más información, consulte [Aprovisionamiento por usuario de confianza](provision-wo-cert.md#trusted-user).
+ 

**Los usuarios finales NO PUEDEN usar una aplicación para instalar certificados en sus dispositivos de IoT**  
Si ninguna de las opciones anteriores funciona en su solución de IoT, el proceso de [aprovisionamiento por reclamación](provision-wo-cert.md#claim-based) es una opción. Con este proceso, sus dispositivos de IoT disponen de un certificado de reclamación que comparten otros dispositivos de la flota. La primera vez que un dispositivo se conecta con un certificado de reclamación, lo AWS IoT registra mediante su plantilla de aprovisionamiento y emite al dispositivo su certificado de cliente exclusivo para poder acceder a AWS IoTél posteriormente.

   Esta opción permite el aprovisionamiento automático de un dispositivo cuando se conecta a él AWS IoT, pero podría suponer un riesgo mayor en caso de que el certificado de reclamación se viera comprometido. Si un certificado de reclamación se ve comprometido, puede desactivarlo. La desactivación del certificado de reclamación impide que todos los dispositivos con ese certificado de reclamación se registren en el futuro. Sin embargo, la desactivación del certificado de reclamación no bloquea los dispositivos que ya se han aprovisionado.

  Para obtener más información, consulte [Aprovisionamiento por reclamación](provision-wo-cert.md#claim-based).

## Aprovisionamiento de dispositivos en AWS IoT
<a name="provisioning-in-iot"></a>

Al aprovisionar un dispositivo AWS IoT, debe crear recursos para que sus dispositivos y AWS IoT puedan comunicarse de forma segura. Se pueden crear otros recursos que le ayuden a administrar su flota de dispositivos. Durante el proceso de aprovisionamiento se pueden crear los siguientes recursos: 
+ Un objeto de IoT.

  Las cosas de IoT son entradas en el registro de AWS IoT dispositivos. Cada objeto tiene un nombre único y un conjunto de atributos, y está asociado con un dispositivo físico. Los objetos se pueden definir usando un tipo de objeto o agruparse en grupos de objetos. Para obtener más información, consulte [Administrar dispositivos con AWS IoT](iot-thing-management.md).

   Aunque no es necesario, la creación de objetos permite administrar la flota de dispositivos de manera más eficaz mediante la búsqueda de dispositivos por tipo de objeto, grupo de objetos y atributos de objetos. Para obtener más información, consulte [Indexación de flotas](iot-indexing.md).
**nota**  
Para indexar los datos de estado de conectividad de su objeto, aprovisione su objeto y configúrelo de manera que el nombre del objeto coincida con el ID de cliente utilizado en la solicitud Connect.
+ Un certificado X.509

  Los dispositivos utilizan certificados X.509 para realizar la autenticación mutua. AWS IoT Puede registrar un certificado existente o hacer que AWS IoT genere y registre uno nuevo para usted. Un certificado se asocia a un dispositivo asociándolo al objeto que representa el dispositivo. También debe copiar el certificado y la clave privada asociada en el dispositivo. Los dispositivos presentan el certificado cuando se conectan a AWS IoT. Para obtener más información, consulte [Autenticación](authentication.md).
+ Una política de IoT

  Las políticas de IoT definen qué operaciones puede realizar un dispositivo en AWS IoT. Las políticas de IoT se asocian a certificados de dispositivo. Cuando un dispositivo presenta el certificado AWS IoT, se le conceden los permisos especificados en la política. Para obtener más información, consulte [Autorización](iot-authorization.md). Cada dispositivo necesita un certificado para comunicarse con AWS IoT.

AWS IoT admite el aprovisionamiento automatizado de flotas mediante plantillas de aprovisionamiento. Las plantillas de aprovisionamiento describen los recursos necesarios para AWS IoT aprovisionar el dispositivo. Las plantillas contienen variables que permiten utilizar una plantilla para aprovisionar varios dispositivos. Cuando aprovisione un dispositivo, especifique valores para las variables específicas de este utilizando un diccionario o *mapa*. Para aprovisionar otro dispositivo, especifique nuevos valores en el diccionario.

Puede utilizar el aprovisionamiento automatizado tanto si sus dispositivos tienen certificados únicos (y su clave privada asociada) como si no.

## Aprovisionamiento de flota APIs
<a name="provisioning-apis"></a>

Existen varias categorías que se APIs utilizan en el aprovisionamiento de flotas:
+ Estas funciones de plano de control crean y administran las plantillas de aprovisionamiento de flotas y configuran políticas de usuario de confianza.
  + [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)
  + [ CreateProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplateVersion.html)
  + [DeleteProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteProvisioningTemplate.html)
  + [DeleteProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteProvisioningTemplateVersion.html)
  + [DescribeProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeProvisioningTemplate.html)
  + [DescribeProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeProvisioningTemplateVersion.html)
  + [ListProvisioningTemplates](https://docs.aws.amazon.com/iot/latest/apireference/API_ListProvisioningTemplates.html)
  + [ListProvisioningTemplateVersions](https://docs.aws.amazon.com/iot/latest/apireference/API_ListProvisioningTemplateVersions.html)
  + [UpdateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateProvisioningTemplate.html)
+ Los usuarios de confianza pueden utilizar esta función de plano de control para generar una notificación de incorporación temporal. Esta reclamación temporal se pasa al dispositivo durante la configuración de wifi o un método similar.
  + [CreateProvisioningClaim](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningClaim.html)
+ La API MQTT utilizada durante el proceso de aprovisionamiento por los dispositivos con un certificado de notificación de aprovisionamiento incrustado en un dispositivo o pasado a él por un usuario de confianza.
  + [CreateCertificateFromCsr](fleet-provision-api.md#create-cert-csr)
  + [CreateKeysAndCertificate](fleet-provision-api.md#create-keys-cert)
  + [RegisterThing](fleet-provision-api.md#register-thing)

# Aprovisionamiento de dispositivos que no tienen certificados de dispositivo mediante el aprovisionamiento de flotas
<a name="provision-wo-cert"></a>

Al utilizar el aprovisionamiento de AWS IoT flotas, AWS IoT puede generar y entregar de forma segura certificados de dispositivos y claves privadas a sus dispositivos cuando se conectan a ellos AWS IoT por primera vez. AWS IoT proporciona certificados de cliente firmados por la autoridad de certificación (CA) raíz de Amazon.

Existen dos formas de utilizar el aprovisionamiento de flotas:
+ [Aprovisionamiento por reclamación](#claim-based)
+ [Aprovisionamiento por usuario de confianza](#trusted-user)

## Aprovisionamiento por reclamación
<a name="claim-based"></a>

Los dispositivos se pueden fabricar con un certificado de notificación de aprovisionamiento y una clave privada (que son credenciales de uso especial) incrustados. Si estos certificados están registrados AWS IoT, el servicio puede cambiarlos por certificados de dispositivo únicos que el dispositivo puede usar para sus operaciones habituales. El proceso consta de los pasos siguientes:

**Antes de entregar el dispositivo**

1. Llame a [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html) para crear una plantilla de aprovisionamiento. Esta API devuelve un ARN de plantilla. Para obtener más información, consulte [API de MQTT de aprovisionamiento de dispositivos](fleet-provision-api.md).

   También puede crear una plantilla de aprovisionamiento de flota en la AWS IoT consola. 

   1. En el panel de navegación, seleccione el menú desplegable **Conectar muchos dispositivos**. A continuación, elija **Conectar muchos dispositivos**.

   1. Seleccione **Crear plantilla de aprovisionamiento**.

   1. Elija la opción **Situación de aprovisionamiento** que mejor se adapte a los procesos de instalación. A continuación, elija **Siguiente**.

   1. Complete el flujo de trabajo de la plantilla.

1. Cree los certificados y las claves privadas asociadas que se utilizarán como certificados de reclamación de aprovisionamiento.

1. Registre estos certificados AWS IoT y asocie una política de IoT que restrinja el uso de los certificados. El siguiente ejemplo de política de IoT restringe el uso del certificado asociado a esta política para aprovisionar dispositivos.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Connect"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Receive"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topic/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topic/$aws/provisioning-templates/templateName/provision/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/provisioning-templates/templateName/provision/*"
               ]
           }
       ]
   }
   ```

1. Al aprovisionar dispositivos, otorga al AWS IoT servicio permiso para crear o actualizar recursos de IoT, como cosas y certificados, en tu cuenta. Para ello, asocie la política `AWSIoTThingsRegistration` gestionada a una función de IAM (denominada función de aprovisionamiento) que confíe en el principal del servicio. AWS IoT 

1. Fabricar el dispositivo con el certificado de reclamación de aprovisionamiento incrustado de forma segura en él.

El dispositivo ya está listo para ser entregado a donde se instalará para su uso.

**importante**  
Las claves privadas de la notificación de aprovisionamiento deben estar protegidas en todo momento, también en el dispositivo. Le recomendamos que utilice AWS IoT CloudWatch métricas y registros para supervisar los indicios de uso indebido. Si detecta un uso incorrecto, desactive el certificado de reclamación de aprovisionamiento para que no se pueda utilizar para el aprovisionamiento de dispositivos.

**Para inicializar el dispositivo para su uso**

1. El dispositivo lo utiliza [SDK de dispositivos, SDK para móviles y cliente de dispositivo de AWS IoT](iot-sdks.md) para conectarse y autenticarse AWS IoT con el certificado de notificación de aprovisionamiento que está instalado en el dispositivo.
**nota**  
Por motivos de seguridad, el `certificateOwnershipToken` devuelto por `CreateCertificateFromCsr` y `CreateKeysAndCertificate` caduca al cabo de una hora. Debe llamarse a `RegisterThing` antes de que `certificateOwnershipToken` venza. Si el certificado creado por `CreateCertificateFromCsr` o `CreateKeysAndCertificate` no se ha activado y no se ha asociado a una política o a un objeto en el momento de caducar el token, el certificado se eliminará. Si el token caduca, el dispositivo puede volver a llamar a `CreateCertificateFromCsr` o a `CreateKeysAndCertificate` para generar un nuevo certificado.

1. El dispositivo obtiene un certificado permanente y una clave privada mediante una de estas opciones. El dispositivo utilizará el certificado y la clave para todas las autenticaciones futuras AWS IoT.

   1. Llame [`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)para crear un certificado y una clave privada nuevos mediante la autoridad de AWS certificación.

      O

   1. Llame a [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) para generar un certificado desde una solicitud de firma de certificado que mantiene su clave privada segura.

1. Desde el dispositivo, llame a [`RegisterThing`](fleet-provision-api.md#register-thing) para registrar el dispositivo con AWS IoT y crear recursos en la nube.

   El servicio de aprovisionamiento de flotas utiliza una plantilla de aprovisionamiento para definir y crear recursos en la nube como objetos de IoT. La plantilla puede especificar los atributos y grupos a los que pertenece el objeto. Los grupos de objetos deben existir para poder agregarles el nuevo objeto.

1. Después de guardar el certificado permanente en el dispositivo, este debe desconectarse de la sesión que inició con el certificado de reclamación de aprovisionamiento y volver a conectarse con el certificado permanente. 

El dispositivo ya está listo para comunicarse con normalidad con él AWS IoT.

## Aprovisionamiento por usuario de confianza
<a name="trusted-user"></a>

En muchos casos, un dispositivo se conecta AWS IoT por primera vez cuando un usuario de confianza, como un usuario final o un técnico de instalación, utiliza una aplicación móvil para configurar el dispositivo en su ubicación de despliegue.

**importante**  
Debe administrar el acceso y el permiso del usuario de confianza para realizar este procedimiento. Una forma de hacerlo es proporcionar y mantener una cuenta para el usuario de confianza que lo autentica y le otorga acceso a las características y las operaciones API de AWS IoT necesarias para realizar este procedimiento. 

**Antes de entregar el dispositivo**

1. Llame [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html)para crear una plantilla de aprovisionamiento y devuelva su *templateArn* y*templateName*.

1. Cree un rol de IAM que utilice un usuario de confianza para iniciar el proceso de aprovisionamiento. La plantilla de aprovisionamiento solo permite a ese usuario aprovisionar un dispositivo. Por ejemplo:

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "arn:aws:iot:aws-region:aws-account-id:provisioningtemplate/templateName"
       ]
   }
   ```

1. Al aprovisionar dispositivos, otorga al AWS IoT servicio permiso para crear o actualizar recursos de IoT, como cosas y certificados, en tu cuenta. Para ello, asocie la política `AWSIoTThingsRegistration` gestionada a una función de IAM (denominada función de *aprovisionamiento) que confíe en el principal* del servicio. AWS IoT 

1. Proporcione los medios para identificar a sus usuarios de confianza, por ejemplo, proporcionándoles una cuenta que pueda autenticarlos y autorizar sus interacciones con las operaciones de la AWS API necesarias para registrar sus dispositivos.

**Para inicializar el dispositivo para su uso**

1. El usuario de confianza inicia sesión en su aplicación móvil o servicio web de aprovisionamiento.

1. La aplicación móvil o la aplicación web utiliza el rol de IAM y llama a [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html) para obtener un certificado de reclamación de aprovisionamiento temporal de AWS IoT.
**nota**  
Por motivos de seguridad, el certificado de reclamación de aprovisionamiento temporal devuelto por `CreateProvisioningClaim` solo es válido durante cinco minutos. Los pasos siguientes deben devolver correctamente un certificado válido antes de que caduque el certificado de reclamación de aprovisionamiento temporal. Los certificados de reclamación de aprovisionamiento temporal no aparecen en la lista de certificados de su cuenta.

1. La aplicación móvil o la aplicación web proporciona el certificado de reclamación de aprovisionamiento temporal al dispositivo junto con cualquier información de configuración necesaria, como credenciales Wi-Fi.

1. El dispositivo utiliza el certificado de reclamación de aprovisionamiento temporal para conectarse a AWS IoT mediante el [SDK de dispositivos, SDK para móviles y cliente de dispositivo de AWS IoT](iot-sdks.md).

1. El dispositivo obtiene un certificado permanente y una clave privada mediante una de estas opciones a los cinco minutos de conectarse AWS IoT con el certificado de notificación de aprovisionamiento temporal. El dispositivo utilizará el certificado y la clave que estas opciones devuelven para todas las autenticaciones futuras AWS IoT.

   1. Llame [`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)para crear un certificado y una clave privada nuevos mediante la autoridad de AWS certificación.

      O

   1. Llame a [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) para generar un certificado desde una solicitud de firma de certificado que mantiene su clave privada segura.
**nota**  
Recuerde [`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)o [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr)debe devolver un certificado válido en un plazo de cinco minutos a partir de la fecha de conexión AWS IoT con el certificado de solicitud de aprovisionamiento temporal.

1. El dispositivo llama [`RegisterThing`](fleet-provision-api.md#register-thing)para registrarlo AWS IoT y crear recursos en la nube. 

   El servicio de aprovisionamiento de flotas utiliza una plantilla de aprovisionamiento para definir y crear recursos en la nube como objetos de IoT. La plantilla puede especificar los atributos y grupos a los que pertenece el objeto. Los grupos de objetos deben existir para poder agregarles el nuevo objeto.

1. Después de guardar el certificado permanente en el dispositivo, el dispositivo debe desconectarse de la sesión que inició con el certificado de reclamación de aprovisionamiento temporal y volver a conectarse con el certificado permanente. 

El dispositivo ya está listo para comunicarse normalmente con él AWS IoT.

## Uso de ganchos de aprovisionamiento previo con la CLI AWS
<a name="hooks-cli-instruc"></a>

El siguiente procedimiento crea una plantilla de aprovisionamiento con enlaces de preaprovisionamiento. La función de Lambda utilizada aquí es un ejemplo que se puede modificar. 

**Para crear y aplicar un enlace de preaprovisionamiento a una plantilla de aprovisionamiento**

1. Cree una función de Lambda que tenga una entrada y una salida definidas. Las funciones de Lambda son altamente personalizables. `allowProvisioning` y `parameterOverrides` son necesarias para crear enlaces previos al aprovisionamiento. Para obtener más información sobre la creación de funciones Lambda, consulte [Utilización AWS Lambda con la interfaz de línea de AWS comandos](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html).

   El siguiente es un ejemplo de una salida de función de Lambda:

   ```
   {
     "allowProvisioning": True,
     "parameterOverrides": {
       "incomingKey0": "incomingValue0",
       "incomingKey1": "incomingValue1"
     }
   }
   ```

1. AWS IoT utiliza políticas basadas en recursos para llamar a Lambda, por lo que debe conceder AWS IoT permiso para llamar a su función Lambda.
**importante**  
Asegúrese de incluir las claves contextuales de condición global `source-arn` o `source-account` en las de las políticas adjuntas a su acción de Lambda para evitar la manipulación de permisos. Para obtener más información acerca de este tema, consulte [Prevención de la sustitución confusa entre servicios](cross-service-confused-deputy-prevention.md).

   El siguiente ejemplo utiliza [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) para dar permiso de IoT a su Lambda.

   ```
   aws lambda add-permission \
       --function-name myLambdaFunction \
       --statement-id iot-permission \
       --action lambda:InvokeFunction \
       --principal iot.amazonaws.com
   ```

1. Añada un enlace de preaprovisionamiento a una plantilla mediante el comando o. [create-provisioning-template[update-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/update-provisioning-template.html)](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html)

   El siguiente ejemplo de CLI utiliza la [create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html)para crear una plantilla de aprovisionamiento que tiene ganchos de preaprovisionamiento:

   ```
   aws iot create-provisioning-template \
       --template-name myTemplate \
       --provisioning-role-arn arn:aws:iam:us-east-1:1234564789012:role/myRole \
       --template-body file://template.json \
       --pre-provisioning-hook file://hooks.json
   ```

   El resultado de este comando tendrá un aspecto similar al siguiente.

   ```
   {
       "templateArn": "arn:aws:iot:us-east-1:1234564789012:provisioningtemplate/myTemplate",
       "defaultVersionId": 1,
       "templateName": myTemplate
   }
   ```

   También puede cargar un parámetro desde un archivo en lugar de escribirlo todo como un valor de parámetro de línea de comandos para ahorrar tiempo. Para obtener más información, consulte [Carga de parámetros de AWS CLI desde un archivo](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html). A continuación se muestra el parámetro `template` en formato JSON expandido:

   ```
   {
       "Parameters" : {
           "DeviceLocation": {
               "Type": "String"
           }
       },
       "Mappings": {
           "LocationTable": {
               "Seattle": {
                   "LocationUrl": "https://example.aws"
               }
           }
       },
       "Resources" : {
           "thing" : {
               "Type" : "AWS::IoT::Thing",
               "Properties" : {
                   "AttributePayload" : {
                       "version" : "v1",
                       "serialNumber" : "serialNumber"
                   },
                   "ThingName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]},
                   "ThingTypeName" : {"Fn::Join":["",["ThingTypePrefix_",{"Ref":"SerialNumber"}]]},
                   "ThingGroups" : ["widgets", "WA"],
                   "BillingGroup": "BillingGroup"
               },
               "OverrideSettings" : {
                   "AttributePayload" : "MERGE",
                   "ThingTypeName" : "REPLACE",
                   "ThingGroups" : "DO_NOTHING"
               }
           },
           "certificate" : {
               "Type" : "AWS::IoT::Certificate",
               "Properties" : {
                   "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
                   "Status" : "Active",
                   "ThingPrincipalType" : "EXCLUSIVE_THING"
               }
           },
           "policy" : {
               "Type" : "AWS::IoT::Policy",
               "Properties" : {
                   "PolicyDocument" : {
                       "Version": "2012-10-17",		 	 	 
                       "Statement": [{
                           "Effect": "Allow",
                           "Action":["iot:Publish"],
                           "Resource": ["arn:aws:iot:us-east-1:504350838278:topic/foo/bar"]
                       }]
                   }
               }
           }
       },
       "DeviceConfiguration": {
           "FallbackUrl": "https://www.example.com/test-site",
           "LocationUrl": {
               "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
       }
   }
   ```

   A continuación se muestra el parámetro `pre-provisioning-hook` en formato JSON expandido:

   ```
   {
        "targetArn" : "arn:aws:lambda:us-east-1:765219403047:function:pre_provisioning_test",
        "payloadVersion" : "2020-04-01"
   }
   ```

# Aprovisionamiento de dispositivos que tienen certificados de dispositivo
<a name="provision-w-cert"></a>

AWS IoT proporciona tres formas de aprovisionar dispositivos cuando ya tienen un certificado de dispositivo (y una clave privada asociada):
+ Aprovisionamiento de un solo objeto con una plantilla de aprovisionamiento. Esta es una buena opción si solo necesita aprovisionar los dispositivos de uno en uno.
+ Just-in-time aprovisionamiento (JITP) con una plantilla que aprovisiona un dispositivo cuando se conecta por primera vez a. AWS IoT Esta es una buena opción si necesita registrar un gran número de dispositivos, pero no dispone de información sobre ellos que se pueda incluir en una lista de aprovisionamiento por lotes.
+ Registro masivo Esta opción le permite especificar una lista de valores de aprovisionamiento de un solo objeto que se almacenan en un archivo en un bucket de S3. Este enfoque funciona bien si tiene un gran número de dispositivos conocidos cuyas características puede incluir en una lista. 

**Topics**
+ [

# Aprovisionamiento de un solo objeto
](single-thing-provisioning.md)
+ [

# Just-in-time aprovisionamiento
](jit-provisioning.md)
+ [

# Registro masivo
](bulk-provisioning.md)

# Aprovisionamiento de un solo objeto
<a name="single-thing-provisioning"></a>

Para aprovisionar algo, utilice la [RegisterThing](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterThing.html)API o el comando `register-thing` CLI. El comando de CLI `register-thing` adopta los argumentos siguientes:

--template-body  
La plantilla de aprovisionamiento.

--parameters  
Una lista de pares de nombre-valor para los parámetros utilizados en la plantilla de aprovisionamiento, en formato JSON (por ejemplo, `{"ThingName" : "MyProvisionedThing", "CSR" : "csr-text"}`).

Consulte [Aprovisionamiento de plantillas](provision-template.md).

[RegisterThing](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterThing.html)o `register-thing` devuelve ARNs los recursos y el texto del certificado que creó:

```
{
    "certificatePem": "certificate-text",
    "resourceArns": {
    "PolicyLogicalName": "arn:aws:iot:us-west-2:123456789012:policy/2A6577675B7CD1823E271C7AAD8184F44630FFD7",
    "certificate": "arn:aws:iot:us-west-2:123456789012:cert/cd82bb924d4c6ccbb14986dcb4f40f30d892cc6b3ce7ad5008ed6542eea2b049",
    "thing": "arn:aws:iot:us-west-2:123456789012:thing/MyProvisionedThing"
    }
}
```

Si se omite el parámetro en el diccionario, se utilizará el valor predeterminado. Si no se especifica el valor predeterminado, el parámetro no se reemplazará por un valor.

# Just-in-time aprovisionamiento
<a name="jit-provisioning"></a>

Puede utilizar el just-in-time aprovisionamiento (JITP) para aprovisionar sus dispositivos la primera vez que intenten conectarse a ellos. AWS IoT Para aprovisionar el dispositivo, debe habilitar el registro automático y asociar una plantilla de aprovisionamiento al certificado de CA utilizado para firmar el certificado de dispositivo. Los éxitos y errores de aprovisionamiento se registran como [Métricas de aprovisionamiento de dispositivos](metrics_dimensions.md#provisioning-metrics) en Amazon CloudWatch.

**Topics**
+ [

## Información general de JITP
](#jit-provisioning-overview)
+ [

## Registrar CA mediante una plantilla de aprovisionamiento
](#jit-provisioning-registerCA-template)
+ [

## Registrar una CA mediante el nombre de la plantilla de aprovisionamiento
](#jit-provisioning-registerCA-templateName)

## Información general de JITP
<a name="jit-provisioning-overview"></a>

Cuando un dispositivo intenta conectarse mediante un certificado firmado AWS IoT por un certificado de CA registrado, AWS IoT carga la plantilla del certificado de CA y la utiliza para realizar la llamada [RegisterThing](fleet-provision-api.md#register-thing). El flujo de trabajo de JITP registra primero un certificado con un valor de estado de `PENDING_ACTIVATION`. Cuando se completa el flujo de aprovisionamiento del dispositivo, el estado del certificado cambia a `ACTIVE`.

AWS IoT define los siguientes parámetros que se pueden declarar y a los que se puede hacer referencia en las plantillas de aprovisionamiento:
+ `AWS::IoT::Certificate::Country`
+ `AWS::IoT::Certificate::Organization`
+ `AWS::IoT::Certificate::OrganizationalUnit`
+ `AWS::IoT::Certificate::DistinguishedNameQualifier`
+ `AWS::IoT::Certificate::StateName`
+ `AWS::IoT::Certificate::CommonName`
+ `AWS::IoT::Certificate::SerialNumber`
+ `AWS::IoT::Certificate::Id`

Los valores de estos parámetros de plantilla de aprovisionamiento se limitan a lo que JITP puede extraer del campo de asunto del certificado del dispositivo que se va a aprovisionar. El certificado debe contener valores para todos los parámetros en el cuerpo de la plantilla. El parámetro `AWS::IoT::Certificate::Id` se refiere a un ID generado internamente, no un ID que se encuentra en el certificado. Puede obtener el valor de este ID mediante la `principal()` función incluida en una AWS IoT regla. 

**nota**  
Puede aprovisionar dispositivos mediante la función de AWS IoT Core just-in-time aprovisionamiento (JITP) sin tener que enviar toda la cadena de confianza en la primera conexión de un dispositivo a una. AWS IoT Core La presentación del certificado de CA es opcional, pero es necesario que el dispositivo envíe la extensión [Indicación del nombre del servidor (SNI)](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) cuando se conecte a AWS IoT Core.

### Ejemplo de cuerpo de plantilla
<a name="jit-provisioning-example-templatebody"></a>

El siguiente archivo JSON es un ejemplo de cuerpo de plantilla de JITP completa. 

```
{
   "Parameters":{
      "AWS::IoT::Certificate::CommonName":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::SerialNumber":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Country":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Id":{
         "Type":"String"
      }
   },
   "Resources":{
      "thing":{
         "Type":"AWS::IoT::Thing",
         "Properties":{
            "ThingName":{
               "Ref":"AWS::IoT::Certificate::CommonName"
            },
            "AttributePayload":{
               "version":"v1",
               "serialNumber":{
                  "Ref":"AWS::IoT::Certificate::SerialNumber"
               }
            },
            "ThingTypeName":"lightBulb-versionA",
            "ThingGroups":[
               "v1-lightbulbs",
               {
                  "Ref":"AWS::IoT::Certificate::Country"
               }
            ]
         },
         "OverrideSettings":{
            "AttributePayload":"MERGE",
            "ThingTypeName":"REPLACE",
            "ThingGroups":"DO_NOTHING"
         }
      },
      "certificate":{
         "Type":"AWS::IoT::Certificate",
         "Properties":{
            "CertificateId":{
               "Ref":"AWS::IoT::Certificate::Id"
            },
            "Status":"ACTIVE"
         }
      },
      "policy":{
         "Type":"AWS::IoT::Policy",
         "Properties":{
            "PolicyDocument":"{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
         }
      }
   }
}
```

Esta plantilla de ejemplo declara valores para los parámetros de aprovisionamiento `AWS::IoT::Certificate::CommonName`, `AWS::IoT::Certificate::SerialNumber`, `AWS::IoT::Certificate::Country` y `AWS::IoT::Certificate::Id` que se extraen del certificado y se usan en la sección `Resources`. El flujo de trabajo de JITP utiliza después esta plantilla para llevar a cabo las siguientes acciones:
+ Registrar un certificado y establecer su estado en PENDING\$1ACTIVE
+ Crear un recurso de objeto
+ Crear un recurso de política
+ Asociar la política al certificado
+ Asocie el certificado al objeto .
+ Actualizar el estado del certificado a ACTIVE

El aprovisionamiento del dispositivo falla si el certificado no tiene todas las propiedades mencionadas en la sección `Parameters` del `templateBody`. Por ejemplo, si `AWS::IoT::Certificate::Country` está incluido en la plantilla, pero el certificado no tiene ninguna propiedad `Country`, se produce un error en el aprovisionamiento del dispositivo.

También puedes utilizarla CloudTrail para solucionar problemas con tu plantilla JITP. Para obtener información sobre las métricas que se registran en Amazon CloudWatch, consulte[Métricas de aprovisionamiento de dispositivos](metrics_dimensions.md#provisioning-metrics). Para obtener más información acerca del aprovisionamiento de dispositivos, consulte [Plantillas de aprovisionamiento](provision-template.md).

**nota**  
Durante el proceso de aprovisionamiento, el just-in-time aprovisionamiento (JITP) llama a otras operaciones de la API del plano AWS IoT de control. Estas llamadas pueden superar las [cuotas de limitación de AWS IoT](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#throttling-limits) establecidas en su cuenta y provocar una limitación controlada de las llamadas. Póngase en contacto con el [servicio de atención al cliente de AWS](https://console.aws.amazon.com/support/home) para aumentar las cuotas de limitación controlada, si es necesario.

## Registrar CA mediante una plantilla de aprovisionamiento
<a name="jit-provisioning-registerCA-template"></a>

Para registrar una CA mediante una plantilla de aprovisionamiento completa, siga estos pasos: 

1. Guarde la plantilla de aprovisionamiento y la información del ARN del rol como en el siguiente ejemplo como un archivo JSON:

   ```
   { 
        "templateBody" : "{\r\n    \"Parameters\" : {\r\n        \"AWS::IoT::Certificate::CommonName\": {\r\n            \"Type\": \"String\"\r\n        },\r\n        \"AWS::IoT::Certificate::SerialNumber\": {\r\n            \"Type\": \"String\"\r\n        },\r\n        \"AWS::IoT::Certificate::Country\": {\r\n            \"Type\": \"String\"\r\n        },\r\n        \"AWS::IoT::Certificate::Id\": {\r\n            \"Type\": \"String\"\r\n        }\r\n    },\r\n    \"Resources\": {\r\n        \"thing\": {\r\n            \"Type\": \"AWS::IoT::Thing\",\r\n            \"Properties\": {\r\n                \"ThingName\": {\r\n                    \"Ref\": \"AWS::IoT::Certificate::CommonName\"\r\n                },\r\n                \"AttributePayload\": {\r\n                    \"version\": \"v1\",\r\n                    \"serialNumber\": {\r\n                        \"Ref\": \"AWS::IoT::Certificate::SerialNumber\"\r\n                    }\r\n                },\r\n                \"ThingTypeName\": \"lightBulb-versionA\",\r\n                \"ThingGroups\": [\r\n                    \"v1-lightbulbs\",\r\n                    {\r\n                        \"Ref\": \"AWS::IoT::Certificate::Country\"\r\n                    }\r\n                ]\r\n            },\r\n            \"OverrideSettings\": {\r\n                \"AttributePayload\": \"MERGE\",\r\n                \"ThingTypeName\": \"REPLACE\",\r\n                \"ThingGroups\": \"DO_NOTHING\"\r\n            }\r\n        },\r\n        \"certificate\": {\r\n            \"Type\": \"AWS::IoT::Certificate\",\r\n            \"Properties\": {\r\n                \"CertificateId\": {\r\n                    \"Ref\": \"AWS::IoT::Certificate::Id\"\r\n                },\r\n                \"Status\": \"ACTIVE\"\r\n            },\r\n            \"OverrideSettings\": {\r\n                \"Status\": \"DO_NOTHING\"\r\n            }\r\n        },\r\n        \"policy\": {\r\n            \"Type\": \"AWS::IoT::Policy\",\r\n            \"Properties\": {\r\n                \"PolicyDocument\": \"{ \\\"Version\\\": \\\"2012-10-17		 	 	 \\\", \\\"Statement\\\": [{ \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\":[\\\"iot:Publish\\\"], \\\"Resource\\\": [\\\"arn:aws:iot:us-east-1:123456789012:topic\/foo\/bar\\\"] }] }\"\r\n            }\r\n        }\r\n    }\r\n}",
        "roleArn" : "arn:aws:iam::123456789012:role/JITPRole"
   }
   ```

   En este ejemplo, el valor del campo `templateBody` debe ser un objeto JSON especificado como una cadena de escape y solo puede utilizar los valores de la [lista anterior](#jit-provisioning-overview). Puede utilizar distintas herramientas para crear la salida JSON necesaria, como `json.dumps` (Python) o `JSON.stringify` (Node). El valor del campo `roleARN` debe ser el ARN de un rol que tenga `AWSIoTThingsRegistration` asociado. Además, la plantilla puede utilizar un `PolicyName` existente en lugar del `PolicyDocument` insertado en el ejemplo. 

1. Registre un certificado de CA con la operación [Register CACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) API o el comando [https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html)CLI. Especificará el directorio de la plantilla de aprovisionamiento y la información del ARN del rol que guardó en el paso anterior:

   A continuación, se muestra un ejemplo de cómo registrar un certificado de CA en modo `DEFAULT` mediante la AWS CLI:

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --verification-cert file://your-verification-cert 
                   --set-as-active --allow-auto-registration --registration-config file://your-template
   ```

   A continuación, se muestra un ejemplo de cómo registrar un certificado de CA en modo `SNI_ONLY` mediante la AWS CLI:

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --certificate-mode SNI_ONLY
                    --set-as-active --allow-auto-registration --registration-config file://your-template
   ```

   Para obtener más información, consulte [Registrar sus certificados de CA](https://docs.aws.amazon.com//iot/latest/developerguide/register-CA-cert.html).

1.  (Opcional) Actualice la configuración de un certificado de CA mediante la operación [Actualizar CACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html) API o el comando [https://docs.aws.amazon.com//cli/latest/reference/iot/update-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-ca-certificate.html)CLI. 

   El siguiente ejemplo muestra cómo actualizar un certificado de CA con la AWS CLI:

   ```
   aws iot update-ca-certificate --certificate-id caCertificateId
                   --new-auto-registration-status ENABLE --registration-config file://your-template
   ```

## Registrar una CA mediante el nombre de la plantilla de aprovisionamiento
<a name="jit-provisioning-registerCA-templateName"></a>

Para registrar una CA mediante el nombre de una plantilla de aprovisionamiento, siga estos pasos:

1. Guarde el cuerpo de la plantilla de aprovisionamiento como un archivo JSON. Puede encontrar un cuerpo de plantilla de ejemplo en el cuerpo de la [plantilla de ejemplo](#jit-provisioning-example-templatebody).

1. Para crear una plantilla de aprovisionamiento, utilice la [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)API o el comando [https://docs.aws.amazon.com//cli/latest/reference/iot/create-provisioning-template.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-provisioning-template.html)CLI:

   ```
   aws iot create-provisioning-template --template-name your-template-name \
           --template-body file://your-template-body.json --type JITP \
           --provisioning-role-arn arn:aws:iam::123456789012:role/test
   ```
**nota**  
Para el just-in-time aprovisionamiento (JITP), debe especificar el tipo de plantilla que se utilizará `JITP` al crear la plantilla de aprovisionamiento. *Para obtener más información sobre el tipo de plantilla, consulta la referencia de [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)la AWS API.*

1. Para registrar la CA con el nombre de la plantilla, utilice la CACertificate API de [registro](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) o el comando [https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html)CLI:

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --verification-cert file://your-verification-cert \
           --set-as-active --allow-auto-registration --registration-config templateName=your-template-name
   ```

# Registro masivo
<a name="bulk-provisioning"></a>

Puede usar el comando [https://docs.aws.amazon.com/iot/latest/apireference/API_StartThingRegistrationTask.html](https://docs.aws.amazon.com/iot/latest/apireference/API_StartThingRegistrationTask.html) para registrar varios objetos a la vez. Este comando adopta una plantilla de aprovisionamiento, un nombre de bucket de S3; un nombre de clave y un ARN de rol que permite el acceso al archivo en el bucket de S3. El archivo en el bucket de S3 contiene los valores utilizados para reemplazar los parámetros de la plantilla. El archivo debe ser un archivo JSON delimitado por nueva línea. Cada línea contiene todos los valores de los parámetros para el registro de un único dispositivo. Por ejemplo:

```
{"ThingName": "foo", "SerialNumber": "123", "CSR": "csr1"}
{"ThingName": "bar", "SerialNumber": "456", "CSR": "csr2"}
```

Las siguientes operaciones de API relacionadas con el registro masivo pueden ser útiles:
+ [ListThingRegistrationTasks](https://docs.aws.amazon.com/iot/latest/apireference/API_ListThingRegistrationTasks.html): Enumera las tareas actuales de aprovisionamiento masivo de productos. 
+ [ DescribeThingRegistrationTask](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeThingRegistrationTask.html): proporciona información sobre una tarea específica de registro masivo de productos.
+ [StopThingRegistrationTask](https://docs.aws.amazon.com/iot/latest/apireference/API_StopThingRegistrationTask.html): Detiene una tarea de registro masivo.
+ [ListThingRegistrationTaskReports](https://docs.aws.amazon.com/iot/latest/apireference/API_ListThingRegistrationTaskReports.html): Se utiliza para comprobar los resultados y los errores de una tarea de registro masivo.

**nota**  
Solo puede ejecutarse una tarea de operación de registro masivo a la vez (por cuenta).
Las operaciones de registro masivo llaman a otras operaciones de API del plano de AWS IoT control. Estas llamadas pueden superar las [cuotas de limitación controlada de AWS IoT](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#throttling-limits) establecidas en la cuenta y provocar errores de limitación. Póngase en contacto con [AWS Customer Support](https://console.aws.amazon.com/support/home) para aumentar AWS IoT sus cuotas de regulación, si es necesario.

# Aprovisionamiento de plantillas
<a name="provision-template"></a>

Una plantilla de aprovisionamiento es un documento JSON que utiliza parámetros para describir los recursos con los que el dispositivo debe interactuar. AWS IoT Una plantilla de aprovisionamiento contiene dos secciones: `Parameters` y `Resources`. Existen dos tipos de plantillas de aprovisionamiento. AWS IoT Una se usa para el just-in-time aprovisionamiento (JITP) y el registro masivo, y la segunda se usa para el aprovisionamiento de flotas.

**Topics**
+ [

## Sección de parámetros
](#parameters-section)
+ [

## Sección de recursos
](#resources-section)
+ [

## Ejemplo de plantilla para el registro masivo
](#bulk-template-example)
+ [

## Ejemplo de plantilla para just-in-time aprovisionamiento (JITP)
](#JITP-template-example)
+ [

## Aprovisionamiento de flotas
](#fleet-provision-template)

## Sección de parámetros
<a name="parameters-section"></a>

La sección `Parameters` declara los parámetros utilizados en la sección `Resources`. Cada parámetro declara un nombre, un tipo y un valor predeterminado opcional. El valor predeterminado se usa cuando el diccionario trasladado con la plantilla no contiene un valor para el parámetro. La sección `Parameters` de un documento de plantilla tiene el siguiente aspecto:

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CSR" : {
            "Type" : "String"    
        }
    }
}
```

Este snippet de cuerpo de plantilla declara cuatro parámetros: `ThingName`, `SerialNumber`, `Location` y `CSR`. Todos esos parámetros son de tipo `String`. El parámetro `Location` declara un valor predeterminado de `"WA"`.

## Sección de recursos
<a name="resources-section"></a>

La `Resources` sección del cuerpo de la plantilla declara los recursos necesarios para que el dispositivo se comunique con AWS IoT: una cosa, un certificado y una o más políticas de IoT. Cada recurso especifica un nombre lógico, un tipo y un conjunto de propiedades.

Un nombre lógico le permite hacer referencia a un recurso en cualquier lugar de la plantilla.

El tipo especifica la clase de recurso que está declarando. Los tipos válidos son:
+ `AWS::IoT::Thing`
+ `AWS::IoT::Certificate`
+ `AWS::IoT::Policy`

Las propiedades que especifique dependen del tipo de recurso que está declarando.

### Recursos de objetos
<a name="thing-resources"></a>

Los recursos de objetos se declaran mediante las siguientes propiedades:
+ `ThingName`: cadena.
+ `AttributePayload`: opcional. Una lista de pares de nombre-valor.
+ `ThingTypeName`: opcional. Cadena para un tipo de objeto asociado para el objeto.
+ `ThingGroups`: opcional. Una lista de grupos a los que pertenece el objeto.
+ `BillingGroup`: opcional. Cadena para el nombre de un grupo de facturación asociado.
+ `PackageVersions`: opcional. Cadena para un paquete asociado y los nombres de las versiones.

### Recursos de certificados
<a name="certificate-resources"></a>

Puede especificar certificados de una de las siguientes maneras:
+ Una solicitud de firma de certificado (CSR).
+ Un ID de certificado de un certificado de dispositivo existente. (Solo el certificado se IDs puede usar con una plantilla de aprovisionamiento de flota).
+ Un certificado de dispositivo creado con un certificado de CA registrado con AWS IoT. Si tiene más de un certificado de CA registrado con el mismo campo de asunto, también debe trasladar el certificado de CA utilizado para firmar el certificado de dispositivo.

**nota**  
Cuando declare un certificado en una plantilla, use solo uno de estos métodos. Por ejemplo, si utiliza un CSR, no puede especificar también un ID de certificado o un certificado de dispositivo. Para obtener más información, consulte [Certificados de cliente X.509](x509-client-certs.md). 

Para obtener más información, consulte [Información general del certificado X.509](authentication.md#x509-certificate-overview). 

Los recursos de certificados se declaran mediante las siguientes propiedades:
+ `CertificateSigningRequest`: cadena.
+ `CertificateId`: cadena.
+ `CertificatePem`: cadena.
+ `CACertificatePem`: cadena.
+ `Status`: opcional. Cadena, que puede ser `ACTIVE` o `INACTIVE`. El valor predeterminado es ACTIVE.
+ `ThingPrincipalType`: opcional. Cadena que especifica el tipo de relación entre el objeto y la entidad principal (el certificado).
  + `EXCLUSIVE_THING`: establece una relación exclusiva. La entidad principal solo puede asociarse a este objeto específico y no a otros.
  + `NON_EXCLUSIVE_THING`: asocia la entidad principal especificada a los objetos. Puede asociar varios objetos a la entidad principal. Este es el valor predeterminado si no se especifica otro valor.
**nota**  
También puede aprovisionar dispositivos sin certificados de dispositivo. Para obtener más información, consulte [Aprovisionamiento de dispositivos que no tienen certificados de dispositivo mediante el aprovisionamiento de flotas](provision-wo-cert.md).

Ejemplos:
+ Certificado especificado con un CSR:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CertificateSigningRequest": {"Ref" : "CSR"},
              "Status" : "ACTIVE"      
          }
      }
  }
  ```
+ Certificado especificado con un ID de certificado existente:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CertificateId": {"Ref" : "CertificateId"}
          }
      }
  }
  ```
+ Certificado especificado con un archivo .pem de certificado existente y un archivo .pem de certificado de CA:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CACertificatePem": {"Ref" : "CACertificatePem"},
              "CertificatePem": {"Ref" : "CertificatePem"}
          }
      }
  }
  ```
+ Asocie exclusivamente un objeto a una entidad principal:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "ThingPrincipalType" : "EXCLUSIVE_THING"
          }
      }
  }
  ```

### Recursos de políticas
<a name="policy-resources"></a>

Los recursos de políticas se declaran mediante una de las siguientes propiedades:
+ `PolicyName`: opcional. Cadena. Hash es el valor predeterminado del documento de políticas. Solo `PolicyName` puede hacer referencia a las políticas de AWS IoT , pero no a las políticas de IAM. Si utiliza una política de AWS IoT existente, escriba el nombre de la política para la propiedad `PolicyName`. No incluya la propiedad `PolicyDocument`.
+ `PolicyDocument`: opcional. Un objeto JSON especificado como una cadena de escape. Si `PolicyDocument` no se proporciona, la política debe haberse creado ya.

**nota**  
Si una sección `Policy` está presente, `PolicyName` o `PolicyDocument`, pero no ambas, debe especificarse.

### Anular la configuración
<a name="override-settings"></a>

Si una plantilla especifica un recurso que ya existe, la sección `OverrideSettings` le permite especificar la acción que se debe realizar:

`DO_NOTHING`  
Dejar el recurso como está.

`REPLACE`  
Sustituir el recurso por el recurso especificado en la plantilla.

`FAIL`  
Provocar un error en la solicitud con `ResourceConflictsException`.

`MERGE`  
Solo es válida para las propiedades `ThingGroups` y `AttributePayload` de un objeto (`thing`). Combinar los atributos o las pertenencias a grupos existentes de la cosa con los especificados en la plantilla.

Cuando declara un recurso de objeto, puede especificar `OverrideSettings` para las siguientes propiedades:
+ `ATTRIBUTE_PAYLOAD`
+ `THING_TYPE_NAME`
+ `THING_GROUPS`

Cuando declara un recurso de certificado, puede especificar `OverrideSettings` para la propiedad `Status`.

`OverrideSettings` no están disponibles para recursos de políticas.

### Ejemplo de recursos
<a name="resource-example"></a>

El siguiente fragmento de plantilla declara un objeto, un certificado y una política:

```
{ 
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}, 
                "ThingTypeName" :  "lightBulb-versionA",
                "ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
            },
            "OverrideSettings" : {
                "AttributePayload" : "MERGE",
                "ThingTypeName" : "REPLACE",
                "ThingGroups" : "DO_NOTHING"
            }
        },  
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateSigningRequest": {"Ref" : "CSR"},
                "Status" : "ACTIVE"      
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }
}
```

El objeto se declara con:
+ El nombre lógico `"thing"`.
+ El tipo `AWS::IoT::Thing`.
+  Un conjunto de propiedades de objeto.

  Las propiedades de objeto incluyen el nombre de objeto, un conjunto de atributos, un nombre de tipo de objeto opcional y una lista opcional de grupos de objetos a los que pertenece el objeto.

Se hace referencia a los parámetros mediante `{"Ref":"parameter-name"}`. Cuando se evalúa la plantilla, los parámetros se reemplazan por el valor de los parámetros desde el diccionario trasladado con la plantilla.

El certificado se declara con:
+ El nombre lógico `"certificate"`.
+ El tipo `AWS::IoT::Certificate`.
+ Un conjunto de propiedades.

  Las propiedades incluyen el CSR para el certificado y el establecimiento del estado en `ACTIVE`. El texto CSR se transfiere como parámetro en el diccionario transferido con la plantilla.

La política se declara con:
+ El nombre lógico `"policy"`.
+ El tipo `AWS::IoT::Policy`.
+ O el nombre de una política existente o un documento de políticas.

## Ejemplo de plantilla para el registro masivo
<a name="bulk-template-example"></a>

El siguiente archivo JSON es un ejemplo de una plantilla de aprovisionamiento completa que especifica el certificado con un CSR:

(El valor del campo `PolicyDocument` debe ser un objeto JSON especificado como una cadena de escape).

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CSR" : {
            "Type" : "String"    
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}, 
                "ThingTypeName" :  "lightBulb-versionA",
                "ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateSigningRequest": {"Ref" : "CSR"},
                "Status" : "ACTIVE",
                "ThingPrincipalType" : "EXCLUSIVE_THING"
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }
}
```

## Ejemplo de plantilla para just-in-time aprovisionamiento (JITP)
<a name="JITP-template-example"></a>

El siguiente archivo JSON es un ejemplo de una plantilla de aprovisionamiento completa que especifica un certificado existente con un ID de certificado:

```
{
   "Parameters":{
      "AWS::IoT::Certificate::CommonName":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::SerialNumber":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Country":{
         "Type":"String"
      },
      "AWS::IoT::Certificate::Id":{
         "Type":"String"
      }
   },
   "Resources":{
      "thing":{
         "Type":"AWS::IoT::Thing",
         "Properties":{
            "ThingName":{
               "Ref":"AWS::IoT::Certificate::CommonName"
            },
            "AttributePayload":{
               "version":"v1",
               "serialNumber":{
                  "Ref":"AWS::IoT::Certificate::SerialNumber"
               }
            },
            "ThingTypeName":"lightBulb-versionA",
            "ThingGroups":[
               "v1-lightbulbs",
               {
                  "Ref":"AWS::IoT::Certificate::Country"
               }
            ]
         },
         "OverrideSettings":{
            "AttributePayload":"MERGE",
            "ThingTypeName":"REPLACE",
            "ThingGroups":"DO_NOTHING"
         }
      },
      "certificate":{
         "Type":"AWS::IoT::Certificate",
         "Properties":{
            "CertificateId":{
               "Ref":"AWS::IoT::Certificate::Id"
            },
            "Status":"ACTIVE",
            "ThingPrincipalType" : "EXCLUSIVE_THING"
         }
      },
      "policy":{
         "Type":"AWS::IoT::Policy",
         "Properties":{
            "PolicyDocument":"{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
         }
      }
   }
}
```

**importante**  
Debe utilizar `CertificateId` en una plantilla que se utilice para el aprovisionamiento JIT.

Para obtener más información sobre el tipo de plantilla de aprovisionamiento, consulta la referencia de [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html#iot-CreateProvisioningTemplate-request-type](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html#iot-CreateProvisioningTemplate-request-type)la AWS API.

Para obtener más información sobre cómo utilizar esta plantilla para el just-in-time aprovisionamiento, consulta: [J ust-in-time](https://docs.aws.amazon.com/iot/latest/developerguide/jit-provisioning.html) Provisioning.

## Aprovisionamiento de flotas
<a name="fleet-provision-template"></a>

Las plantillas de aprovisionamiento de flotas se utilizan AWS IoT para configurar la nube y los dispositivos. Estas plantillas utilizan los mismos parámetros y recursos que las plantillas de registro masivo y JITP. Para obtener más información, consulte [Aprovisionamiento de plantillas](#provision-template). Las plantillas de aprovisionamiento de flotas pueden contener una sección `Mapping` y una sección `DeviceConfiguration`. Puede utilizar funciones intrínsecas dentro de una plantilla de aprovisionamiento de flotas para generar una configuración específica del dispositivo. Las plantillas de aprovisionamiento de flotas se denominan recursos y se identifican mediante ARNs (por ejemplo,`arn:aws:iot:us-west-2:1234568788:provisioningtemplate/templateName`).

### Mapeos
<a name="mappings"></a>

La sección `Mappings` opcional hace coincidir una clave con el conjunto correspondiente de valores identificados. Por ejemplo, si desea establecer valores en función de una AWS región, puede crear un mapeo que utilice el Región de AWS nombre como clave y contenga los valores que desee especificar para cada región específica. Puede utilizar la función intrínseca `Fn::FindInMap` para recuperar valores en una asignación.

No puede incluir parámetros, pseudoparámetros ni funciones de llamadas intrínsecas en la sección `Mappings`.

### Configuración del dispositivo
<a name="device-config"></a>

La sección de configuración del dispositivo contiene los datos arbitrarios que desea enviar a sus dispositivos al realizar el aprovisionamiento. Por ejemplo: 

```
{
    "DeviceConfiguration": {
        "Foo":"Bar"
    }
}
```

Si envías mensajes a tus dispositivos mediante el formato de carga útil de notación de JavaScript objetos (JSON), AWS IoT Core formatea estos datos como JSON. Si utiliza el formato de carga de representación concisa de objetos binarios (CBOR), AWS IoT Core formatea estos datos como CBOR. La sección `DeviceConfiguration` no admite objetos JSON anidados.

### Funciones intrínsecas
<a name="intrinsic-functions"></a>

Las funciones intrínsecas se utilizan en cualquier sección de la plantilla de aprovisionamiento, excepto en la sección `Mappings`.

`Fn::Join`  
Agrega un conjunto de valores a un único valor separado por el delimitador especificado. Si un delimitador es la cadena vacía, los valores se concatena sin delimitador.  
`Fn::Join` no admite [Recursos de políticas](#policy-resources).

`Fn::Select`  
Devuelve un único objeto de una lista de objetos por índice.  
`Fn::Select` no comprueba si hay valores `null` o si el índice queda fuera de los límites de la matriz. Ambas condiciones dan lugar a un error de aprovisionamiento, por lo que debe asegurarse de elegir un valor de índice válido y de que la lista contenga valores distintos de null.

`Fn::FindInMap`  
Devuelve el valor correspondiente a claves en una asignación de dos niveles declarada en la sección `Mappings`.

`Fn::Split`  
Divide una cadena en una lista de valores de cadena para que pueda seleccionar un elemento de la lista de cadenas. Especifique un delimitador que determine dónde se divide la cadena (por ejemplo, una coma). Después de dividir una cadena, utilice `Fn::Select` para seleccionar un elemento.  
Por ejemplo, si se importa una cadena de subred IDs delimitada por comas a tu plantilla de pila, puedes dividir la cadena en cada coma. En la lista de subredes IDs, se utiliza `Fn::Select` para especificar un ID de subred para un recurso.

`Fn::Sub`  
Sustituye variables en una cadena de entrada por los valores que especifique. Puede utilizar esta función para crear comandos o salidas que incluyan valores que no están disponibles hasta que crea o actualiza una pila.

### Ejemplo de plantilla de aprovisionamiento de flotas
<a name="fleet-provisioning-example"></a>

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber": {
            "Type": "String"
        },
        "DeviceLocation": {
            "Type": "String"
        }
    },
    "Mappings": {
        "LocationTable": {
            "Seattle": {
                "LocationUrl": "https://example.aws"
            }
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "AttributePayload" : { 
                    "version" : "v1",
                    "serialNumber" : "serialNumber"
                },
                "ThingName" : {"Ref" : "ThingName"},
                "ThingTypeName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]},
                "ThingGroups" : ["v1-lightbulbs", "WA"],
                "BillingGroup": "LightBulbBillingGroup"
            },
            "OverrideSettings" : {
                "AttributePayload" : "MERGE",
                "ThingTypeName" : "REPLACE",
                "ThingGroups" : "DO_NOTHING"
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
                "Status" : "Active",
                "ThingPrincipalType" : "EXCLUSIVE_THING"
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [{
                        "Effect": "Allow",
                        "Action":["iot:Publish"],
                        "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/foo/bar"]
                    }]
                }
            }
        }
    },
    "DeviceConfiguration": {
        "FallbackUrl": "https://www.example.com/test-site",
        "LocationUrl": {
            "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
        }
}
```

**nota**  
Se puede actualizar una plantilla de aprovisionamiento existente para agregar un [enlace de preaprovisionamiento](pre-provisioning-hook.md).

# Enlaces de preaprovisionamiento
<a name="pre-provisioning-hook"></a>

AWS recomienda utilizar funciones de enlace previas al aprovisionamiento al crear plantillas de aprovisionamiento para tener un mayor control sobre qué dispositivos incorpora tu cuenta y cuántos. Los enlaces de preaprovisionamiento son funciones de Lambda que validan los parámetros transferidos desde el dispositivo antes de permitir que se aprovisione el dispositivo. Esta función de Lambda debe existir en su cuenta antes de aprovisionar un dispositivo porque se llama cada vez que un dispositivo envía una solicitud a través de [RegisterThing](fleet-provision-api.md#register-thing).

**importante**  
Asegúrese de incluir las claves contextuales de condición global `source-arn` o `source-account` en las de las políticas adjuntas a su acción de Lambda para evitar la manipulación de permisos. Para obtener más información acerca de este tema, consulte [Prevención de la sustitución confusa entre servicios](cross-service-confused-deputy-prevention.md).

Para que los dispositivos se aprovisionen, la función de Lambda debe aceptar el objeto de entrada y devolver el objeto de salida descrito en esta sección. El aprovisionamiento continúa solo si la función de Lambda devuelve un objeto con `"allowProvisioning": True`.

## Preaprovisionamiento de entrada de enlace
<a name="pre-provisioning-hook-input"></a>

AWS IoT envía este objeto a la función Lambda cuando un dispositivo se registra en. AWS IoT

```
{
    "claimCertificateId" : "string",
    "certificateId" : "string",
    "certificatePem" : "string",
    "templateArn" : "arn:aws:iot:us-east-1:1234567890:provisioningtemplate/MyTemplate",
    "clientId" : "221a6d10-9c7f-42f1-9153-e52e6fc869c1",
    "parameters" : {
        "string" : "string",
        ...
    }
}
```

El objeto `parameters` pasado a la función de Lambda contiene las propiedades en el argumento `parameters` pasado en la carga de solicitud [RegisterThing](fleet-provision-api.md#register-thing). 

## Valor de retorno del enlace previo a la provisión
<a name="pre-provisioning-hook-output"></a>

La función de Lambda debe devolver una respuesta que indique si ha autorizado la solicitud de aprovisionamiento y los valores de las propiedades para anular.

A continuación se muestra un ejemplo de una respuesta exitosa de la función de preaprovisionamiento.

```
{
    "allowProvisioning": true,
    "parameterOverrides" : {
        "Key": "newCustomValue",
        ...
    }
}
```

Se agregarán valores `"parameterOverrides"` al parámetro `"parameters"` en la carga de solicitud de [RegisterThing](fleet-provision-api.md#register-thing).

**nota**  
Si se produce un error en la función Lambda, se produce un error en la solicitud de aprovisionamiento `ACCESS_DENIED` y se registra un error en Logs. CloudWatch 
Si la función de Lambda no devuelve `"allowProvisioning": "true"` en la respuesta, se produce un error `ACCESS_DENIED` en la solicitud de aprovisionamiento.
La función de Lambda debe terminar de ejecutarse y volver en 5 segundos; de lo contrario, la solicitud de aprovisionamiento falla.

## Ejemplo de enlace Lambda de preaprovisionamiento
<a name="pre-provisioning-example"></a>

------
#### [ Python ]

Un ejemplo de enlace Lambda de preaprovisionamiento en Python.

```
import json

def pre_provisioning_hook(event, context):
    print(event)

    return {
        'allowProvisioning': True,
        'parameterOverrides': {
            'DeviceLocation': 'Seattle'
        }
    }
```

------
#### [ Java ]

Un ejemplo de enlace Lambda de preaprovisionamiento en Java.

Clase Handler:

```
package example;

import java.util.Map;
import java.util.HashMap;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class PreProvisioningHook implements RequestHandler<PreProvisioningHookRequest, PreProvisioningHookResponse> {

    public PreProvisioningHookResponse handleRequest(PreProvisioningHookRequest object, Context context) {
        Map<String, String> parameterOverrides = new HashMap<String, String>();
        parameterOverrides.put("DeviceLocation", "Seattle");

        PreProvisioningHookResponse response = PreProvisioningHookResponse.builder()
                .allowProvisioning(true)
                .parameterOverrides(parameterOverrides)
                .build();

        return response;
    }

}
```

Clase Request:

```
package example;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PreProvisioningHookRequest {
    private String claimCertificateId;
    private String certificateId;
    private String certificatePem;
    private String templateArn;
    private String clientId;
    private Map<String, String> parameters;
}
```

Clase Response:

```
package example;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PreProvisioningHookResponse {
    private boolean allowProvisioning;
    private Map<String, String> parameterOverrides;
}
```

------
#### [ JavaScript ]

Un ejemplo de enlace previo al aprovisionamiento de Lambda. JavaScript

```
exports.handler = function(event, context, callback) {
    console.log(JSON.stringify(event, null, 2));
    var reply = { 
        allowProvisioning: true,
        parameterOverrides: {
            DeviceLocation: 'Seattle'
        }
     };
     callback(null, reply);
}
```

------

# Firma de certificados autogestionada mediante un proveedor de certificados AWS IoT Core
<a name="provisioning-cert-provider"></a>

Puede crear un proveedor de AWS IoT Core certificados para firmar las solicitudes de firma de certificados (CSRs) en el aprovisionamiento de AWS IoT flotas. Un proveedor de certificados hace referencia a una función de Lambda y a la [API de MQTT `CreateCertificateFromCsr` para el aprovisionamiento de flotas](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr). La función de Lambda acepta una CSR y devuelve un certificado de cliente firmado.

Si no cuenta con un proveedor de certificados Cuenta de AWS, se recurre a la [API CreateCertificateFromCsr MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) en el aprovisionamiento de flotas para generar el certificado a partir de una CSR. Tras crear un proveedor de certificados, el comportamiento de la API de [CreateCertificateFromCsr MQTT cambiará y todas las llamadas a esta API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) de MQTT invocarán al proveedor de certificados para que emita el certificado.

Con el proveedor de AWS IoT Core certificados, puede implementar soluciones que utilicen autoridades de certificación privadas (CAs) [AWS Private CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html), como otras de confianza pública CAs, o su propia infraestructura de clave pública (PKI) para firmar la CSR. Además, puede utilizar el proveedor de certificados para personalizar los campos del certificado de su cliente, como los períodos de validez, los algoritmos de firma, los emisores y las extensiones.

**importante**  
Solo puede crear un proveedor de certificados por Cuenta de AWS. El cambio en el comportamiento de firma se aplica a toda la flota que llama a la [API de CreateCertificateFromCsr MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) hasta que elimines el proveedor de certificados de tu empresa. Cuenta de AWS

**Topics**
+ [

## Funcionamiento de la firma de certificados autoadministrada en el aprovisionamiento de flotas
](#provisioning-cert-provider-how-it-works)
+ [

## Entrada de la función de Lambda del proveedor de certificados
](#provisioning-cert-provider-lambda-input)
+ [

## Valor devuelto por la función de Lambda del proveedor de certificados
](#provisioning-cert-provider-lambda-return)
+ [

## Ejemplo de función de Lambda
](#provisioning-cert-provider-lambda)
+ [

## Firma de certificados autoadministrada para el aprovisionamiento de flotas
](#provisioning-self-certificate-signing)
+ [

## AWS CLI comandos para el proveedor de certificados
](#provisioning-cert-provider-cli)

## Funcionamiento de la firma de certificados autoadministrada en el aprovisionamiento de flotas
<a name="provisioning-cert-provider-how-it-works"></a>

### Conceptos clave
<a name="provisioning-cert-provider-concepts"></a>

Los siguientes conceptos proporcionan detalles que pueden ayudarle a entender cómo funciona la firma de certificados autogestionada en el aprovisionamiento de AWS IoT flotas. Para obtener más información, consulte [Aprovisionamiento de dispositivos que no tienen certificados de dispositivo mediante el aprovisionamiento de flotas](https://docs.aws.amazon.com//iot/latest/developerguide/provision-wo-cert.html).

**AWS IoT aprovisionamiento de flotas**  
Con el aprovisionamiento de AWS IoT flotas (abreviatura de aprovisionamiento de flotas), AWS IoT Core genera y entrega de forma segura certificados de dispositivo a sus dispositivos cuando se conectan a ellos AWS IoT Core por primera vez. Puede utilizar el aprovisionamiento de flotas para conectar dispositivos que no tienen certificados de dispositivo con AWS IoT Core. 

**Solicitud de firma de certificado (CSR)**  
En el proceso de aprovisionamiento de flotas, un dispositivo realiza una solicitud a AWS IoT Core través del MQTT de aprovisionamiento de [flota](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html). APIs Esta solicitud incluye una solicitud de firma de certificado (CSR), la cual se firmará para crear un certificado de cliente. 

**AWS firma gestionada de certificados en el aprovisionamiento de flotas**  
AWS gestionado es la configuración predeterminada para la firma de certificados en el aprovisionamiento de flotas. Con la firma de certificados AWS gestionada, AWS IoT Core firmará CSRs con la suya propia. CAs

**Firma de certificados autoadministrada en el aprovisionamiento de flotas**  
La autoadministración es otra opción para la firma de certificados en el aprovisionamiento de flotas. Con la firma de certificados autogestionada, se crea un proveedor de AWS IoT Core certificados para CSRs firmarlos. Puede usar la firma de certificados autogestionada para firmar CSRs con una CA generada por una CA AWS privada, otra CA de confianza pública o su propia infraestructura de clave pública (PKI).

**AWS IoT Core proveedor de certificados**  
AWS IoT Core el proveedor de certificados (abreviatura de proveedor de certificados) es un recurso administrado por el cliente que se utiliza para la firma autogestionada de certificados en el aprovisionamiento de flotas.

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

El siguiente diagrama es una ilustración simplificada de cómo funciona la firma automática de certificados en el aprovisionamiento de flotas. AWS IoT 

![\[AWS IoT Core proveedor de certificados para el aprovisionamiento de flotas\]](http://docs.aws.amazon.com/es_es/iot/latest/developerguide/images/provisioning-cert-provider.png)

+ Cuando se fabrica o se introduce un nuevo dispositivo de IoT en la flota, necesita certificados de cliente para autenticarse AWS IoT Core.
+ Como parte del proceso de aprovisionamiento de la flota, el dispositivo solicita los certificados de los clientes a través del AWS IoT Core MQTT de [aprovisionamiento de la flota](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html). APIs Esta solicitud incluye una solicitud de firma de certificado (CSR).
+ AWS IoT Core invoca al proveedor de certificados y pasa la CSR como entrada al proveedor.
+ El proveedor de certificados toma la CSR como entrada y emite un certificado de cliente.

  Para la firma de certificados AWS gestionada, AWS IoT Core firma la CSR con su propia CA y emite un certificado de cliente.
+ Con el certificado de cliente emitido, el dispositivo continuará con el aprovisionamiento de flotas y establecerá una conexión segura con AWS IoT Core.

## Entrada de la función de Lambda del proveedor de certificados
<a name="provisioning-cert-provider-lambda-input"></a>

AWS IoT Core envía el siguiente objeto a la función Lambda cuando un dispositivo se registra en ella. El valor de `certificateSigningRequest` es la CSR en [formato de correo con privacidad mejorada (PEM)](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-format.html) que se proporciona en la solicitud `CreateCertificateFromCsr`. `principalId`Es el ID del principal al que se conecta AWS IoT Core al realizar la `CreateCertificateFromCsr` solicitud. `clientId`es el ID de cliente establecido para la conexión MQTT.

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

## Valor devuelto por la función de Lambda del proveedor de certificados
<a name="provisioning-cert-provider-lambda-return"></a>

La función de Lambda debe devolver una respuesta que contenga el valor `certificatePem`. El siguiente es un ejemplo de una respuesta satisfactoria. AWS IoT Core utilizará el valor devuelto (`certificatePem`) para crear el certificado.

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

Si el registro se realiza correctamente, `CreateCertificateFromCsr` devolverá el mismo `certificatePem` en la respuesta `CreateCertificateFromCsr`. Para obtener más información, consulte el ejemplo de carga útil de respuesta de [CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr).

## Ejemplo de función de Lambda
<a name="provisioning-cert-provider-lambda"></a>

Antes de crear un proveedor de certificados, debe crear una función de Lambda para firmar una CSR. El siguiente es un ejemplo de función de Lambda en Python. Esta función llama a AWS Private CA para firmar la CSR de entrada con una CA privada y el algoritmo de firma `SHA256WITHRSA`. El certificado de cliente devuelto tendrá una validez de un año. Para obtener más información sobre AWS Private CA cómo crear una CA privada, consulte [¿Qué es una CA AWS privada?](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) y [Creación de una CA privada](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
    }
```

**importante**  
Los certificados devueltos por la función de Lambda deben tener el mismo nombre de sujeto y clave pública que la solicitud de firma de certificado (CSR).
La función de Lambda debe terminar de ejecutarse en cinco segundos.
La función Lambda debe estar en la misma región Cuenta de AWS y región que el recurso del proveedor de certificados.
Se debe conceder AWS IoT al director del servicio el permiso de invocación para la función Lambda. Para evitar [problemas de suplente confuso](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html), le recomendamos que defina `sourceArn` y `sourceAccount` para los permisos de invocación. Para obtener más información, consulte [Prevención de la sustitución confisa entre servicios](https://docs.aws.amazon.com//iot/latest/developerguide/cross-service-confused-deputy-prevention.html).

El siguiente ejemplo de política basada en recursos para [Lambda](https://docs.aws.amazon.com//lambda/latest/dg/access-control-resource-based.html) concede a AWS IoT el permiso para invocar la función de 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"
				}
			}
		}
	]
}
```

## Firma de certificados autoadministrada para el aprovisionamiento de flotas
<a name="provisioning-self-certificate-signing"></a>

Puede elegir la firma de certificados autoadministrada para el aprovisionamiento de flotas mediante la AWS CLI o la Consola de administración de AWS.

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

Para elegir la firma de certificados autogestionada, debe crear un proveedor de AWS IoT Core certificados para iniciar sesión CSRs en Fleet Provisioning. AWS IoT Core invoca al proveedor de certificados, que toma una CSR como entrada y devuelve un certificado de cliente. Para crear un perfil de certificado, utilice la operación de la API `CreateCertificateProvider` o el comando de la CLI `create-certificate-provider`.

**nota**  
Tras crear un proveedor de certificados, el comportamiento de la [API `CreateCertificateFromCsr` para el aprovisionamiento de flotas](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) cambiará, de modo que todas las llamadas a `CreateCertificateFromCsr` invocarán al proveedor de certificados para crear los certificados. Puede que este comportamiento tarde unos minutos en cambiar una vez creado un proveedor de certificados.

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

A continuación se muestra un ejemplo del resultado asociado a la ejecución de este comando:

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

Para obtener más información, consulte `[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)` en la *Referencia de la API de *AWS IoT**.

### Consola de administración de AWS
<a name="provisioning-self-certificate-signing-console"></a>

Para elegir la firma de certificados autogestionada mediante Consola de administración de AWS, siga estos pasos:

1. Vaya a la [consola de AWS IoT](https://console.aws.amazon.com//iot/home).

1. En el panel de navegación de la izquierda, bajo **Seguridad**, elija **Firma de certificado**.

1. En la página **Firma de certificado**, en **Detalles de firma de certificado**, elija **Editar el método de firma de certificados**.

1. En la página **Editar el método de firma de certificados**, en **Método de firma de certificados**, elija **Autoadministrado**.

1. En la sección **Configuración autoadministrada**, introduzca un nombre para el proveedor de certificados y, a continuación, cree o elija una función de Lambda.

1. Seleccione **Actualizar firma de certificado**.

## AWS CLI comandos para el proveedor de certificados
<a name="provisioning-cert-provider-cli"></a>

### Creación de un proveedor de certificados
<a name="provisioning-create-cert-provider"></a>

Para crear un perfil de certificado, utilice la operación de la API `CreateCertificateProvider` o el comando de la CLI `create-certificate-provider`. 

**nota**  
Tras crear un proveedor de certificados, el comportamiento de la [API `CreateCertificateFromCsr` para el aprovisionamiento de flotas](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) cambiará, de modo que todas las llamadas a `CreateCertificateFromCsr` invocarán al proveedor de certificados para crear los certificados. Puede que este comportamiento tarde unos minutos en cambiar una vez creado un proveedor de certificados.

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

A continuación se muestra un ejemplo del resultado asociado a la ejecución de este comando:

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

Para obtener más información, consulte `[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)` en la *Referencia de la API de *AWS IoT**.

### Actualización del proveedor de certificados
<a name="provisioning-update-cert-provider"></a>

Para actualizar un proveedor de certificados, utilice la operación de la API `UpdateCertificateProvider` o el comando de la 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
```

A continuación se muestra un ejemplo del resultado asociado a la ejecución de este comando:

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

Para obtener más información, consulte `[UpdateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateCertificateProvider.html)` y en la *Referencia de la API de *AWS IoT**.

### Descripción del proveedor de certificados
<a name="provisioning-describe-cert-provider"></a>

Para describir un proveedor de certificados, utilice la operación de la API `DescribeCertificateProvider` o el comando de la CLI `describe-certificate-provider`.

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

A continuación se muestra un ejemplo del resultado asociado a la ejecución de este comando:

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

Para obtener más información, consulte `[DescribeCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DescribeCertificateProvider.html)` en la *Referencia de la API de *AWS IoT**.

### Eliminación de un proveedor de certificados
<a name="provisioning-delete-cert-provider"></a>

Para eliminar un proveedor de certificados, utilice la operación de la API `DeleteCertificateProvider` o el comando de la CLI `delete-certificate-provider`. Si elimina el recurso del proveedor de certificados, `CreateCertificateFromCsr` se reanudará el comportamiento de y AWS IoT se crearán certificados AWS IoT firmados por una CSR.

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

Este comando no proporciona ninguna salida. 

Para obtener más información, consulte `[DeleteCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DeleteCertificateProvider.html)` en la *Referencia de la API de *AWS IoT**.

### Visualización de la lista de proveedores de certificados
<a name="provisioning-list-cert-provider"></a>

Para enumerar los proveedores de certificados de su Cuenta de AWS empresa, utilice la operación `ListCertificateProviders` API o el comando `list-certificate-providers` CLI.

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

A continuación se muestra un ejemplo del resultado asociado a la ejecución de este comando:

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

Para obtener más información, consulte [https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html](https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html) en la *Referencia de la API de *AWS IoT**.

# Creación de políticas y roles de IAM para un usuario que instala un dispositivo
<a name="provision-create-role"></a>

**nota**  
Estos procedimientos se utilizan únicamente cuando lo indique la AWS IoT consola.  
Para ir a esta página desde la consola, abra [Crear una nueva plantilla de aprovisionamiento](https://console.aws.amazon.com//iot/home#/provisioningtemplate/create/provisioningmethods/trustedUser).

## ¿Por qué no se puede hacer esto en la AWS IoT consola?
<a name="provision-create-role-why"></a>

Para una experiencia más segura, las acciones de IAM se realizan en la consola de IAM. Los procedimientos de esta sección explican los pasos necesarios para crear las funciones y políticas de IAM necesarias para utilizar la plantilla de aprovisionamiento.

## Creación de una política de IAM para el usuario que va a instalar un dispositivo
<a name="provision-create-role-policy"></a>

Este procedimiento describe cómo crear una política de IAM que autorice a un usuario a instalar un dispositivo mediante una plantilla de aprovisionamiento.

Mientras realiza este procedimiento, cambiará entre la consola de IAM y la AWS IoT consola. Se recomienda tener ambas consolas abiertas al mismo tiempo mientras completa este procedimiento.

**Para crear una política de IAM para el usuario que va a instalar un dispositivo**

1. Abra la [Central de políticas en la consola de IAM](https://console.aws.amazon.com//iamv2/home#/policies).

1. Elija **Crear política**.

1. En la página **Crear política**, elija la pestaña **JSON**.

1. Diríjase a la página de la AWS IoT consola en la que eligió **Configurar la política y el rol del usuario**.

1. En el **Ejemplo de política de aprovisionamiento**, seleccione **Copiar**.

1. Vuelva a la consola de IAM.

1. En el editor **JSON**, pegue la política que copió de la AWS IoT consola. Esta política es específica de la plantilla que estás creando en la AWS IoT consola.

1. Para continuar, elija **Siguiente: Etiquetas**.

1. En la página **Agregar etiquetas (opcional)**, seleccione **Agregar etiqueta** para cada etiqueta que quiera agregar a esta política. Puede omitir este paso si no tiene etiquetas para agregar.

1. Elija **Siguiente: Revisión** para continuar.

1. En la página **Revisar política** haga lo siguiente:

   1. En **Nombre\$1**, introduzca un nombre para la política que le ayude a recordar el propósito de la política.

      Anote el nombre que le dé a esta política porque lo usará en el siguiente procedimiento.

   1. Puede elegir introducir una descripción opcional para la política que está creando.

   1. Revise el resto de esta política y sus etiquetas.

1. Elija **Crear política** para finalizar la creación de su política.

Después de crear la nueva política, vaya a [Creación de un rol de IAM para el usuario que instalará un dispositivo](#provision-create-role-role) para crear la entrada de rol de usuario a la que adjuntará esta política.

## Creación de un rol de IAM para el usuario que instalará un dispositivo
<a name="provision-create-role-role"></a>

En estos pasos se describe cómo crear un rol de IAM que autentique al usuario que instalará un dispositivo mediante una plantilla de aprovisionamiento.

**Para crear una política de IAM para el usuario que va a instalar un dispositivo**

1. Abra la [Central de roles en la consola de IAM](https://console.aws.amazon.com//iamv2/home#/roles).

1. Elija **Crear rol**.

1. En **Seleccione una entidad de confianza**, elija el tipo de entidad de confianza a la que quiere dar acceso a la plantilla que va a crear.

1. Elija o introduzca la identificación de la entidad de confianza a la que desea conceder acceso y, a continuación, seleccione **Siguiente**.

1. En la página **Agregar permisos**, en las **Políticas de permisos**, en el cuadro de búsqueda, escriba el nombre de la política que creó en el [procedimiento anterior](#provision-create-role-policy).

1. En la lista de políticas, elija la política que creó en el procedimiento anterior y, a continuación, elija **Siguiente**.

1. En la sección **Nombrar, revisar y crear**, haga lo siguiente:

   1. En **Nombre del rol**, introduzca un nombre de rol que le sea útil para identificar su propósito.

   1. En **Descripción**, puede optar por introducir una descripción opcional del rol. Esto no es necesario para continuar.

   1. Revise los valores de los **pasos 1** y **2**.

   1. En **Agregar etiquetas (opcional)**, puede elegir agregar etiquetas a este rol. Esto no es necesario para continuar.

   1. Compruebe que la información de esta página esté completa y sea correcta y, a continuación, seleccione **Crear función**. 

Tras crear el nuevo rol, vuelve a la AWS IoT consola para seguir creando la plantilla.

## Actualización de una política existente para autorizar una plantilla nueva
<a name="provision-create-role-update"></a>

En los siguientes pasos se describe cómo agregar una nueva plantilla a una política de IAM que autorice a un usuario a instalar un dispositivo mediante una plantilla de aprovisionamiento.

**Para agregar una plantilla nueva a una política de IAM existente**

1. Abra la [Central de políticas en la consola de IAM](https://console.aws.amazon.com//iamv2/home#/policies).

1. En el cuadro de búsqueda, escriba el nombre de la política que desea actualizar.

1. En la lista que aparece debajo del cuadro de búsqueda, busque la política que desea actualizar y elija el nombre de la política.

1. En **Resumen de la política**, seleccione la pestaña **JSON** si ese panel aún no está visible.

1. Elija **Editar política** para editar el documento de política JSON.

1. En el editor, selecciona la pestaña **JSON** si ese panel aún no está visible.

1. En el documento de política, busque la declaración de política que contiene la acción `iot:CreateProvisioningClaim`.

   Si el documento de política no contiene una declaración de política con la acción `iot:CreateProvisioningClaim`, copie el siguiente fragmento de declaración y péguelo como una entrada adicional en la matriz `Statement` del documento de política. 
**nota**  
Este fragmento debe colocarse antes del carácter `]` de cierre de la matriz `Statement`. Puede que tenga que agregar una coma antes o después de este fragmento para corregir cualquier error de sintaxis.

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "--PUT YOUR NEW TEMPLATE ARN HERE--"
       ]
   }
   ```

1. Diríjase a la página de la AWS IoT consola en la que eligió **Modificar los permisos de los roles de usuario**.

1. Busque el **ARN del recurso** de la plantilla y elija **Copiar**.

1. Vuelva a la consola de IAM.

1. Pegue el nombre de recurso de Amazon (ARN) copiado en la parte superior de la lista de plantillas ARNs de la `Statement` matriz para que sea la primera entrada.

   Si este es el único ARN de la matriz, quite la coma al final del valor que acabas de pegar.

1. Revise la declaración de política actualizada y corrija los errores indicados por el editor.

1. Para guardar el documento de política actualizado, seleccione **Revisar política**.

1. Revise la política y, a continuación, seleccione **Guardar los cambios**.

1. Regrese a la AWS IoT consola.

# API de MQTT de aprovisionamiento de dispositivos
<a name="fleet-provision-api"></a><a name="provision-mqtt-api"></a>

El servicio de aprovisionamiento de flotas admite las siguientes operaciones de API de MQTT:
+ `CreateCertificateFromCsr`
+ `CreateKeysAndCertificate`
+ `RegisterThing`

Esta API admite búferes de respuesta en formato de representación concisa de objetos binarios (CBOR) y notación de JavaScript objetos (JSON), según el *payload-format* tema. Para una mayor claridad, los ejemplos de respuesta y solicitud de esta sección se muestran en formato JSON.


| *payload-format* | Tipo de datos de formato de respuesta | 
| --- | --- | 
| cbor | Concise Binary Object Representation (Representación concisa de objetos binarios, CBOR) | 
| json | JavaScript Notación de objetos (JSON) | 

**importante**  
Antes de publicar un tema de mensaje de solicitud, suscríbase a los temas de respuesta para recibir la respuesta. Los mensajes utilizados por esta API utilizan el protocolo de publicación/suscripción de MQTT para proporcionar una interacción de solicitud y respuesta.   
Si no se suscribe a los temas de respuesta *antes* de publicar una solicitud, es posible que no reciba los resultados de dicha solicitud.  
Aprovisionamiento de flotas de IoT Core devuelve los resultados de la API de MQTT de aprovisionamiento del dispositivo a través de la misma conexión con MQTT utilizada para publicar la solicitud de API.

## CreateCertificateFromCsr
<a name="create-cert-csr"></a>

Crea un certificado a partir de una solicitud de firma de certificado (CSR). AWS IoT proporciona certificados de cliente firmados por la autoridad de certificación (CA) raíz de Amazon. El nuevo certificado tiene un estado `PENDING_ACTIVATION`. Cuando llama a `RegisterThing` para aprovisionar un objeto con este certificado, el estado del certificado cambia a la plantilla `ACTIVE` o `INACTIVE` tal como se describe en ella.

Para obtener más información sobre cómo crear un certificado de cliente con el certificado de la autoridad de certificación y una solicitud de firma de certificado, consulte [Crear un certificado de cliente mediante el certificado de entidad de certificación](create-device-cert.md).

**nota**  
Por motivos de seguridad, el `certificateOwnershipToken` devuelto por `CreateCertificateFromCsr` caduca al cabo de una hora. Se debe llamar a `RegisterThing` antes de que venza `certificateOwnershipToken`. Si el certificado creado por `CreateCertificateFromCsr` no se ha activado y no se ha asociado a una política o a un objeto cuando caduque el token, se elimina el certificado. Si el token caduca, el dispositivo puede realizar una llamada `CreateCertificateFromCsr` para generar un certificado nuevo.

### CreateCertificateFromCsr solicitud
<a name="create-cert-csr-request"></a>

Publicar un mensaje con el tema `$aws/certificates/create-from-csr/payload-format`.

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

#### CreateCertificateFromCsr solicitar carga útil
<a name="create-cert-csr-request-payload"></a>

```
{
    "certificateSigningRequest": "string"
}
```

`certificateSigningRequest`  
La CSR, en formato PEM.

### CreateCertificateFromCsr respuesta
<a name="create-cert-csr-response"></a>

Suscripción a `$aws/certificates/create-from-csr/payload-format/accepted`

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

#### CreateCertificateFromCsr carga útil de respuesta
<a name="create-cert-csr-response-payload"></a>

```
{
    "certificateOwnershipToken": "string",
    "certificateId": "string",
    "certificatePem": "string"
}
```

`certificateOwnershipToken`  
El token para comprobar la propiedad del certificado durante el aprovisionamiento. 

`certificateId`  
El ID del certificado. Las operaciones de administración de certificados solo adoptan un certificateId. 

`certificatePem`  
Los datos del certificado, en formato PEM.

### CreateCertificateFromCsr error
<a name="create-cert-csr-error"></a>

Para recibir respuestas de error, suscríbase a `$aws/certificates/create-from-csr/payload-format/rejected`.

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

#### CreateCertificateFromCsr carga útil de error
<a name="create-cert-csr-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
El código del estado.

`errorCode`  
Código de error.

`errorMessage`  
Mensaje de error.

## CreateKeysAndCertificate
<a name="create-keys-cert"></a>

Crea nuevas claves y un certificado. AWS IoT proporciona certificados de cliente firmados por la autoridad de certificación (CA) raíz de Amazon. El nuevo certificado tiene un estado `PENDING_ACTIVATION`. Cuando llama a `RegisterThing` para aprovisionar un objeto con este certificado, el estado del certificado cambia a la plantilla `ACTIVE` o `INACTIVE` tal como se describe en ella.

**nota**  
Por motivos de seguridad, el `certificateOwnershipToken` devuelto por `CreateKeysAndCertificate` caduca al cabo de una hora. Se debe llamar a `RegisterThing` antes de que venza `certificateOwnershipToken`. Si el certificado creado por `CreateKeysAndCertificate` no se ha activado y no se ha asociado a una política o a un objeto cuando caduque el token, se elimina el certificado. Si el token caduca, el dispositivo puede realizar una llamada `CreateKeysAndCertificate` para generar un certificado nuevo.

### CreateKeysAndCertificate solicitud
<a name="create-keys-cert-request"></a>

Publicar un mensaje en `$aws/certificates/create/payload-format` con una carga de mensajes vacía.

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

### CreateKeysAndCertificate respuesta
<a name="create-keys-cert-response"></a>

Suscripción a `$aws/certificates/create/payload-format/accepted`

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

#### CreateKeysAndCertificate respuesta
<a name="create-keys-cert-response-payload"></a>

```
{
    "certificateId": "string",
    "certificatePem": "string",
    "privateKey": "string",
    "certificateOwnershipToken": "string"
}
```

`certificateId`  
El ID del certificado.

`certificatePem`  
Los datos del certificado, en formato PEM.

`privateKey`  
La clave privada.

`certificateOwnershipToken`  
El token para comprobar la propiedad del certificado durante el aprovisionamiento.

### CreateKeysAndCertificate error
<a name="create-keys-cert-error"></a>

Para recibir respuestas de error, suscríbase a `$aws/certificates/create/payload-format/rejected`.

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

#### CreateKeysAndCertificate carga útil de error
<a name="create-keys-cert-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
El código del estado.

`errorCode`  
Código de error.

`errorMessage`  
Mensaje de error.

## RegisterThing
<a name="register-thing"></a>

Aprovisiona un objeto mediante una plantilla predefinida.

### RegisterThing solicitud
<a name="register-thing-request"></a>

Publica un mensaje en `$aws/provisioning-templates/templateName/provision/payload-format`.

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

`templateName`  
El nombre de la plantilla de aprovisionamiento.

#### RegisterThing solicitar carga útil
<a name="register-thing-request-payload"></a>

```
{
    "certificateOwnershipToken": "string",
    "parameters": {
        "string": "string",
        ...
    }
}
```

`certificateOwnershipToken`  
Es el token que demuestra quién es propietario del certificado. AWS IoT genera el token al crear un certificado a través de MQTT.

`parameters`  
Opcional. Pares clave-valor del dispositivo que utilizan los [enlaces de preaprovisionamiento](pre-provisioning-hook.md) para evaluar la solicitud de registro.

### RegisterThing respuesta
<a name="register-thing-response"></a>

Suscripción a `$aws/provisioning-templates/templateName/provision/payload-format/accepted`

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

`templateName`  
El nombre de la plantilla de aprovisionamiento.

#### RegisterThing carga útil de respuesta
<a name="register-thing-response-payload"></a>

```
{
    "deviceConfiguration": {
        "string": "string",
        ...
    },
    "thingName": "string"
}
```

`deviceConfiguration`  
La configuración del dispositivo definida en la plantilla.

`thingName`  
El nombre de la cosa de IoT creado durante el aprovisionamiento.

### RegisterThing respuesta de error
<a name="register-thing-error"></a>

Para recibir respuestas de error, suscríbase a `$aws/provisioning-templates/templateName/provision/payload-format/rejected`.

`payload-format`  
El formato de carga del mensaje como `cbor` o `json`.

`templateName`  
El nombre de la plantilla de aprovisionamiento.

#### RegisterThing carga útil de respuesta a errores
<a name="register-thing-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
El código del estado.

`errorCode`  
Código de error.

`errorMessage`  
Mensaje de error.