0

基本的に、LetsEncrypt サービスを使用して X509Certificate2 に変換できる証明書 byte[] を取得していますが、SSLStream で使用するための秘密鍵がありません。私は秘密鍵を RSAParameters として持っていますが、それを byte[] に変換することもできますが、同じ X509Certificate2 で 2 つを一緒にする方法が見つからないように見えるので、SSLStream の AuthenticateAsServer に使用できます。私が知る限り、dotnet 4 に使用する方法は dnx50 には適用されないようです。私の作業例は完璧であり、これをLinuxおよびWindowsボックスに展開したいので、ソリューションをdnx50に保持したいと考えています。

基本的に、証明書と秘密鍵を C# でプログラム的に .PFXに変換するのと似たようなことをしようとしていますが、秘密鍵を使用して X509 を作成するだけで、保存することが次のタスクになります。

これまでのところ、dnx50 では、証明書オブジェクトを作成してから、dotnet 4 のように秘密鍵を追加することはできないと思います。代わりに、これを機能させるには両方を含むファイルまたはバイト [] を渡す必要があると思いますが、2 バイト配列をマージする方法やフォーマットする方法がわかりません。

4

1 に答える 1

0

最後に、これに対する解決策を考え出しました。理想的ではありませんが、うまくいきます。基本的には、bouncyCastle を使用して pfx ストリームを作成し、それを読み取って、証明書を使用して秘密鍵を読み込むことができます。CoreCLR でこれを行うには、ナゲット パッケージ 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);
    }
于 2016-03-30T11:25:45.450 に答える