public static void WriteCertificateAsPem(byte[] rawBytes, string exportPassword, Stream s)
        {
            var a = new Pkcs12Store();

            a.Load(new MemoryStream(rawBytes), Array.Empty <char>());
            var entry = a.GetCertificate(a.Aliases.Cast <string>().First());
            var key   = a.Aliases.Cast <string>().Select(a.GetKey).First(x => x != null);

            using (var writer = new StreamWriter(s, Encoding.ASCII, 1024, leaveOpen: true))
            {
                var pw = new PemWriter(writer);
                pw.WriteObject(entry.Certificate);

                object privateKey;
                if (exportPassword != null)
                {
                    privateKey = new MiscPemGenerator(
                        key.Key,
                        "AES-128-CBC",
                        exportPassword.ToCharArray(),
                        CertificateUtils.GetSeededSecureRandom())
                                 .Generate();
                }
                else
                {
                    privateKey = key.Key;
                }
                pw.WriteObject(privateKey);

                writer.Flush();
            }
        }
        public void ConvertPfxToPem(
            string pfxPath,
            string pfxPassword,
            string keyPath)
        {
            using (Stream stream = File.Open(pfxPath, FileMode.Open))
            {
                Pkcs12Store pkcs = new Pkcs12Store(stream, pfxPassword.ToCharArray());

                foreach (string alias in pkcs.Aliases)
                {
                    if (pkcs.IsKeyEntry(alias) && pkcs.GetKey(alias).Key.IsPrivate)
                    {
                        AsymmetricKeyParameter privateKey = pkcs.GetKey(alias).Key;

                        using (Stream s = new FileStream(keyPath, FileMode.Create))
                            using (TextWriter textWriter = new StreamWriter(s))
                            {
                                var generator = new MiscPemGenerator(privateKey);

                                PemWriter pemWriter = new PemWriter(textWriter);
                                pemWriter.WriteObject(generator);
                                textWriter.Flush();
                            }
                    }
                }
            }
        }
Exemple #3
0
        public static void WriteCertificateAsPem(string name, byte[] rawBytes, string exportPassword, ZipArchive s)
        {
            var a = new Pkcs12Store();

            a.Load(new MemoryStream(rawBytes), Array.Empty <char>());

            X509CertificateEntry entry = null;
            AsymmetricKeyEntry   key   = null;

            foreach (var alias in a.Aliases)
            {
                var aliasKey = a.GetKey(alias.ToString());
                if (aliasKey != null)
                {
                    entry = a.GetCertificate(alias.ToString());
                    key   = aliasKey;
                    break;
                }
            }

            if (entry == null)
            {
                throw new InvalidOperationException("Could not find private key.");
            }

            using (var stream = s.CreateEntry(name + ".crt").Open())
                using (var writer = new StreamWriter(stream))
                {
                    var pw = new PemWriter(writer);
                    pw.WriteObject(entry.Certificate);
                }
            using (var stream = s.CreateEntry(name + ".key").Open())
                using (var writer = new StreamWriter(stream))
                {
                    var pw = new PemWriter(writer);

                    object privateKey;
                    if (exportPassword != null)
                    {
                        privateKey = new MiscPemGenerator(
                            key.Key,
                            "DES-EDE3-CBC",
                            exportPassword.ToCharArray(),
                            CertificateUtils.GetSeededSecureRandom())
                                     .Generate();
                    }
                    else
                    {
                        privateKey = key.Key;
                    }

                    pw.WriteObject(privateKey);

                    writer.Flush();
                }
        }
Exemple #4
0
        private static string ConvertToPemFormat(object input)
        {
            var generator = new MiscPemGenerator(input);

            string certificateString;

            using (var textWriter = new StringWriter())
            {
                var writer = new PemWriter(textWriter);
                writer.WriteObject(generator);
                writer.Writer.Flush();
                certificateString = textWriter.ToString();
            }

            if (string.IsNullOrWhiteSpace(certificateString))
            {
                throw new InvalidOperationException();
            }

            return(certificateString);
        }