Система не может найти файл, указанный для DotNetUtilities.ToRSA (rsaparams) Ошибка - PullRequest
0 голосов
/ 06 августа 2020

Я создал CA root и промежуточные сертификаты в asp. net основной веб-API c#. Вот мой промежуточный код генерации:

         public X509Certificate2 intermediate(int ValidityInYears){
            try
            {
                const int keyStrength = 2048;
                AsymmetricKeyParameter rootPK = null;

                // Generating Random Numbers
                CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator();
                SecureRandom random = new SecureRandom(randomGenerator);
                //get root private key from file
                string rootKeyPathFromConfig = Configuration["root_privatekeylocation"];
                if (System.IO.File.Exists(rootKeyPathFromConfig))
                {
                    using (var reader = System.IO.File.OpenText(rootKeyPathFromConfig)) // file containing RSA PKCS1 private key
                    {
                        AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
                        rootPK = keyPair.Private;
                    }
                }
                else
                {
                    return constants.ROOTKEYERROR;
                }

                ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA256WITHRSA", rootPK, random);
                
                // The Certificate Generator
                X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();

                certificateGenerator.AddExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(new List<DerObjectIdentifier>() { new DerObjectIdentifier("1.3.6.1.5.5.7.3.1") }));
                
                // Serial Number
                BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
                certificateGenerator.SetSerialNumber(serialNumber);
                
                // Issuer and Subject Name
                string pathToRootCert = Configuration["rootcertificatelocation"];
                string rootIssuer = rootBusinessLogic.ImportIssuerFromPem(pathToRootCert);
                string subjectName = constants.INTERMEDIATESUBJECTNAME;
                X509Name subjectDN = new X509Name(subjectName);
                X509Name issuerDN = new X509Name(rootIssuer);
                certificateGenerator.SetIssuerDN(issuerDN);
                certificateGenerator.SetSubjectDN(subjectDN);
                // Valid For
                DateTime notBefore = DateTime.UtcNow.Date;
                DateTime notAfter = notBefore.AddYears(ValidityInYears);

                certificateGenerator.SetNotBefore(notBefore);
                certificateGenerator.SetNotAfter(notAfter);
                // Subject Public Key
                AsymmetricCipherKeyPair subjectKeyPair;
                var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength);
                var keyPairGenerator = new RsaKeyPairGenerator();
                keyPairGenerator.Init(keyGenerationParameters);
                subjectKeyPair = keyPairGenerator.GenerateKeyPair();
                certificateGenerator.SetPublicKey(subjectKeyPair.Public);

                // Generating the Certificate
                AsymmetricCipherKeyPair issuerKeyPair = subjectKeyPair;

                // Selfsign certificate
                Org.BouncyCastle.X509.X509Certificate certificate = certificateGenerator.Generate(signatureFactory);
                // Corresponding private key
                PrivateKeyInfo info = PrivateKeyInfoFactory.CreatePrivateKeyInfo(subjectKeyPair.Private);
                
                // Merge into X509Certificate2
                X509Certificate2 x509 = new X509Certificate2(certificate.GetEncoded());
                Asn1Sequence seq = (Asn1Sequence)Asn1Object.FromByteArray(info.ParsePrivateKey().GetDerEncoded());
                if (seq.Count != 9)
                {
                    throw new PemException("malformed sequence in RSA private key");
                }
                
                RsaPrivateKeyStructure rsa = RsaPrivateKeyStructure.GetInstance(seq);
                RsaPrivateCrtKeyParameters rsaparams = new RsaPrivateCrtKeyParameters(
                    rsa.Modulus, rsa.PublicExponent, rsa.PrivateExponent, rsa.Prime1, rsa.Prime2, rsa.Exponent1, rsa.Exponent2, rsa.Coefficient);
                
                var rsanew = DotNetUtilities.ToRSA(rsaparams);
                var cert = x509.CopyWithPrivateKey(rsanew);

                return cert;
            }
            catch (Exception ex)
            {
               return null;
            }

}

rootKeyPathFromConfig - это расположение закрытого ключа эмитента, pathToRootCert - это путь к сертификату эмитента, а ImportIssuerFromPem - это метод получения имени издателя из сертификата. Этот код отлично работает локально, но на хост-сервере он выдает ошибку для var rsanew = DotNetUtilities.ToRSA(rsaparams);. Я не понимаю, в чем именно проблема. Он возвращает ошибку:

Система не может найти указанный файл.

Любая помощь будет принята с благодарностью. Спасибо!

...