Administración de almacenes de certificados mediante PowerShell
Podríamos habernos visto obligados a trabajar con certificados de Windows si fuéramos administradores de sistemas de Windows. Desafortunadamente, trabajar con certificados en Windows suele ser uno de los diferentes sombreros que debe asumir un administrador del sistema.
Este artículo analizará cómo consultar certificados y administrar almacenes de certificados mediante PowerShell.
Descripción del almacén de certificados
Los almacenes de certificados son “cubos” donde el sistema operativo Windows guarda todos los certificados instalados actualmente; un certificado puede existir en varios almacenes y, en ocasiones, se denominan almacenes físicos o lógicos. Las claves de registro y los archivos se almacenan en almacenes físicos que hacen referencia al sistema de archivos existente o la ubicación del registro.
El Registro de Windows y el sistema de archivos contienen cada tienda. Interactuamos con el almacén lógico en lugar del registro o el sistema de archivos cuando trabajamos con un certificado.
Las referencias dinámicas a una o más tiendas físicas son tiendas lógicas, y las tiendas físicas son más difíciles de administrar que las tiendas lógicas. Windows mantiene los certificados en dos ubicaciones: un contexto de usuario y un contexto de equipo.
Dependiendo de si el certificado debe ser utilizado por un solo usuario, varios usuarios o la propia máquina, un certificado se coloca en uno de estos dos contextos. Un certificado en un contexto de usuario o computadora se denominará certificado de usuario y certificado de computadora para el resto de este artículo.
Certificados de usuario
Si solo queremos que un único usuario utilice un certificado, lo ideal es un certificado de usuario almacenado en el administrador de certificados de Windows. Esto es común para los sistemas de autenticación basados en certificados como IEEE 802.1x
con cable.
Los certificados de usuario se almacenan en el perfil del usuario actual y solo se pueden asignar lógicamente al contexto de ese usuario. Incluso en los mismos sistemas, los certificados de usuario se “asignan” y son únicos para cada usuario.
Certificados Informáticos
Si todos los usuarios usan un certificado en una computadora o un proceso del sistema, debe colocarse dentro de una tienda en el contexto de la computadora. Por ejemplo, si un sistema utiliza un certificado en un servidor web para cifrar la comunicación de todos los clientes, sería ideal establecer un certificado en una tienda en el contexto de la computadora.
Veremos que el almacén de certificados de una computadora está mapeado lógicamente para todos los contextos de usuario, y este concepto permite que todos los usuarios utilicen los certificados en un almacén de certificados de computadora. Sin embargo, todavía depende de los permisos configurados para la clave privada.
La carpeta de datos del programa y las secciones del registro de la máquina local incluyen certificados de computadora. Además, podemos encontrar certificados de usuario en la carpeta AppData
y las colmenas Current User Registry
.
Administrar certificados usando PowerShell
Al igual que con la MMC, también podemos visualizar y gestionar certificados con PowerShell. Pero, primero, inspeccionemos los certificados en sus almacenes físicos (el registro y el sistema de archivos).
Tienda fisica
Podemos enumerar todas las claves y valores dentro de la ruta principal de la clave de registro HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates\
mediante el cmdlet de PowerShell Get-ChildItem
.
El siguiente comando enumerará todos los certificados de usuario actualmente conectados en el almacén lógico de las autoridades de certificación intermedias.
Código de ejemplo:
Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificate\CA\Certificates\
La huella digital del certificado para la CA de confianza y su certificado en la propiedad correspondiente corresponderán a cada entrada en la sección del Registro que vemos.
Producción :
Hive: HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\CA\Certificates
Name Property
---- --------
070A726C6E4418DCF0213874F0C16D Blob : {3, 0, 0, 0...}
93B041E935
104C63D2546B8021DD105E9FBA5A8D Blob : {3, 0, 0, 0...}
78169F6B32
<SNIP>
El almacén personal es otro almacén estándar y los certificados de este almacén se almacenan en el sistema de archivos en lugar del registro. El siguiente comando devuelve un directorio que contiene los archivos correspondientes a los certificados instalados en el almacén de usuarios actual personal.
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificate\My\Certificates\
Cada archivo devuelto en el siguiente comando se refiere al objeto de una clave privada creada por el proveedor de almacenamiento de claves (KSP). El nombre de archivo corresponde al identificador de clave de asunto del certificado.
Por tanto, a cada clave privada que instalemos se le añadirá un archivo correspondiente.
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificate\My\Keys\
Cada archivo en el directorio producido por el siguiente comando es un contenedor único para la clave privada cifrada del KSP. El nombre del archivo y el certificado no tienen un vínculo directo, pero el archivo es el destino del puntero en el comando anterior.
Get-ChildItem -Path $env:APPDATA\Microsoft\Crypto\Keys
Almacén lógico
Usaremos el almacenamiento lógico para el resto de las instancias porque es poco común trabajar con certificados en sus rutas físicas. PowerShell puede acceder a los almacenes lógicos mediante el Cert:PSDrive
, que asigna certificados a los almacenes físicos.
Al trabajar con certificados, necesitaremos una forma de filtrar y seleccionar credenciales para realizar operaciones específicas. Por ejemplo, filtraremos y seleccionaremos certificados según el valor de una extensión en particular.
Necesitamos comenzar enumerando todos los certificados instalados en el almacén de CA raíz para los siguientes ejemplos.
Get-ChildItem -Path Cert:\CurrentUser\Root\
Los objetos devueltos son objetos de certificado, que podemos utilizar en los ejemplos a continuación. Los objetos de certificado ya tienen extensiones comunes como propiedades.
Así que usaremos Get-Member
para enumerar todas las propiedades de los objetos devueltos en el ejemplo a continuación.
Código de ejemplo:
# gci is an alias of Get-ChildItem
gci -Path Cert:\CurrentUser\Root | Get-Member -MemberType Properties
Producción :
TypeName: System.Security.Cryptography.X509Certificates.X509Certificate2
Name MemberType Definition
---- ---------- ----------
PSChildName NoteProperty string PSChildName=EBE112F56D5FE0BA23289319C89D7784A10CEB61
PSDrive NoteProperty PSDriveInfo PSDrive=Cert
PSIsContainer NoteProperty bool PSIsContainer=False
<SNIP>
Como podemos ver en la salida, varias extensiones nos ayudan a localizar el certificado que buscamos. Las extensiones incluyen detalles sobre el certificado, como a quién se le otorgó, para qué se puede usar, etc.
Tendremos que buscar certificados con otras extensiones, como la plantilla de certificado, utilizada en casos de uso más complejos. El problema es que los valores de estas extensiones se devuelven como una matriz de enteros, y estos enteros representan contenido codificado ASN.1
.
Obtendremos manualmente el uso de clave en el siguiente comando para ver esta relación.
((gci -Path Cert:\CurrentUser\Root\ | select -First 1).Extensions | Where-Object {$_.Oid.FriendlyName -eq "Key Usage"}).format($true)
El método de formato, que realiza la decodificación ASN.1
, es la nueva pieza que presentamos en las instrucciones anteriores. Especificamos si queremos que el objeto devuelto sea de una sola línea o de varias líneas pasando un valor booleano (por ejemplo, $true
) arriba.
En el siguiente comando, utilizaremos el valor de huella digital del certificado. El valor de la huella digital se establece como una variable de Windows PowerShell y se usa para elegir la certificación adecuada en los siguientes comandos.
$thumb = "cdd4eeae6000ac7f40c3802c171e30148030c072"
Get-ChildItem -Path Cert:\CurrentUser\Root\ | Where-Object {$_.Thumbprint -eq $thumb}
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn