Как создать Pkcs12Store из X509Certificate2 - PullRequest
1 голос
/ 29 марта 2020

У меня есть объект System.Security.Cryptography.X509Certificates.X509Certificate2. Я хочу создать экземпляр Pkcs12Store (Org.BouncyCastle.Pkcs), используя этот объект.

Я пытался:

Подход 1:

        public Pkcs12Store GetPkcs12Store(X509Certificate2 cert, string password)
        {
            byte[] rawdata = cert.RawData;
            MemoryStream memStream = new MemoryStream(rawdata);
            Pkcs12Store pk12;

            pk12 = new Pkcs12Store(memStream, password.ToCharArray());
            return pk12;
        }

В этом подходе я получаю исключение:

Unable to cast object of type 'Org.BouncyCastle.Asn1.DerSequence' to type 'Org.BouncyCastle.Asn1.DerInteger'.

Подход 2:

Я пытался:

        public static Pkcs12Store GetPkcs12Store(X509Certificate2 cert, string password)
        {
            Org.BouncyCastle.X509.X509Certificate bcCert;
            bcCert = DotNetUtilities.FromX509Certificate(cert);

            pk12 = new Pkcs12StoreBuilder().Build();
            X509CertificateEntry certEntry = new X509CertificateEntry(bcCert);
            pk12.SetCertificateEntry(bcCert.SubjectDN.ToString(), certEntry);

            AsymmetricKeyEntry keyEntry = new AsymmetricKeyEntry(bcCert.GetPublicKey());

            return pk12;
        }

В этом подход, я не получаю исключение, которое я получал ранее, но затем Pkcs12Store возвращает false для IsKeyEntry.

            string alias = null;

            foreach (object a in pk12.Aliases)
            {
                alias = ((string)a);
                if (pk12.IsKeyEntry(alias))
                {
                    break;
                }
            }
            ICipherParameters pk = pk12.GetKey(alias).Key;

Таким образом, код завершается ошибкой в ​​строке ICipherParameters pk = pk12.GetKey(alias).Key;

Подход 3:

        public static Pkcs12Store GetPkcs12Store(X509Certificate2 cert, string password)
        {
            Pkcs12Store pk12;
            byte[] rawdata;
            Org.BouncyCastle.X509.X509Certificate bcCert;
            rawdata = cert.Export(X509ContentType.Pfx, password);            
            MemoryStream memStream = new MemoryStream(rawdata);
            pk12 = new Pkcs12Store(memStream, password.ToCharArray());
            return pk12;
        }

При таком подходе я получаю ошибку: Key not valid for use in specified state. в утверждении cert.Export...

...