Createx509certificate2如何给出证书字节和私钥 - dnx50

时间:2016-03-29 19:59:36

标签: x509certificate2 dnx50

基本上我正在使用LetsEncrypt服务来获取证书byte [],我可以将其转换为X509Certificate2但是它缺少私钥然后在SSLStream上使用它。我有私钥作为RSAParameters,但也可以将其转换为byte []但我似乎无法找到一种方法在同一个X509Certificate2中将2组合在一起,所以我可以将它用于SSLStream上的AuthenticateAsServer。就我所知,你用于dotnet 4的方法似乎并不适用于dnx50。我的工作示例将是完美的,我想在dnx50中保留解决方案,因为我想将其部署到Linux和Windows框。

基本上尝试做类似于Convert Certificate and Private Key to .PFX programatically in C#的事情,但只是创建带有私钥的X509,虽然保存将是我的下一个任务。

据我所知,到目前为止我认为dnx50不允许你创建一个cetificate对象,然后像dotnet 4那样添加一个私钥。相反,我认为我需要传入一个文件或字节[],其中包含两个为此工作,但我不知道如何合并我的2字节数组或格式化它们。

1 个答案:

答案 0 :(得分:0)

最后为此制定了解决方案。不理想,但它的工作原理。基本上它使用bouncyCastle来创建一个pfx流,然后你可以读取它以加载带有证书的私钥。要在CoreCLR上执行此操作,我使用nuget包Portable.BouncyCastle:1.8.1,并将以下代码放入帮助程序类中。

public X509Certificate2 CreateX509Certificate2(RSAParameters keys, byte[] certificateBytes, string friendlyName)
    {

        if (string.IsNullOrWhiteSpace(friendlyName))
        {
            friendlyName = "default";
        }

        var store = new Pkcs12Store();
        var convertedKeys = GetRsaKeyPair(keys);
        var certificate = new X509CertificateParser().ReadCertificate(certificateBytes);

        store.SetKeyEntry(friendlyName, new AsymmetricKeyEntry(convertedKeys.Private), new X509CertificateEntry[] { new X509CertificateEntry(certificate)});
        using (MemoryStream ms = new MemoryStream())
        {
            var random = new SecureRandom();
            string password = random.Next().ToString() + random.Next().ToString() + random.Next().ToString();
            store.Save(ms, password.ToCharArray(), random);
            var cert = new X509Certificate2(ms.ToArray(), password, X509KeyStorageFlags.Exportable);
            return cert;
        }
    }


    private AsymmetricCipherKeyPair GetRsaKeyPair(
       RSAParameters rp)
    {
        BigInteger modulus = new BigInteger(1, rp.Modulus);
        BigInteger pubExp = new BigInteger(1, rp.Exponent);

        RsaKeyParameters pubKey = new RsaKeyParameters(
            false,
            modulus,
            pubExp);

        RsaPrivateCrtKeyParameters privKey = new RsaPrivateCrtKeyParameters(
            modulus,
            pubExp,
            new BigInteger(1, rp.D),
            new BigInteger(1, rp.P),
            new BigInteger(1, rp.Q),
            new BigInteger(1, rp.DP),
            new BigInteger(1, rp.DQ),
            new BigInteger(1, rp.InverseQ));

        return new AsymmetricCipherKeyPair(pubKey, privKey);
    }