Última hora: Keyfactor adquiere InfoSec Global y CipherInsights | Soluciones integrales para descubrimiento, control y agilidad

  • Inicio
  • Blog
  • Gestión eficaz de certificados digitales con API

Gestión eficaz de certificados digitales con API

Una buena API marca la diferencia entre una aplicación software y una plataforma software . Sin una API, un producto software es una herramienta especial para un conjunto predefinido de operaciones específicas. Sin embargo, con una buena API, puede convertirse en una plataforma potente y modular con capacidades que van mucho más allá de lo que sus desarrolladores imaginaron en un principio.

Tareas que de otro modo requerirían miles de clics y pulsaciones de teclas pueden reducirse a una sola pulsación para lanzar un script. Y los procesos empresariales que requieren varias aplicaciones de software pueden integrarse a la perfección para que los usuarios finales ni siquiera tengan que saber qué software se está utilizando. Todo esto es cierto con CMS, y con el lanzamiento de CMS 5.0 y el SDK CMS PowerShell, las capacidades basadas en API de CMS son más potentes que nunca y más fáciles de usar.

Provisión de certificados digitales

Considere el siguiente escenario: Una docena de empleados se unen a su equipo de desarrollo desde otro sitio. Ya disponen de estaciones de trabajo, pero no tienen los certificados de cliente necesarios para acceder a su repositorio de código fuente.

Lo sabes:

  1. Haga que su administrador de sistemas vaya a cada estación de trabajo, se inscriba para obtener un certificado y lo instale.
  2. Indique a todos los empleados que visiten el portal de inscripción de CMS y soliciten un certificado, apruebe las solicitudes e indique a los empleados que los instalen en el lugar correcto.
  3. Ejecute una secuencia de comandos PowerShell de 15 líneas que busque los ordenadores de los usuarios, obtenga un certificado para cada uno de ellos y envíe automáticamente el certificado al almacén del equipo correspondiente a través del agente de Windows de CMS.

En los dos primeros casos, es necesaria la coordinación entre más de una docena de personas. Y no sólo eso, estas opciones no ayudan en nada a la siguiente docena de empleados que se incorporen. Sin embargo, con una solución basada en API, puede desarrollar un proceso automatizado y repetible en un breve y sencillo script de PowerShell. Un script al que no le importa si está emitiendo una docena de certificados para nuevos empleados o diez mil certificados para toda la organización. Tal script se muestra al final de este post como "Script 1". Además, si puede ejecutar el script desde otra parte del proceso de incorporación y aprovisionamiento, dispondrá de una solución sin intervención para emitir certificados cada vez que los necesite.

Gestión de certificados digitales

El CMS también puede ayudar en el caso contrario. Supongamos que un grupo de empleados abandona una división. Cada uno de los empleados tenía certificados personales, así como certificados en sus estaciones de trabajo y otros dispositivos, para acceder a una variedad de aplicaciones específicas del grupo. Usted desea revocar inmediatamente todos los certificados a los que estos empleados tienen acceso.

Lo sabes:

  1. Haga que sus administradores de sistemas escaneen sus máquinas en busca de certificados instalados, escanee las CA en busca de certificados emitidos para ellos, revoque esos y espere haberlos encontrado todos.
  2. Utilice el portal de gestión de CMS para examinar a los empleados y los puestos de trabajo, buscar los certificados que se les hayan expedido o que estén presentes en sus dispositivos y revocarlos manualmente.
  3. Ejecute una secuencia de comandos PowerShell de 15 líneas que busque en su inventario de certificados todos los certificados emitidos a estos usuarios o presentes en su estación de trabajo, y los revoque todos automáticamente.

Una vez más, sólo unas pocas líneas de script permiten realizar operaciones sensibles al tiempo de forma rápida, consistente y completa, sin tener en cuenta cuántos usuarios y máquinas se ven afectados, o cuándo y con qué frecuencia se ejecuta. Al final también se proporciona un script de ejemplo para esto, etiquetado como "Script 2".

Esta API tampoco se limita en modo alguno a los cambios de personal. Los escenarios en los que las máquinas virtuales se ponen en marcha dinámicamente para las pruebas de software u otros casos en los que se necesita un entorno aislado pueden aprovechar el SDK de PowerShell al inicio para aprovisionar los certificados necesarios para las aplicaciones. Los servidores web con certificados que caducan pueden, sin intervención del personal, generar automáticamente un par de claves pública/privada y utilizarlo para solicitar un nuevo certificado con el mismo contenido que garantice el funcionamiento continuado del servidor. La migración de certificados de algoritmos criptográficos obsoletos (o peor aún, de una CA comprometida) a algoritmos más nuevos y seguros (como de SHA-1 a SHA-2) puede orquestarse fácilmente para que se produzca a gran escala.

