2016-03-29 10 views
0

Grundsätzlich benutze ich einen LetsEncrypt-Dienst, um ein Zertifikat-Byte [] zurück, dass ich ein X509Certificate2 werden kann, aber dann fehlt der private Schlüssel, um es dann auf einem SSLStream verwenden . Ich habe den privaten Schlüssel als RSAParameters, aber kann ihn auch in ein Byte [] umwandeln, aber ich kann nicht scheinen, einen Weg zu finden, um die 2 in demselben X509Certificate2 zusammenzubringen, also kann ich es für AuthenticateAsServer auf einem SSLStream verwenden. Die Methoden, die Sie für dotnet 4 verwenden würden, scheinen für dnx50 nicht zu gelten, soweit ich das beurteilen kann. Ich arbeite Beispiel wäre perfekt und ich möchte die Lösung in DNX50 wie ich dies in Linux und Windows-Boxen bereitstellen möchten.Wie Createx509certificate2 angegebenen Zertifikats-Bytes und privaten Schlüssel - dnx50

Grundsätzlich versuchen, etwas Ähnliches wie Convert Certificate and Private Key to .PFX programatically in C# zu tun, aber nur das X509 mit privatem Schlüssel zu erstellen, obwohl Speichern wäre meine nächste Aufgabe.

Von was ich bis jetzt sagen kann, ich denke, dass dnx50 nicht erlaubt, ein cetificate-Objekt zu erstellen und dann einen privaten Schlüssel hinzuzufügen, wie es dotnet 4 getan hat. Stattdessen denke ich, dass ich eine a-Datei oder ein Byte [] übergeben muss, die beides für das Funktionieren enthält, aber ich weiß nicht, wie ich meine 2-Byte-Arrays zusammenführen oder sie formatieren kann.

Antwort

0

Endlich eine Lösung dafür ausgearbeitet. Nicht ideal, aber es funktioniert. Im Grunde verwendet es bouncyCastle, um einen pfx-Stream zu erstellen, und dann können Sie das einlesen, um den privaten Schlüssel mit dem Zertifikat zu laden. Um dies auf CoreCLR zu tun, habe ich das nugget-Paket Portable.BouncyCastle: 1.8.1 mit folgendem Code in eine Hilfsklasse eingefügt.

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); 
    }