Tutorial: Creación y cargar certificados para pruebas
Puede usar certificados de cliente X.509 para autenticar dispositivos en su concentrador IoT. Para entornos de producción, le recomendamos que adquiera un certificado CA X.509 de un proveedor profesional de servicios de certificados. A continuación, puede emitir certificados dentro de su organización desde una entidad de certificación (CA) interna y autoadministrada encadenada al certificado CA adquirido como parte de una estrategia integral de infraestructura de clave pública (PKI). Para más información sobre cómo obtener un certificado de CA X.509 de un proveedor de servicios de certificación profesional, consulte la sección Obtener un certificado de CA X.509 de Autenticar dispositivos mediante certificados de CA X.509.
Sin embargo, crear su propia CA privada autoadministrada que use una CA raíz interna como ancla de confianza es adecuado para entornos de prueba. Una CA privada autoadministrada con al menos una CA subordinada encadenada a su CA raíz interna, con certificados de cliente para sus dispositivos firmados por sus CA subordinadas, le permite simular un entorno de producción recomendado.
Importante
No se recomienda el uso de certificados autofirmados para entornos de producción. En este tutorial se presenta únicamente con fines de demostración.
El siguiente tutorial usa OpenSSL y el Libro de cocina de OpenSSL para describir cómo realizar las siguientes tareas:
- Creación de una entidad de certificación (CA) raíz interna y un certificado de CA raíz
- Creación de una CA subordinada interna y de un certificado de CA subordinada, firmados por su certificado de CA raíz interna.
- Cargue su certificado de CA subordinada en su concentrador IoT para realizar pruebas
- Use la CA subordinada para crear certificados de cliente para los dispositivos IoT que desee probar con su concentrador IoT
Nota
Microsoft proporciona scripts de PowerShell y Bash para ayudarle a entender cómo crear sus propios certificados X.509 y autenticarlos en una instancia de IoT Hub. Los scripts se incluyen con el SDK de dispositivos Azure IoT Hub para C. Los scripts solo se proporcionan con fines de demostración. Los certificados creados por ellos no deben usarse para producción. Los certificados contienen contraseñas codificadas de forma rígida ("1234") y expiran después de 30 días. Deberá usar sus propios procedimientos recomendados para la creación de certificados y la administración de la vigencia en entornos de producción. Para obtener más información, consulte Administración de certificados de CA de prueba para obtener ejemplos y tutoriales en el repositorio de GitHub para el SDK de dispositivos de Azure IoT Hub para C.
Requisitos previos
Suscripción a Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Una instancia de IoT Hub en la suscripción de Azure. Si aún no tiene un centro, puede seguir los pasos descritos en Creación de un centro de IoT.
La última versión de Git. Asegúrese de que Git se ha agregado a las variables de entorno accesibles desde la ventana de comandos. Consulte las herramientas de cliente de Git de Software Freedom Conservancy para instalar la versión más reciente de las herramientas
git
, lo que incluye Git Bash, la aplicación de línea de comandos que puede usar para interactuar con su repositorio de Git local.Una instalación de OpenSSL. En Windows, la instalación de Git incluye una instalación de OpenSSL. Puede acceder a OpenSSL desde el símbolo del sistema de Git Bash. Para comprobar que OpenSSL está instalado, abra un símbolo del sistema de Git Bash y escriba
openssl version
.Nota:
A menos que esté familiarizado con OpenSSL y ya lo tenga instalado en la máquina Windows, se recomienda usar OpenSSL desde el símbolo del sistema de Git Bash. Como alternativa, puede optar por descargar el código fuente y compilar OpenSSL. Para más información, consulte la página Descargas de OpenSSL. O bien, puede descargar la precompilación de OpenSSL de un tercero. Para más información, consulte la wiki de OpenSSL. Microsoft no garantiza la validez de los paquetes descargados de terceros. Si decide compilar o descargar OpenSSL, asegúrese de que se puede acceder al binario de OpenSSL en la ruta de acceso y de que la variable de entorno
OPENSSL_CNF
esté establecida en la ruta de acceso del archivo openssl.cnf.
Crear una CA raíz
Primero debe crear una entidad de certificación (CA) raíz interna y un certificado de CA raíz autofirmado que sirva como ancla de confianza a partir de la cual pueda crear otros certificados para realizar pruebas. Los archivos que se usan para crear y mantener su CA raíz interna se almacenan en una estructura de carpetas y se inicializan como parte de este proceso. En ella, lleve a cabo los siguiente pasos.
- Creación e inicialización de las carpetas y los archivos usados por la CA raíz
- Creación de un archivo de configuración que OpenSSL usará para configurar la CA raíz y los certificados creados con ella.
- Solicite y cree un certificado de CA autofirmado que sirva como su certificado de CA raíz
Inicia una ventana Git Bash y ejecuta el siguiente comando, en el que sustituirá
{base_dir}
por el directorio deseado en el que crear los certificados en este tutorial.cd {base_dir}
En la ventana de Git Bash, ejecuta los siguientes comandos, de uno en uno. Este paso crea la siguiente estructura de directorios y archivos de compatibilidad para la CA raíz.
Directorio o archivo Descripción rootca El directorio raíz de la CA raíz. rootca/certs El directorio en el que se crean y almacenan los certificados CA para la CA raíz. rootca/db El directorio en el que se almacenan la base de datos de certificados y los archivos de soporte de la CA raíz. rootca/db/index La base de datos de certificados para la CA raíz. El comando touch
crea un archivo sin contenido, para su uso posterior. La base de datos de certificados es un archivo de texto sin formato administrado por OpenSSL que contiene información sobre los certificados emitidos. Para más información sobre la base de datos de certificados, consulta la página del manual openssl-ca.rootca/db/serial Archivo que se usa para almacenar el número de serie del siguiente certificado que se creará para la CA raíz. El comando openssl
crea un número aleatorio de 16 bytes en formato hexadecimal y lo almacena en este archivo para inicializar el archivo de creación del certificado de CA raíz.rootca/db/crlnumber Un archivo que se usa para almacenar los números de serie de los certificados revocados emitidos por la CA raíz. El comando echo
introduce un número de serie de muestra, 1001, en el archivo.rootca/private Directorio en el que se almacenan los archivos privados de la CA raíz, incluida la clave privada.
Los archivos de este directorio deben estar protegidos.mkdir rootca cd rootca mkdir certs db private chmod 700 private touch db/index openssl rand -hex 16 > db/serial echo 1001 > db/crlnumber
Crea un archivo de texto llamado
rootca.conf
en el directoriorootca
creado en el paso anterior. Abre ese archivo en un editor de texto y, después, copia y guarda los siguientes parámetros de configuración de OpenSSL en ese archivoEl archivo proporciona a OpenSSL los valores necesarios para configurar su CA raíz de prueba. Para este ejemplo, el archivo configura una CA raíz llamada rootca mediante los directorios y archivos creados en los pasos anteriores. El archivo también proporciona valores de configuración para:
- La directiva de CA que usa la CA raíz para los campos de nombre distinguido (DN) del certificado.
- Las solicitudes de certificados creadas por la CA raíz
- Extensiones X.509 aplicadas a certificados de CA raíz, certificados de CA subordinada y certificados de cliente emitidos por la CA raíz.
Nota
El atributo
home
, en la secciónca_default
, se establece en../rootca
, porque este archivo de configuración también se usa al crear el certificado para la entidad de certificación subordinada. La ruta de acceso relativa especificada permite a OpenSSL ir de la carpeta de la entidad de certificación subordinada a la carpeta de la entidad de certificación raíz durante ese proceso.Para más información sobre la sintaxis de los archivos de configuración de OpenSSL, consulte la página del manual config en la documentación de OpenSSL.
[default] name = rootca domain_suffix = exampledomain.com aia_url = http://$name.$domain_suffix/$name.crt crl_url = http://$name.$domain_suffix/$name.crl default_ca = ca_default name_opt = utf8,esc_ctrl,multiline,lname,align [ca_dn] commonName = "rootca_common_name" [ca_default] home = ../rootca database = $home/db/index serial = $home/db/serial crlnumber = $home/db/crlnumber certificate = $home/$name.crt private_key = $home/private/$name.key RANDFILE = $home/private/random new_certs_dir = $home/certs unique_subject = no copy_extensions = none default_days = 3650 default_crl_days = 365 default_md = sha256 policy = policy_c_o_match [policy_c_o_match] countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [req] default_bits = 2048 encrypt_key = yes default_md = sha256 utf8 = yes string_mask = utf8only prompt = no distinguished_name = ca_dn req_extensions = ca_ext [ca_ext] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash [sub_ca_ext] authorityKeyIdentifier = keyid:always basicConstraints = critical,CA:true,pathlen:0 extendedKeyUsage = clientAuth,serverAuth keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash [client_ext] authorityKeyIdentifier = keyid:always basicConstraints = critical,CA:false extendedKeyUsage = clientAuth keyUsage = critical,digitalSignature subjectKeyIdentifier = hash
En la ventana Git Bash, ejecuta el siguiente comando para generar una solicitud de firma de certificado (CSR) en el directorio
rootca
y una clave privada en el directoriorootca/private
. Para más información sobre el comandoreq
de OpenSSL, consulte la página del manual openssl-req en la documentación de OpenSSL.Nota:
Aunque esta CA raíz es para fines de prueba y no se expondrá como parte de una infraestructura de clave pública (PKI), le recomendamos que no copie ni comparta la clave privada.
winpty openssl req -new -config rootca.conf -out rootca.csr -keyout private/rootca.key
Se le pedirá que ingrese una frase de paso PEM, como se muestra en el siguiente ejemplo, para el archivo de clave privada. Escriba y confirme una frase de contraseña para generar su clave privada y CSR.
Enter PEM pass phrase: Verifying - Enter PEM pass phrase: -----
Confirma que el archivo CSR,
rootca.csr
, está presente en el directoriorootca
que el archivo de clave privada,rootca.key
, está presente en el subdirectorioprivate
antes de continuar.En la ventana Git Bash, ejecute el siguiente comando para crear un certificado CA raíz autofirmado. El comando aplica las extensiones del archivo de configuración
ca_ext
al certificado. Estas extensiones indican que el certificado es para una entidad de certificación raíz y se pueden usar para firmar certificados y listas de revocación de certificados (CRL). Para más información sobre el comandoca
de OpenSSL, consulte la página del manual openssl-ca en la documentación de OpenSSL.winpty openssl ca -selfsign -config rootca.conf -in rootca.csr -out rootca.crt -extensions ca_ext
Se le pedirá que proporcione la frase de contraseña PEM, como se muestra en el siguiente ejemplo, para el archivo de clave privada. Después de proporcionar la frase de contraseña, OpenSSL genera un certificado y, a continuación, le solicita que firme y confirme el certificado para su CA raíz. Especifique y en ambos campos para generar el certificado autofirmado para su CA raíz.
Using configuration from rootca.conf Enter pass phrase for ../rootca/private/rootca.key: Check that the request matches the signature Signature ok Certificate Details: {Details omitted from output for clarity} Certificate is to be certified until Mar 24 18:51:41 2033 GMT (3650 days) Sign the certificate? [y/n]: 1 out of 1 certificate requests certified, commit? [y/n] Write out database with 1 new entries Data Base Updated
Después de que OpenSSL actualice la base de datos de certificados, confirma que el archivo del certificado,
rootca.crt
, está presente en el directoriorootca
y que el archivo del certificado PEM (.pem) para el certificado está presente en el directoriorootca/certs
. El nombre del archivo .pem coincide con el número de serie del certificado de CA raíz.
Creación de una CA subordinada
Después de crear la CA raíz interna, debe crear una CA subordinada para usarla como CA intermedia con la que firmar certificados de cliente para sus dispositivos. En teoría, no necesita crear una CA subordinada; puede cargar su certificado de CA raíz en su concentrador IoT y firmar certificados de cliente directamente desde su CA raíz. Sin embargo, el uso de una CA subordinada como CA intermedia para firmar certificados de cliente simula mejor un entorno de producción recomendado, en el que la CA raíz se mantiene desconectada. También puede usar una CA subordinada para firmar otra CA subordinada, que a su vez puede firmar otra CA subordinada, etcétera. El uso de CA subordinadas para firmar otras CA subordinadas crea una jerarquía de CA intermedias como parte de una cadena de confianza de certificados. En un entorno de producción, la cadena de confianza de certificados permite una delegación de confianza hacia los dispositivos de firma. Para más información sobre la firma de dispositivos en una cadena de confianza de certificados, consulte Autenticación de dispositivos mediante certificados de CA X.509.
De forma similar a su CA raíz, los archivos que se usan para crear y mantener su CA subordinada se almacenan en una estructura de carpetas y se inicializan como parte de este proceso. En ella, lleve a cabo los siguiente pasos.
- Creación e inicialización de las carpetas y archivos que usa la CA subordinada
- Creación de un archivo de configuración que OpenSSL usará para configurar la CA subordinada y los certificados creados con ella.
- Solicite y cree un certificado CA firmado por su CA raíz que sirva como certificado de su CA subordinada.
Vuelve al directorio base que contiene el directorio
rootca
. En este ejemplo, tanto la entidad de certificación raíz como la entidad de certificación subordinada residen en el mismo directorio base.cd ..
En la ventana de Git Bash, ejecuta los siguientes comandos, de uno en uno.
Este paso crea una estructura de directorios y archivos de soporte para la CA subordinada similar a la estructura de carpetas y archivos creada para la CA raíz en la sección anterior.
mkdir subca cd subca mkdir certs db private chmod 700 private touch db/index openssl rand -hex 16 > db/serial echo 1001 > db/crlnumber
Crea un archivo de texto llamado
subca.conf
en el directoriosubca
creado en el paso anterior. Abre ese archivo en un editor de texto y, después, copia y guarda los siguientes parámetros de configuración de OpenSSL en ese archivoAl igual que con el archivo de configuración para su CA raíz de prueba, este archivo proporciona a OpenSSL los valores necesarios para configurar su CA subordinada de prueba. Puede crear varias CA subordinadas para administrar escenarios o entornos de prueba.
Para más información sobre la sintaxis de los archivos de configuración de OpenSSL, consulte la página config del manual principal en la documentación de OpenSSL.
[default] name = subca domain_suffix = exampledomain.com aia_url = http://$name.$domain_suffix/$name.crt crl_url = http://$name.$domain_suffix/$name.crl default_ca = ca_default name_opt = utf8,esc_ctrl,multiline,lname,align [ca_dn] commonName = "subca_common_name" [ca_default] home = ../subca database = $home/db/index serial = $home/db/serial crlnumber = $home/db/crlnumber certificate = $home/$name.crt private_key = $home/private/$name.key RANDFILE = $home/private/random new_certs_dir = $home/certs unique_subject = no copy_extensions = copy default_days = 365 default_crl_days = 90 default_md = sha256 policy = policy_c_o_match [policy_c_o_match] countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [req] default_bits = 2048 encrypt_key = yes default_md = sha256 utf8 = yes string_mask = utf8only prompt = no distinguished_name = ca_dn req_extensions = ca_ext [ca_ext] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash [sub_ca_ext] authorityKeyIdentifier = keyid:always basicConstraints = critical,CA:true,pathlen:0 extendedKeyUsage = clientAuth,serverAuth keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash [client_ext] authorityKeyIdentifier = keyid:always basicConstraints = critical,CA:false extendedKeyUsage = clientAuth keyUsage = critical,digitalSignature subjectKeyIdentifier = hash
En la ventana Git Bash, ejecute los siguientes comandos para generar una clave privada y una solicitud de firma de certificado (CSR) en el directorio de la CA subordinada
Se le pedirá que ingrese una frase de paso PEM, como se muestra en el siguiente ejemplo, para el archivo de clave privada. Escriba y verifique una frase de contraseña para generar la clave privada y la CSR.
Enter PEM pass phrase: Verifying - Enter PEM pass phrase: -----
Confirma que el archivo CSR
subca.csr
está presente en el directorio de la CA subordinada y que el archivo de clave privadasubca.key
está presente en el subdirectorioprivate
antes de continuar.En la ventana Git Bash, ejecute el siguiente comando para crear un certificado de CA subordinada en el directorio de CA subordinada. El comando aplica las extensiones del archivo de configuración
sub_ca_ext
al certificado. Estas extensiones indican que el certificado es para una CA subordinada y también se pueden usar para firmar certificados y listas de revocación de certificados (CRL). A diferencia del certificado de CA raíz, este certificado no está autofirmado. En su lugar, el certificado de CA subordinada se firma con el certificado de CA raíz, estableciendo una cadena de certificados similar a la que se utilizaría para una infraestructura de clave pública (PKI). A continuación, el certificado de CA subordinada se usa para firmar certificados de cliente para probar los dispositivos.winpty openssl ca -config ../rootca/rootca.conf -in subca.csr -out subca.crt -extensions sub_ca_ext
Se le pedirá que ingrese la frase de paso, como se muestra en el siguiente ejemplo, para el archivo de clave privada de su CA raíz. Una vez que escriba la frase de paso, OpenSSL generará y mostrará los detalles del certificado y, a continuación, le pedirá que firme y confirme el certificado para su CA subordinada. Especifica
y
en ambos campos a fin de generar el certificado para tu CA subordinada.Using configuration from rootca.conf Enter pass phrase for ../rootca/private/rootca.key: Check that the request matches the signature Signature ok Certificate Details: {Details omitted from output for clarity} Certificate is to be certified until Mar 24 18:55:00 2024 GMT (365 days) Sign the certificate? [y/n]: 1 out of 1 certificate requests certified, commit? [y/n] Write out database with 1 new entries Data Base Updated
Después de que OpenSSL actualice la base de datos de certificados, confirma que el archivo del certificado,
subca.crt
, está presente en el directorio de la CA subordinada y que el archivo del certificado PEM (.pem) para el certificado está presente en el directoriorootca/certs
. El nombre del archivo .pem coincide con el número de serie del certificado de la CA subordinada.
Registre su certificado de CA subordinada en su centro de IoT
Registra el certificado de CA subordinada en IoT Hub, donde se utilizará para autenticar los dispositivos durante el registro y la conexión. Los siguientes pasos describen cómo cargar y verificar automáticamente el certificado de CA subordinada en el concentrador IoT.
En Azure Portal, ve a tu instancia de IoT Hub y selecciona Certificados en el menú de recursos, en Configuración de seguridad.
Seleccione Agregar en la barra de comandos para agregar un nuevo certificado de CA.
Escriba un nombre para su certificado de CA subordinada en el campo Nombre del certificado.
Selecciona el archivo de certificado PEM (.pem) de tu certificado de CA subordinada del directorio
rootca/certs
para agregarlo en el campo Archivo de certificado .pem o .cer.Active la casilla situada junto a Set certificate status to verified on upload (Establecer el estado del certificado que se va a comprobar al cargar).
Seleccione Guardar.
Su certificado de CA subordinada cargado se mostrará con el estado Verificado en la ficha Certificados del panel de trabajo.
Creación de un certificado de cliente para un dispositivo
Después de crear su CA subordinada, puede crear certificados de cliente para sus dispositivos. Los archivos y carpetas creados para su CA subordinada se usan para almacenar la CSR, la clave privada y los archivos de certificado para sus certificados de cliente.
El certificado de cliente debe tener el valor de su campo Subject Common Name (CN) establecido en el valor del ID de dispositivo que se usó al registrar el dispositivo correspondiente en Azure IoT Hub.
En ella, lleve a cabo los siguiente pasos.
- Creación de una clave privada y una solicitud de firma de certificado (CSR) para un certificado de cliente
- Cree un certificado de cliente firmado por su certificado de CA subordinada
En la ventana de Git Bash, asegúrate de que todavía estás en el directorio
subca
.En la ventana de Git Bash, ejecuta los siguientes comandos, de uno en uno. Reemplaza el marcador de posición por un nombre para el dispositivo IoT, por ejemplo,
testdevice
. Este paso crea la clave privada y la CSR para tu certificado de cliente.En este paso se crea una clave privada RSA de 2048 bits para su certificado de cliente y, a continuación, se genera una solicitud de firma de certificado (CSR) con dicha clave privada.
Cuando se te pida, proporciona los detalles del certificado, como se muestra en el siguiente ejemplo.
El único mensaje para el que debes proporcionar un valor específico es el Nombre común, que debe ser el mismo nombre de dispositivo proporcionado en el paso anterior. Puedes omitir o proporcionar valores arbitrarios para el resto de los mensajes.
Después de proporcionar los detalles del certificado, OpenSSL genera y muestra los detalles del certificado y, a continuación, le solicita que firme y confirme el certificado para su CA subordinada. Especifique y en ambos campos para generar el certificado para su CA subordinada.
----- Country Name (2 letter code) [XX]:. State or Province Name (full name) []:. Locality Name (eg, city) [Default City]:. Organization Name (eg, company) [Default Company Ltd]:. Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server hostname) []:'<DEVICE_NAME>' Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Confirma que el archivo CSR está presente en el directorio de la CA subordinada y que el archivo de clave privada está presente en el subdirectorio
private
antes de continuar. Para más información sobre los formatos de los archivos CSR y de clave privada, consulte Certificados X.509.En la ventana de Git Bash, ejecuta el siguiente comando y reemplaza los marcadores de posición de nombre de dispositivo por el mismo nombre que usaste en los pasos anteriores.
Este paso crea un certificado de cliente en el directorio de la CA subordinada. El comando aplica las extensiones del archivo de configuración
client_ext
al certificado. Estas extensiones indican que se trata de un certificado de cliente, que no puede utilizarse como certificado de CA. El certificado de cliente se firma con el certificado de CA subordinada.winpty openssl ca -config subca.conf -in <DEVICE_NAME>.csr -out <DEVICE_NAME>.crt -extensions client_ext
Se le pedirá que escriba la frase de paso, como se muestra en el siguiente ejemplo, para el archivo de clave privada de su CA subordinada. Una vez escrita la frase de paso, OpenSSL genera y muestra los detalles del certificado y, a continuación, le solicita que firme y confirme el certificado de cliente para su dispositivo. Especifique y en ambos campos para generar el certificado de cliente.
Using configuration from subca.conf Enter pass phrase for ../subca/private/subca.key: Check that the request matches the signature Signature ok Certificate Details: {Details omitted from output for clarity} Certificate is to be certified until Mar 24 18:51:41 2024 GMT (365 days) Sign the certificate? [y/n]: 1 out of 1 certificate requests certified, commit? [y/n] Write out database with 1 new entries Data Base Updated
Después de que OpenSSL actualice la base de datos de certificados, confirme que el archivo del certificado del cliente está presente en el directorio de la CA subordinada y que el archivo del certificado PEM (.pem) del certificado del cliente está presente en el subdirectorio certs del directorio de la CA subordinada. El nombre del archivo .pem coincide con el número de serie del certificado de cliente.
Pasos siguientes
Puede registrar su dispositivo en el centro de IoT para probar el certificado de cliente que ha creado para ese dispositivo. Para obtener más información sobre cómo registrar un dispositivo, consulte Creación y administración de identidades de dispositivo.
Si tiene varios dispositivos relacionados para probar, puede usar IoT Hub Device Provisioning Service para aprovisionar varios dispositivos en un grupo de inscripción. Para más información sobre el uso de grupos de inscripción en el servicio de aprovisionamiento de dispositivos, consulte Tutorial: Aprovisionamiento de varios dispositivos X.509 mediante grupos de inscripción.