Necesito descargar e instalar aproximadamente 50 CRL una vez por semana e instalarlas en varios servidores de Windows. La descarga es la parte fácil, ¿hay alguna forma de que pueda programar el proceso de importación de CRL?Programar la instalación de la Lista de revocación de certificados (CRL)
Respuesta
No sé cómo hacerlo a través de secuencias de comandos. ¿Puedes escribir el código C? Si entiendo lo que quiere hacer, usará la función CryptUiWizImport y la estructura CRYPTUI_WIZ_IMPORT_SRC_INFO.
Aquí hay un sample of code that installs a Cert; la importación de CRL correspondiente es similar.
Addendum:
This post señala que API Win32 (tales como CryptUiWizImport) no son directamente accesibles desde PowerShell y, a continuación se describe una posible solución: desde dentro de la secuencia de comandos PowerShell, dinámicamente generar y compilar código C# que hace el P/Invoca cosas, y luego ejecuta el ensamblaje resultante. Esto le permitiría hacer el CryptUiWizImport estrictamente desde un script de powershell, aunque sería muy exótico.
Envolví la función CryptUIWizImport como una aplicación de consola C# y funciona como un amuleto para instalar certificados y CRL. ¡Muchas gracias! – Goyuix
¿Está interesado en publicar la fuente para ayudar a la siguiente persona? – Cheeso
Estaría realmente interesado en la fuente ... porque tengo exactamente el mismo problema. – Mephisztoe
En Powershell hay un proveedor Cert:
que representa la tienda de certificados. La manipulación se realiza a través de los cmdlets estándar, por lo que es posible que pueda integrar una lista de revocación en algún lugar. Simplemente no sé lo suficiente sobre cómo maneja Windows los certificados para que sirvan de ayuda aquí.
Hm. ¿Hay alguna razón para no usar la utilidad certutil.exe? Puedo importar una lista de revocación de certificados en la tienda adecuada mediante la ejecución del siguiente comando:
certutil -addstore CA <FileName>.crl
certutil no es parte de una instalación estándar. Creo que solo está instalado cuando se han instalado los servicios de certificado (aunque podría estar equivocado). – Goyuix
Aquí es mi fuente final (ligeramente fregados para el público) - pero debería funcionar. No cambiaré la respuesta aceptada, pero sí espero que ayude (¡como lo hace la votación de la pregunta y las respuestas!).
Nota: Esto importará una CRL o un certificado normal en la tienda LOCAL MACHINE Trusted Root. Cambiando el siguiente CERT_SYSTEM_STORE_LOCAL_MACHINE
al CERT_SYSTEM_STORE_CURRENT_USER
en la llamada, CertOpenStore lo cambiará para funcionar para el almacén de Usuario Actual.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication2
{
class Program
{
public struct CRYPTUI_WIZ_IMPORT_SRC_INFO
{
public Int32 dwSize;
public Int32 dwSubjectChoice;
[MarshalAs(UnmanagedType.LPWStr)]public String pwszFileName;
public Int32 dwFlags;
[MarshalAs(UnmanagedType.LPWStr)]public String pwszPassword;
}
[DllImport("CryptUI.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean CryptUIWizImport(
Int32 dwFlags,
IntPtr hwndParent,
IntPtr pwszWizardTitle,
ref CRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc,
IntPtr hDestCertStore
);
[DllImport("CRYPT32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CertOpenStore(
int storeProvider,
int encodingType,
IntPtr hcryptProv,
int flags,
String pvPara
);
public const Int32 CRYPTUI_WIZ_IMPORT_SUBJECT_FILE = 1;
public const Int32 CRYPT_EXPORTABLE = 0x00000001;
public const Int32 CRYPT_USER_PROTECTED = 0x00000002;
public const Int32 CRYPTUI_WIZ_NO_UI = 0x0001;
private static int CERT_STORE_PROV_SYSTEM = 10;
private static int CERT_SYSTEM_STORE_CURRENT_USER = (1 << 16);
private static int CERT_SYSTEM_STORE_LOCAL_MACHINE = (2 << 16);
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Usage: certimp.exe list.crl");
Environment.ExitCode = 1;
}
else
{
IntPtr hLocalCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
IntPtr.Zero,
CERT_SYSTEM_STORE_LOCAL_MACHINE,
"ROOT"
);
CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc = new CRYPTUI_WIZ_IMPORT_SRC_INFO();
importSrc.dwSize = Marshal.SizeOf(importSrc);
importSrc.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_FILE;
importSrc.pwszFileName = args[0];
importSrc.pwszPassword = null;
importSrc.dwFlags = CRYPT_EXPORTABLE | CRYPT_USER_PROTECTED;
if (!CryptUIWizImport(
CRYPTUI_WIZ_NO_UI,
IntPtr.Zero,
IntPtr.Zero,
ref importSrc,
hLocalCertStore
))
{
Console.WriteLine("CryptUIWizImport error " + Marshal.GetLastWin32Error());
Environment.ExitCode = -1;
}
}
}
}
}
Nota: También puede crear un X509Store, Open() y pasar su propiedad StoreHandle como último argumento para CryptUIWizImport. – voetsjoeba
Nota: a pesar de lo que dice la documentación, ninguno de los indicadores CRYPTUI_WIZ_NO_UI impide que un cuadro de diálogo emergente pregunte "¿Desea reemplazar la CRL actual?" cuando la tienda objetivo ya contiene una CRL con el mismo o más nuevo tiempo de validez. (Probado en Win2008 R2) – voetsjoeba
Nota: Para una forma más directa de agregar una CRL a un almacén de certificados de Windows que (potencialmente) pasar por una IU, puede P/invocar la función CertAddCRLContextToStore Win32 de crypt32.dll. – voetsjoeba
- 1. ¿OpenSSL maneja automáticamente CRL (listas de revocación de certificados) ahora?
- 2. Comprobación de revocación OCSP en toda la cadena de certificados
- 3. Invalidar caché CRL
- 4. C# verificar el certificado en la lista de CRL
- 5. ¿Cómo desactivar la revocación de certificados para un cliente del servicio WCF?
- 6. Instalación de certificados Advertencia de seguridad ¿Alternativa?
- 7. ¿Cómo se maneja la revocación de un certificado raíz?
- 8. Método X509Certificate2.Verify(), validación contra la lista de revocación e implicaciones de rendimiento de la misma
- 9. Android: Lista de certificados raíz confiables disponibles
- 10. Obtención de la cadena de certificados
- 11. Obtener una lista de certificados del almacén de certificados en C#
- 12. Certificados: ¿cuándo se instalan en el almacén de certificados?
- 13. .NET 3.5 falta de la lista desplegable de ASP.NET en IIS después de la nueva instalación
- 14. Instalación de VS2008 después de la instalación de VS2010
- 15. Instalación de easy_install ... para llegar a la instalación de lxml
- 16. Práctica para programar la competencia
- 17. Programar la máquina para reactivar
- 18. Verificar la instalación de ImageMagick
- 19. Manual de Android validación de la cadena de certificados X509
- 20. ¿Cómo leer certificados de mi tienda de certificados?
- 21. ¿Cómo uso SharpSVN para programar "agregar a la lista de ignorar" para una carpeta
- 22. Cambiar la carpeta de instalación de Visual Studio después de la instalación
- 23. Uso de D para programar la interfaz nativa de Java
- 24. La mejor manera de programar el sistema de Logros
- 25. . Proyecto de instalación basado en .NET falla en la instalación
- 26. Instalación de la biblioteca de socket Lua
- 27. Obtener la ruta de instalación de MySQL
- 28. Instalación de la versión anterior de gcc
- 29. Certificados de cliente encadenados
- 30. Especificar nombre del servicio de Windows en la instalación con la instalación de proyectos
¿Cuándo dice que la descarga es la parte fácil? ¿Puedes compartir tu técnica que usaste para lograr esto? Gracias – Raj
@Raj casi todas las autoridades de certificación o signatarios publicarán una ubicación de CRL como parte de los metadatos del certificado. Abra el certificado en cuestión y busque un campo llamado "Puntos de distribución CRL". Realmente esta es una pregunta general que debes hacer, no solo dejarla como comentario. – Goyuix
Sí, conozco los puntos de distribución como un campo en el certificado. Actualmente utilizo funciones de recuperación de objetos remotos, [CryptoAPI] para recuperar de los CDP. También entiendo que si solo copia la URL y las pasa en el navegador, CRL también se descargará. La razón por la que te pregunté como un comentario es que mencionaste que la recuperación de CRL es la parte fácil, así que asumí que tienes alguna utilidad o algo que hará esto por ti. Pero obviamente mi suposición era incorrecta. Gracias por responder. – Raj