Página 1 de 1

Creación de un paquete para instalar certificados en la Tienda Windows

Publicado: 18 de junio de 2021 - 17:06
por megs
Buen día,

Estoy intentando crear un paquete para instalar certificados en toda la flota.
En la sección de instalación hago esto:

Código: Seleccionar todo

CPath=r'C:\CERTIFMAAF'
ROOTlist=['IGCAACracineEtatfrancais.crt']
CINTList=['ACAGENTSAGRIALIMAUTONOME.crt',
          'ACAGENTSAVANCEE.crt',
          'ACAGENTSDDIAVANCEE.crt',
          'ACAGENTSDDISTANDARD.crt',
          'ACAGENTSSTANDARD.crt',
          'ACDISPOSITIFTECHNIQUE.crt',
          'ACDISPOSITIFTECHNIQUEDDI.crt',
          'ACPARTENAIRESAGRIALIMAUTONOME.crt',
          'ACPARTENAIRESAVANCEE.crt',
          'ACPARTENAIRESSTANDARD.crt',
          'ACRACINEAGRIALIMAUTONOME.crt',
          'ACRACINEMINISTEREENCHARGEDELAGRICULTURE.crt',
          'ACSERVEURSAGRIALIMAUTONOME.crt',
          'ACSERVEURSAVANCEE.crt',
          'ACSERVEURSDDISTANDARD.crt',
          'ACSERVEURSPARTENAIRESAGRIALIMAUTONOME.crt',
          'ACSERVEURSSTANDARD.crt',
          'ACUSAGERS.crt']

def install():
    if isdir(CPath):
        print('-- Déjà en place, on passe...')
    else:
        mkdirs (CPath)
        copytree2(r'.\CERTIFMAAF',CPath ,onreplace=default_overwrite)
        for cert in (ROOTlist):
            print (" Installing " + cert + " in Trusted Root CA Store.")
            cmd=r'certutil.exe -silent -addstore root {}\{}.crt'.format(CPath,cert)
            run_notfatal(cmd)
        for cert in (CINTList):
            print (" Installing " + cert + " in Trusted Intermediaries CA.")
            cmd=r'certutil.exe -silent -addstore ca {}\{}.crt'.format(CPath,cert)
            run_notfatal(cmd)
No tengo ningún error (normal, está en modo silencioso), salvo que no se instalan los certificados.
¿Es un problema de derechos? ¿La cuenta del equipo/sistema no puede integrar certificados?
¿Cómo puedo hacer que funcione?

Re: Creación de un paquete para instalar certificados en la Tienda Windows

Publicado: 21 de junio de 2021 - 15:45
por dcardon
Hola Megs,

En el código, la sustitución parece agregar un archivo .crt al nombre del archivo que ya contiene un archivo .crt:

Código: Seleccionar todo

{}\{}.crt
El agente WAPT ejecuta el contenido de la función `def install()` como una cuenta del sistema local, por lo que tiene permisos para agregar certificados al almacén local. Sin embargo, se debe tener cuidado al crear directorios en la raíz (C:\CERTIFMAAF) con permisos heredados para evitar que otros usuarios escriban en ellos. De hecho, no es necesario realizar una copia intermedia en C:\CERTIFMAAF (si no hay otras aplicaciones que necesiten acceder a los archivos .crt), y se puede usar `certutil` directamente desde el directorio de instalación del paquete WAPT.

Atentamente,

Denis

Re: Creación de un paquete para instalar certificados en la Tienda Windows

Publicado: 21 de junio de 2021 - 16:21
por megs
Sí, efectivamente, era viernes por la noche, así que... :rollo: .
Además, no entiendo bien las rutas, así que no hay forma de recuperar la ruta correcta del certificado a menos que la copie a un lugar donde sepa con certeza dónde está. Probé la ruta .\CERTIFMAAF, pero ¡zas!... no la encontré. :jajaja:

Pero de todas formas no cambia nada. Certutils no funciona mediante el símbolo del sistema. Sin embargo, funciona con PowerShell, ya que no llama a un ejecutable externo.

He compilado una versión más sencilla y fácil de usar para todos (no probada en Win 7). Si lo desea, puede usarla como guía. Probada y funcionando en Win 10. WAPT 1.8.2. Versión principal de Linux.

Código: Seleccionar todo

from setuphelpers import *
import os

uninstallkey = []
CRootPath=r'C:\CERTIFMAAF\ROOT'
CCaPath=r'C:\CERTIFMAAF\CA'
Certlist=[]

def install():
    global CRootPath
    global CCaPath
    global Certlist

    if isdir(CRootPath):
        print("-- Déjà en place, on passe...")
    else:
        copytree2(r'.\CERTIFMAAF',r'C:\CERTIFMAAF' ,onreplace=default_overwrite)

        for cert in os.listdir(CRootPath):
            cmd=r'import-certificate {}\{} -CertStoreLocation "Cert:\LocalMachine\Root"'.format(CRootPath,cert)
            print (cmd)
            run_powershell(cmd)
        for cert in os.listdir(CCaPath):
            cmd=r'import-certificate {}\{} -CertStoreLocation "Cert:\LocalMachine\CA"'.format(CCaPath,cert)
            print (cmd)
            run_powershell(cmd)

def uninstall():
    if isdir(CRootPath):
        print ("Removing... ")
        remove_tree (CPath)
        for cert in (RemoveList):
            print (" Removing ALL IGC and AC in Trusted Root & CA Store.")
            cmd=r'get-childitem cert:"LocalMachine\Root" | Where-object {$_.subject -like "CN=IGC/A AC*"} | ForEach-Object {Remove-Item -Path "Cert:\LocalMachine\CA\$($_.Thumbprint)"}'
            run_powershell(cmd)
            cmd=r'get-childitem cert:"LocalMachine\CA" | Where-object {$_.subject -like "CN=AC *"} | ForEach-Object {Remove-Item -Path "Cert:\LocalMachine\CA\$($_.Thumbprint)"}'
            run_powershell(cmd)
Finalmente, solo me queda averiguar cómo encontrar el identificador de cada certificado de la carpeta y su contenido almacenado, y luego eliminarlos de forma selectiva para crear un paquete generalizado. Pero no tengo tiempo.