2016-03-29 6 views
0

В основном я использую службу LetsEncrypt для получения байта сертификата [] назад, чтобы я мог превратиться в X509Certificate2, но тогда ему не хватает личного ключа, а затем он использует его в SSLStream , У меня есть закрытый ключ как RSAParameters, но он также может преобразовать его в байт [], но я не могу найти способ получить 2 вместе в одном и том же X509Certificate2, поэтому я могу использовать его для AuthenticateAsServer в SSLStream. Насколько мне известно, методы, которые вы используете для dotnet 4, как правило, не применяются к dnx50. Я работаю над примером, и я хочу сохранить решение в dnx50, поскольку я хочу развернуть его в linux и окна.Как Createx509certificate2 предоставил байты сертификата и закрытый ключ - dnx50

В основном пытается сделать что-то похожее на Convert Certificate and Private Key to .PFX programatically in C#, но просто создать X509 с закрытым ключом, хотя сохранение будет моей следующей задачей.

Из того, что я могу сказать до сих пор, я думаю, что dnx50 не позволяет создавать объект cetificate, а затем добавлять к нему закрытый ключ, как это делает dotnet 4. Вместо этого я думаю, что мне нужно передать файл или байт [], который содержит как для этого, так и для работы, но я не знаю, как объединить мои 2 байтовые массивы вместе или отформатировать их.

ответ

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); 
    } 
Смежные вопросы