首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Createx509certificate2如何给出证书字节和私钥- dnx50

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

Stack Overflow用户
提问于 2016-03-29 19:59:35
回答 1查看 427关注 0票数 0

基本上,我使用一个LetsEncrypt服务来获得一个证书byte[],它可以转换成一个X509Certificate2,但是它丢失了私钥,然后在SSLStream上使用它。我将私钥作为RSAParameters,但也可以将其转换为byte[],但我似乎无法找到将2放在同一个X509Certificate2中的方法,因此我可以在SSLStream上将其用于AuthenticateAsServer。据我所知,用于dotnet 4的方法似乎不适用于dnx50。我的示例将非常完美,我希望将解决方案保留在dnx50中,因为我希望将其部署到linux和windows盒中。

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

从我到目前为止所能知道的情况来看,我认为dnx50不允许您创建一个证书对象,然后像dotnet 4那样向它添加一个私钥。相反,我认为我需要传入一个包含这两种内容的文件或byte[],但我不知道如何将我的2字节数组合并在一起或格式化它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 11:25:45

最后想出了解决办法。不太理想,但有效。基本上,它使用bouncyCastle来创建pfx流,然后您可以读取它来加载带有证书的私钥。为了在CoreCLR上做到这一点,我使用了nuget包Portable.BouncyCastle1.8.1,并在一个助手类中使用了下面的代码。

代码语言:javascript
复制
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);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36294017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档