2016-12-29 2 views
1

Ich habe ein C# -Einheitstest-Projekt, bei dem ich einige Verschlüsselungserweiterungen testen möchte, die ich geschrieben habe. Ich möchte ein Dummy-Zertifikat zum Testen verwenden, aber ich habe folgende Einschränkungen:Programmgesteuertes Erstellen eines Dummy-Zertifikats mit privatem Schlüssel zum Testen

  • Die Build- und Testläufe werden remote auf einer Maschine ausgeführt, auf die ich keinen Zugriff habe. Daher kann ich das Zertifikat nicht auf dem Erstellungscomputer installieren.
  • Ich kann keine Geheimnisse (wie z. B. eine .pfx Datei) als Teil des Git Repository oder Build enthalten, da dies die Sicherheitsprotokolle verletzen würde. Daher kann ich das Zertifikat nicht aus einer im Projekt enthaltenen Datei lesen.

Da ich Verschlüsselung und Entschlüsselung machen werde, muss ich die privaten Schlüsselinformationen haben. Wie kann ich dieses Zertifikat programmatisch innerhalb dieser Einschränkungen erstellen?

+0

Vielleicht wie [das] (http://stackoverflow.com/a/ 22237794/3245057)? – pepo

Antwort

3

Eine Möglichkeit besteht darin, ein Zertifikat zum Testen zu erstellen, es in eine Basis-64-Zeichenfolge zu konvertieren und dann das Zertifikat aus dieser Zeichenfolge im Code zu lesen. Diese vier Schritte erfordert:

1. Erstellen Sie die CER und .pvk Dateien

Um dies zu tun, man das MakeCert.exe Tool verwenden können (beachten Sie, dass this tool is deprecated, und Microsoft empfiehlt, die New-SelfSignedCertificate PowerShell cmdlet verwende ich. habe das nicht versucht, aber vermutlich würde jede Methode funktionieren.). Dies ist ein .NET Framework-Tool und ist als Teil des Windows SDK enthalten. Ich habe zufällig das Windows 7 SDK auf meinem Computer installiert, also befand sich diese Exe für mich unter C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\, aber Ihre Ergebnisse können variieren. Dieses Tool macht genau das, was wir wollen! Vom documentation:

Das Zertifikat Creation Tool generiert X.509-Zertifikate nur zu Testzwecken. Es erstellt ein öffentliches und privates Schlüsselpaar für digitale Signaturen und speichert es in einer Zertifikatsdatei. Dieses Tool ordnet das Schlüsselpaar auch dem angegebenen Herausgebernamen zu und erstellt ein X.509-Zertifikat, das einen benutzerdefinierten Namen an den öffentlichen Teil des Schlüsselpaars bindet.

Aus Gründen der diesem Beispiel wollen wir das CERT TestCert nennen. Um die cer und .pvk-Dateien zu erstellen, führen Sie den folgenden Befehl ein:

MakeCert.exe -sv TestCert.pvk -n "cn=Test Certificate" TestCert.cer -r

Die -sv Flagge zeigt den Namen der .pvk-Datei zu erstellen, die -n Flagge ist der X.500-konformen Namen unser Zertifikat (es ist am einfachsten zu verwenden "cn = CertName" Format wie oben), und die -r Flag zeigt an, dass es selbstsigniert sein wird. Wenn Sie das Anfangs- und Enddatum für Ihr Zertifikat angeben möchten, verwenden Sie die Flags -b und -e und formatieren Sie die Daten als mm/dd/yyyy (das Zertifikat ist standardmäßig vom Tag der Erstellung bis 2039 gültig). Wenn Ihr Zertifikat für die Verschlüsselung und Entschlüsselung verwendet wird (wie meiner), müssen Sie die Flags -sky Exchange und -pe angeben. Sie werden während des Vorgangs aufgefordert, ein Kennwort für das Zertifikat zu erstellen.

2. Erstellen Sie die.pfx-Datei

Dies kann mit dem pvk2pfx.exe-Tool durchgeführt werden, das an der gleichen Stelle wie MakeCert.exe sein sollte. Dieses Tool konvertiert eine .pvk- und .cer-Datei in eine PFX-Datei. Um dieses Werkzeug zu verwenden, den folgenden Befehl ein:

pvk2pfx.exe -pvk TestCert.pvk -spc TestCert.cer -pfx TestCert.pfx

-pvk Die Flagge ist der Dateiname der Datei zu verwenden .pvk (erstellt in Schritt 1), wobei die -csp Flagge ist der Dateiname der. cer-Datei zu verwenden (erstellt in Schritt 1), und das -pfx-Flag ist der Name für die PFX-Datei, die erstellt wird. Während des Prozesses werden Sie das Passwort zur Eingabe aufgefordert werden, den Sie in Schritt 1.

3. Holen Sie sich das Basis 64 Stringdarstellung der PFX-Datei

Das ist ziemlich einfach, und kann sein erledigt mit dem Powershell Cmdlet Get-Content und der System.Convert.ToBase64String Methode. Dazu öffnet sich ein Fenster Powershell und führen Sie die folgenden Schritte aus:

$content = Get-Content TestCert.pfx -Encoding Byte 
[System.Convert]::ToBase64String($content) | Out-File "TestCert.txt" 

Jetzt haben wir die Basis 64-String für unsere PFX-Datei in TestCert.txt. programmatisch

4. das Zertifikat erstellen

Jetzt können wir das Zertifikat im Code erstellen wie folgt:

namespace MyTests 
{ 
    using System; 
    using System.Security.Cryptography.X509Certificates; 

    public class MyTests 
    { 
     // Copy and paste the string from TestCert.txt here. 
     private const string CertText = "<text>"; 

     // Use the password you created in steps 1 and 2 here. 
     private const string Password = "p4ssw0rd"; 

     // Create the certificate object. 
     private readonly X509Certificate2 TestCert = new X509Certificate2(
      Convert.FromBase64String(MyTests.CertText), 
      MyTests.Password); 
    } 
} 
Verwandte Themen