Я создал 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);
. Я не понимаю, в чем именно проблема. Он возвращает ошибку:
Система не может найти указанный файл.
Любая помощь будет принята с благодарностью. Спасибо!