/// <summary> /// Generar certificado SSL /// </summary> /// <param name="crt">Ruta para el certificado</param> /// <param name="csr">Ruta a la solicitud de firmado a utilizar</param> /// <param name="ca">Ruta al certificado de la autoridad de certificación a utilizar</param> /// <param name="caKey">Ruta a la llave de la autoridad de certificación a utilizar</param> /// <param name="caPass">Contraseña de la llave de la autoridad de certificación a utilizar</param> /// <param name="days">Dias que durara el certificado antes de expirar</param> /// <param name="usePipe">Establecer si se debe utilizar un conducto nombrado para compartir la contraseña</param> /// <returns>Ruta al certificado creado en caso de exito o null en caso de error</returns> public static async Task <string> GenerateCrt(string crt, string csr, string ca, string caKey, string caPass, int days = 1825, int maxWait = 2000, bool usePipe = true) { if (!File.Exists(csr)) { throw new FileNotFoundException("No existe la solicitud de firmado provista", csr); } if (!File.Exists(ca)) { throw new FileNotFoundException("No existe el certificado de CA provisto", ca); } if (!File.Exists(caKey)) { throw new FileNotFoundException("No existe la llave del certificado de CA provista", caKey); } string passAccess = null; PasswordPipe pipe = null; if (usePipe) { pipe = new PasswordPipe(caPass); caPass = null; passAccess = $"file:{pipe.Path}"; } else { passAccess = $"pass:{caPass}"; } Process sslProcess = CreateProcess() .WithArguments($"x509 -req -in \"{csr}\" -CA \"{ca}\" -CAkey \"{caKey}\" -passin \"{passAccess}\" -CAcreateserial -out \"{crt}\" -days {days} -sha256"); sslProcess.Start(); if (usePipe) { await pipe.WaitRead(); } if (sslProcess.WaitForExit(maxWait)) { return(crt); } else { sslProcess.Kill(); Files.DeleteIfExists(crt); return(null); } }
/// <summary> /// Convertir certificado y llave a un certificado PKCS12 /// </summary> /// <param name="pfx">Ruta para el certificado generado</param> /// <param name="crt">Certificado de entrada</param> /// <param name="key">Llave de para el certificado de entrada</param> /// <param name="pass">Contraseña a utilizar</param> /// <param name="maxWait">Máximo tiempo a esperar por el proceso de conversión</param> /// <param name="usePipe">Establecer si se debe utilizar un conducto nombrado para compartir la contraseña</param> /// <returns>Ruta al certificado creado o null en caso que haya fallado el proceso</returns> public static async Task <string> ConvertToPkcs12(string pfx, string crt, string key, string pass, int maxWait = 1000, bool usePipe = true) { if (!File.Exists(crt)) { throw new FileNotFoundException("No existe el certificado provisto", crt); } if (!File.Exists(key)) { throw new FileNotFoundException("No existe la llave de certificado provista", key); } string passAccess = null; PasswordPipe pipe = null; if (usePipe) { pipe = new PasswordPipe(pass); pass = null; passAccess = $"file:{pipe.Path}"; } else { passAccess = $"pass:{pass}"; } Process sslProcess = CreateProcess() .WithArguments($"pkcs12 -export -out \"{pfx}\" -inkey \"{key}\" -in \"{crt}\" -password \"{passAccess}\""); sslProcess.Start(); if (usePipe) { await pipe.WaitRead(); } if (sslProcess.WaitForExit(maxWait)) { return(crt); } else { sslProcess.Kill(); Files.DeleteIfExists(crt); return(null); } }