Desarrollo seguro de aplicaciones con API

Mientras que el SDK de PowerShell puede ayudar con muchos problemas encontrados en la administración de sistemas y escenarios DevOps, hay por supuesto escenarios donde el scripting de PowerShell no es la mejor herramienta. Para los desarrolladores de software que buscan añadir o mejorar el uso de certificados en su aplicación, o para los administradores que trabajan en un entorno en el que PowerShell no es compatible, la CMS Web API puede ser de gran utilidad. Por ejemplo, una aplicación web puede acceder a toda la misma funcionalidad que proporciona el SDK de PowerShell realizando solicitudes AJAX desde JavaScript. Del mismo modo, los desarrolladores de software que escriban aplicaciones en Java u otros lenguajes populares pueden aprovechar las mismas API. Una aplicación que se ejecute en Linux puede acceder a las API a través de un script de Python o cualquier otro sistema capaz de generar peticiones HTTP, por lo que los servidores Linux con certificados que caduquen o que estén inmersos en una migración de SHA-1 a SHA-2 pueden seguir obteniendo nuevos certificados con la generación de claves en el dispositivo. Del mismo modo, los scripts PowerShell que utilizan el SDK de los escenarios anteriores podrían implementarse en cualquier otro lenguaje utilizando la API Web en lugar del SDK.

Otra característica de CMS para la que la API Web y el SDK PowerShell amplían significativamente otras capacidades son los metadatos del certificado. Aunque se puede incluir una gran cantidad de información en un certificado, no hay forma de cambiar estos datos una vez que el certificado se ha emitido y firmado criptográficamente. Los certificados etiquetados con metadatos pueden abordar situaciones en las que los datos asociados pueden cambiar a lo largo de la vida de un certificado. Esto incluye información que describa al individuo o grupo propietario del certificado, las aplicaciones que dependen de él, la fecha en la que debe renovarse, futuros planes de migración o cualquier otro contenido que esté sujeto a cambios o no se conozca en el momento de su emisión. Este sistema de etiquetado de metadatos también puede utilizarse para habilitar y deshabilitar dinámicamente el acceso a otras aplicaciones por ubicación, hora del día u otros criterios. Al final se proporciona un script python de ejemplo como "Script 3", que comprueba mediante programación si un certificado (proporcionado en codificación PEM base64) está habilitado.

De hecho, con nuestras herramientas como la Válvula de Acceso CMS VerdeTTo, puede añadir estos mecanismos de autenticación mejorados a nivel de plataforma de servidor sin modificar su código backend. Así, en el segundo escenario anterior, los certificados de los empleados que se marchan podrían desactivarse temporalmente en lugar de revocarse directamente mediante la actualización de un valor de metadatos. Esto significaría que, si la desactivación de un certificado resulta afectar a otros usuarios o sistemas, ese certificado podría volver a activarse temporalmente caso por caso hasta que pueda emitirse un certificado de sustitución. No sólo eso, sino que con el método "Renew" de la Web API o el correspondiente cmdlet de PowerShell, estos certificados pueden renovarse rápidamente e instalarse automáticamente en todas las ubicaciones en las que sigan siendo necesarios. En todos estos casos y en muchos otros, la API Web de CMS proporciona la forma más sencilla de implantar procesos repetibles y fiables a la vez que se ahorra tiempo y se minimizan los riesgos.

Script 1: PowerShell para la inscripción e instalación automáticas de certificados en los equipos de los usuarios de destino.

 

Param ([pscredential]$cred, [string]$UsersFile, [string]$APISecret) 

# CMS client general configuration
$APIApp = New-CMSEnrollmentContext -Key "607616a3fc0b7c749d27" - Secret $APISecret

# List the accounts of users who need certificates
$Users = Get-Content -Path ]$UsersFile 

# Get the list of machines in the environment
$Computers = Get-ADComputer -Filter {(enabled -eq "true")} 
$Computers = $Computers | Select-Object -ExpandProperty DnsHostName 

