

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.

# Biblioteca corePKCS11
<a name="security-pkcs"></a>

**nota**  <a name="out-of-date-message"></a>
Es posible que el contenido de esta página no esté actualizado. Consulte la [página de la FreeRTOS.org biblioteca](https://www.freertos.org/Documentation/03-Libraries/01-Library-overview/01-All-libraries) para obtener la última actualización.

## Descripción general de
<a name="freertos-pkcs-overview"></a>

El estándar de criptografía de clave pública 11 define una API independiente de la plataforma para administrar y usar tokens criptográficos. [PKCS 11](https://en.wikipedia.org/wiki/PKCS_11) hace referencia a la API definida por el estándar y al propio estándar. La API criptográfica PKCS \#11 resume el almacenamiento de claves, las get/set propiedades de los objetos criptográficos y la semántica de las sesiones. Se usa ampliamente para manipular objetos criptográficos comunes y es importante porque las funciones que especifica permiten al software de la aplicación usar, crear, modificar y eliminar objetos criptográficos sin exponerlos nunca a la memoria de la aplicación. Por ejemplo, las integraciones de AWS referencia de FreeRTOS utilizan un pequeño subconjunto de la API PKCS \#11 para acceder a la clave secreta (privada) necesaria para crear una conexión de red autenticada y protegida mediante el protocolo [Transport Layer Security (TLS)](https://en.wikipedia.org/wiki/Transport_Layer_Security) sin que la aplicación «vea» la clave.

La biblioteca corePKCS11 contiene una implementación simulada basada en software de la interfaz (API) PKCS 11 que utiliza la funcionalidad criptográfica proporcionada por Mbed TLS. El uso de una simulación de software permite un rápido desarrollo y flexibilidad, pero se espera que sustituya la simulación por una implementación específica para el almacenamiento seguro de claves que se utiliza en sus dispositivos de producción. Por lo general, los proveedores de criptoprocesadores seguros, como Trusted Platform Module (TPM), Hardware Security Module (HSM), Secure Element o cualquier otro tipo de enclave de hardware seguro, distribuyen una implementación del PKCS 11 junto con el hardware. Por lo tanto, el propósito de la biblioteca simulada solo de software corePKCS11 es proporcionar una implementación PKCS 11 no específica del hardware que permita la creación y el desarrollo rápidos de prototipos antes de cambiar a una implementación de PKCS 11 específica del criptoprocesador en los dispositivos de producción.

Solo se implementa un subconjunto del estándar PKCS 11, que se centra en las operaciones que implican claves asimétricas, la generación de números aleatorios y el hash. Los casos de uso específicos incluyen la administración de certificados y claves para la autenticación TLS y la verificación de firmas con firma de código en dispositivos integrados pequeños. Consulte el archivo `pkcs11.h` (obtenido de OASIS, el organismo de estándares) en el repositorio de código fuente de FreeRTOS. En la [implementación de referencia de FreeRTOS](https://docs.aws.amazon.com/embedded-csdk/latest/lib-ref/libraries/standard/corePKCS11/docs/doxygen/output/html/index.html), la interfaz de auxiliar de TLS realiza llamadas a la API PKCS 11 para realizar la autenticación de cliente de TLS durante `SOCKETS_Connect`. El flujo de trabajo de aprovisionamiento del desarrollador único también realiza llamadas a la API PKCS 11 para importar una clave privada y un certificado de cliente de TLS para la autenticación al agente MQTT de AWS IoT . Estas dos casos de uso, aprovisionamiento y autenticación de cliente de TLS, requieren la implementación de solo un pequeño subconjunto de estándares de la interfaz PKCS 11.

## Características
<a name="freertos-pcks-features"></a>

Se utiliza el siguiente subconjunto de PKCS 11. Esta lista se encuentra aproximadamente en el orden en que se llama a las rutinas para soportar el aprovisionamiento, la autenticación de cliente de TLS y la limpieza. Para obtener descripciones detalladas de las funciones, consulte la documentación de PKCS 11 proporcionada por el comité de estándares.

### API de eliminación y configuración general
<a name="pkcs-required-setup-teardown"></a>
+ `C_Initialize`
+ `C_Finalize`
+ `C_GetFunctionList`
+ `C_GetSlotList`
+ `C_GetTokenInfo`
+ `C_OpenSession`
+ `C_CloseSession`
+ `C_Login`

### API de aprovisionamiento
<a name="pkcs-required-provisioning"></a>
+ `C_CreateObject CKO_PRIVATE_KEY` (para clave privada de dispositivo)
+ `C_CreateObject CKO_CERTIFICATE` (para certificado de dispositivo y certificado de verificación de código)
+ `C_GenerateKeyPair`
+ `C_DestroyObject`

### Autenticación del cliente
<a name="pkcs-required-client-auth"></a>
+ `C_GetAttributeValue`
+ `C_FindObjectsInit`
+ `C_FindObjects`
+ `C_FindObjectsFinal`
+ `C_GenerateRandom`
+ `C_SignInit`
+ `C_Sign`
+ `C_VerifyInit`
+ `C_Verify`
+ `C_DigestInit`
+ `C_DigestUpdate`
+ `C_DigestFinal`

## Soporte de criptosistema asimétrico
<a name="pkcs-asym-crypto"></a>

La implementación de referencia de Freertos utiliza RSA PKCS \#11 de 2048 bits (solo para firma) y ECDSA con la curva NIST. P-256 Las siguientes instrucciones describen cómo crear algo a partir de un certificado de cliente. AWS IoT P-256 

Asegúrese de utilizar las siguientes versiones (o más recientes) de AWS CLI OpenSSL:

```
aws --version
aws-cli/1.11.176 Python/2.7.9 Windows/8 botocore/1.7.34

openssl version
OpenSSL 1.0.2g  1 Mar 2016
```

En el siguiente procedimiento se supone que ha utilizado el comando `aws configure` para configurar la AWS CLI. Para obtener más información, consulte [Configuración rápida con `aws configure`](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) en la *Guía del usuario de AWS Command Line Interface *.

**Para crear un AWS IoT algo basado en un certificado de P-256 cliente**

1. Crea cualquier AWS IoT cosa.

   ```
   aws iot create-thing --thing-name {{thing-name}}
   ```

1. Utilice OpenSSL para crear una clave. P-256 

   ```
   openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -outform PEM -out {{thing-name}}.key
   ```

1. Cree una solicitud de inscripción de certificado firmada con la clave que creó en el paso 2.

   ```
   openssl req -new -nodes -days 365 -key {{thing-name}}.key -out {{thing-name}}.req
   ```

1. Envíe la solicitud de inscripción del certificado a. AWS IoT

   ```
   aws iot create-certificate-from-csr  \
     --certificate-signing-request file://{{thing-name}}.req --set-as-active  \
     --certificate-pem-outfile {{thing-name}}.crt
   ```

1. Asocie el certificado (al que la salida de ARN hace referencia en el comando anterior) al objeto.

   ```
   aws iot attach-thing-principal --thing-name {{thing-name}} \
     --principal "arn:aws:iot:{{us-east-1}}:{{123456789012}}:cert/{{86e41339a6d1bbc67abf31faf455092cdebf8f21ffbc67c4d238d1326c7de729}}"
   ```

1. Cree una política. (Esta política es demasiado permisiva. Debe usarse únicamente con fines de desarrollo).

   ```
   aws iot create-policy --policy-name FullControl --policy-document file://policy.json
   ```

   A continuación se muestra una lista del archivo policy.json especificado en el comando `create-policy`. Puede omitir la acción `greengrass:*` si no desea ejecutar la demostración de FreeRTOS para la detección y conectividad Greengrass.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "iot:*",
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": "greengrass:*",
         "Resource": "*"
       }
     ]
   }
   ```

------

1. Asocie la entidad de seguridad (certificado) y la política al objeto.

   ```
   aws iot attach-principal-policy --policy-name FullControl \
     --principal "arn:aws:iot:us-east-1:{{123456789012}}:cert/{{86e41339a6d1bbc67abf31faf455092cdebf8f21ffbc67c4d238d1326c7de729}}"
   ```

Ahora, siga los pasos que se indican en la sección [Introducción a AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-gs.html) de esta guía. No olvide copiar el certificado y la clave privada que creó en su archivo `aws_clientcredential_keys.h`. Copie el nombre del objeto a `aws_clientcredential.h`.

**nota**  
El certificado y la clave privada están codificados únicamente con fines de demostración. Production-level las aplicaciones deben almacenar estos archivos en un lugar seguro.

## Portabilidad
<a name="freertos-pkcs-porting"></a>

Para obtener información acerca de la portabilidad de la biblioteca corePKCS11 a su plataforma, consulte [Portabilidad de la biblioteca corePKCS11](https://docs.aws.amazon.com/freertos/latest/portingguide/afr-porting-pkcs.html) en la Guía de portabilidad de FreeRTOS.

## Uso de memoria
<a name="freertos-pkcs-memory"></a>


****  
<a name="corePKCS11-memory-estimate"></a>
<table>
<thead>
  <tr><th colspan="3">Tamaño del código de CorePKCS11 (ejemplo generado con GCC para ARM) Cortex-M</th></tr>
  <tr><th>Archivos</th><th>Con optimización -O1</th><th>Con optimización -Os</th></tr>
</thead>
<tbody>
  <tr><td>core\_pkcs11.c</td><td>0,8 K</td><td>0,8 K</td></tr>
  <tr><td>core\_pki\_utils.c</td><td>0,5 K</td><td>0,3 K</td></tr>
  <tr><td>core\_pkcs11\_mbedtls.c</td><td>8,9 K</td><td>7,5 K</td></tr>
  <tr><td>Estimaciones totales</td><td>10,2 K</td><td>8,6 K</td></tr>
</tbody>
</table>
