Exemple #1
0
        /// <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);
            }
        }
Exemple #2
0
        /// <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);
            }
        }