# Find the computers used by the employees who need certificates
ForEach($Computer in $Computers){
  $Profiles = Get-WmiObject -Class Win32_UserProfile -Computer $Computer
  ForEach($Profile in $Profiles){
    $profileSID = New-Object System.Security.Principal.SecurityIdentifier($Profile.sid)
    $username = $profileSID.Translate([System.Security.Principal.NTAccount]).value
    if($Users.Contains($username)){  # This is a machine that needs a new cert
        # Define a certificate store
        $store = Add-CMSCertificateStore -ClientMachine $Computer -CertificateStoreType 
            "IIS Personal" -StorePath "IIS Personal" -Password (ConvertTo-SecureString 
            "password" -AsPlainText -force) -AgentName Dev1.dev.cms -CMSUri 
            https://localhost/CMSAPI -Credential $cred
        # Request a certificate as a PFX
        $pfx = New-CMSPfxEnrollment -ApiEnrollmentContext $APIApp -TemplateName 
            "UserServer" -PfxPassword $password -SubjectName "CN=$username" -CMSUri 
            https://localhost/CMSAPI -Credential $cred
        # Schedule the new PFX to be added to the new store.
        Add-CMSCertificateStoreCert -CertificateStore $store -PFX $pfx.Pkcs12Blob 
            -PfxPassword $password -HasEntryPassword $FALSE -Overwrite $TRUE 
            -Alias "sourceControlCert" -CMSUri https://localhost/CMSAPI -Credential $cred
    }
  }
} 

 

 

Script 2: PowerShell para la revocación automática de certificados para usuarios objetivo y sus máquinas.

 

Param ([pscredential]$cred, [string]$UsersFile, [string]$MachinesFile) 

# List the accounts of users with certificates to be revoked
$Users = Get-Content -Path $UsersFile

# Find certificates issued to any of these users and revoke them
ForEach($User in $Users){
    $certs = Search-CMSCertificate -Query ("CN -contains ""$User""") -CMSUri 
        https://localhost/CMSAPI -Credential $cred
    ForEach($cert in $certs){
        Revoke-CMSCertificate -Info $cert -Comment "Cessation of operation" -Reason 5 
            -CMSUri https://localhost/CMSAPI -Credential $cred
    }
}

# Get the list of machines (by hostname) used by these employees
$Machines = Get-Content -Path $MachinesFile 

# Find certificates present on any of these machines and revoke them
ForEach($Machine in $Machines){
    $stores = Show-CMSCertificateStores -CMSUri https://localhost/CMSAPI -Credential $cred 
        | Where-Object {$_.ClientMachine -eq $Machine}
    ForEach($store in $stores){
        $inventory = Get-CMSCertificateStoreInventory -CertificateStore $store -CMSUri 
            https://localhost/CMSAPI -Credential $cred
        $certIds = $inventory | Select-Object -ExpandProperty Certificates 
            | Select-Object -ExpandProperty CertificateId
        Foreach ($certId in $certIds){
            Revoke-CMSCertificate -CMSID $certId -Comment "Cessation of operation" 
                -Reason 5 -CMSUri https://localhost/CMSAPI -Credential $cred
        }
    

 

 

Script 3: Python utiliza la CMS Web API para determinar, basándose en un valor de metadatos, si un cert está habilitado.

<td”>

import base64       # For encoding credentials
import json         # For decoding http response
import urllib2      # For http request
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes

# Sends an HTTP request and returns the response
def getResponse(endpoint, data, credentials):
  request = urllib2.Request(endpoint)
  request.add_header("Authorization","Basic " + base64.b64encode(credentials))
  request.add_header("Content-Type", "application/json")
  request.add_data(data)
  return urllib2.urlopen(request).read()

# Returns whether or not the certificate is enabled via CMS Web API.
# Uses the certificate thumbprint to identify the cert to the metadata API.
def checkAccessEnabled(PEM_cert, credentials):
  certificate = x509.load_pem_x509_certificate(PEM_cert, default_backend())
  thumbprint = certificate.fingerprint(hashes.SHA1()).encode("hex")
  endpoint = "https://localhost/CMSAPI/Metadata/2/Compare"
  data = '{"Key" : "Thumbprint", "Thumbprint" : "'+thumbprint+'","metadatalist" : {"isEnabled" : "True"}}'
  return json.loads(getResponse(endpoint, data, credentials))

Para obtener más información sobre cómo hacer operativa la gestión de certificados con eficacia, descargue el documento técnico Automatización de PKI para el futuro: