2009-08-05 7 views
2

Ich habe eine Client-Server-Architektur in meiner Anwendung, die SSL verwendet. Momentan wird der private Schlüssel in CAPIs Schlüsselspeicherort gespeichert. Aus Sicherheitsgründen möchte ich den Schlüssel an einem sichereren Ort aufbewahren, idealerweise ein Hardware Signing Modul (HSM), das für diesen Zweck gebaut wird. Leider kann ich mit dem privaten Schlüssel, der auf einem solchen Gerät gespeichert ist, nicht herausfinden, wie ich es in meiner Anwendung verwenden kann.SSL mit privatem Schlüssel auf einem HSM

Auf dem Server verwende ich einfach die SslStream Klasse und die AuthenticateAsServer(...) Aufruf. Diese Methode benötigt ein X509Certificate Objekt, das seinen privaten Schlüssel geladen hat, aber da der private Schlüssel in einem sicheren (z. B. nicht exportierbaren) Speicherort auf dem HSM gespeichert ist, weiß ich nicht, wie das zu tun ist.

auf dem Client Ich verwende ein HttpWebRequest Objekt und dann die ClientCertificates Eigenschaft mit meinem Client-Authentifizierungszertifikat hinzufügen, aber ich habe das gleiche Problem: Wie bekomme ich die privaten Schlüssel?

Ich weiß, dass es einige HSM gibt, die als SSL-Beschleuniger fungieren, aber ich brauche keinen Beschleuniger. Außerdem haben diese Produkte eine spezielle Integration mit Webservern wie IIS und Apache, die ich nicht verwende.

Irgendwelche Ideen? Das einzige, was mir einfällt, wäre, meine eigene SSL-Bibliothek zu schreiben, die es mir erlauben würde, den signierenden Teil der Transaktion an das HSM zu übergeben, aber das scheint eine Menge Arbeit zu sein.

Antwort

0

In den HSMs, mit denen ich gearbeitet habe, ist dies vor Ihnen verborgen. Normalerweise gibt es einen anderen Prozess zum Generieren der Schlüsselpaare (entweder zum Generieren der Zertifikatsanforderung oder zum Verteilen des abgeschlossenen Zertifikats an mehr Computer als an dem Sie die Zertifikatsanforderung generiert haben, abhängig von der Art des HSM), jedoch nach der Installation des Zertifikats Auf dem Computer wird es als normales Zertifikat mit einem privaten Schlüssel angezeigt, und Sie verwenden es wie jedes andere Zertifikat.

+0

Mit welchen HSMs haben Sie auf diese Weise mit dieser Funktion gearbeitet? Ich evaluiere ein Paar und beide funktionieren ähnlich, indem sie einen kryptografischen Dienstanbieter zur Verwendung mit CAPI bereitstellen. Sie haben jeweils die Fähigkeit, einfach Schlüssel zu generieren, Daten zu verschlüsseln/zu entschlüsseln, zu hashen und zu signieren. Soweit ich das beurteilen kann, müsste ich meine eigene Zertifikatanforderung erstellen und das HSM für mich signieren lassen (da es nur den privaten Schlüssel hat). Hoffentlich verpasse ich etwas oder schaue mir einfach nicht die richtigen HSM an? – Jason

+0

Hauptsächlich eine Variation von nCipher HSMs; PCI HSMs + NetHSMs. Die ausführende Version der Funktionsweise ihrer Geräte besteht darin, dass die Kryptooperation zum HSM geleitet wird. Das HSM ist das einzige, das den privaten Schlüssel kennt. Daher führt es die Kryptooperation aus und gibt das Ergebnis zurück. Tatsächlich befindet sich der private Schlüssel im normalen Zertifikatsspeicher auf der Maschine, aber er ist 3DES-verschlüsselt und der 3DES-Schlüssel befindet sich im HSM. Wenn Sie Ihre Kryptooperation ausführen, werden die Daten + der Zertifikatschlüssel + die 3DES-Schlüsselkennung an das HSM gesendet, der private Schlüssel des Zertifikats entschlüsselt und die Operation ausgeführt. – Rovpedal

+0

Interessant, ich muss in diese Produkte schauen. Wenn ich den Workflow verstehe, steht der private Schlüssel dann in der Software zur Verfügung, wenn er entschlüsselt wird? Das würde den Zweck des HSM besiegen. Der entschlüsselte Schlüssel ist also möglicherweise nur für das HSM selbst verfügbar. In welchem ​​Fall verwendet Ihre Anwendung sie? – Jason

0

Private Schlüssel werden abhängig von den Konfigurationseinstellungen des HSM exportiert. Sie müssen mit dem HSM-Anbieter sprechen, um herauszufinden, welche ihrer HSM diese Funktion bieten.

+0

Der Hauptpunkt der Verwendung eines HSM ist der Schutz der privaten Schlüssel. Ich möchte kein HSM, das den Export der privaten Schlüssel erlaubt, da dies den gesamten Zweck zunichte machen würde. Leider macht es mir auch das Leben schwer, da ich den privaten Schlüssel nicht wie gewohnt benutzen kann (also meine Frage). – Jason

0

Das HSM wird möglicherweise mit einer CryptoAPI-CSP-Implementierung ausgeliefert. Wenn der Schlüssel dem Zertifikat in CryptoAPI ordnungsgemäß zugeordnet ist, sollte der SslStream in der Lage sein, es zu verwenden, ohne es zu exportieren.

+0

Das HSM verfügt über einen CAPI-CSP. Ich bin mir jedoch nicht ganz sicher, wie ich ein CERT mit einem privaten Schlüssel, der auf dem HSM gespeichert ist, zu CAPI hinzufügen kann. Ich kann einen privaten Schlüssel auf dem HSM über den CSP generieren, aber wie kann ich ein Zertifikat mit diesem Schlüssel erstellen? – Jason

3

Wie Rasmus sagte, sollten Sie CSP von Ihrem HSM-Hersteller verwenden. Überprüfen Sie diesen Link:

http://forums.asp.net/t/1531893.aspx

ich erfolgreich ein wenig anderen Ansatz auf dem Client für Client-Authentifizierung verwendet HTTPS mit HttpWebRequest, ClientCertificates und Smartcard. In meinem Fall ist der private Schlüssel in der Chipkarte gespeichert (ähnlich wie bei HSM). Smartcard-CSP verwendet dann PKCS # 11 zum Signieren, Verschlüsseln/Entschlüsseln usw., aber das ist nicht wichtig. Die Eigenschaft X509Certificate.Handle wird in der SSL-Einrichtung zum Signieren der Anforderung auf dem Client verwendet, und dieses Handle enthält Informationen zum privaten Schlüssel des Zertifikats.

In meinem Fall wollte ich Stift programmatisch für die Smartcard, um „PIN eingeben“ Dialog von Smart-Card-in Prozess der SSL-Erstellung zu vermeiden, und ich habe es mit dieser Funktion getan:

public void SetContext(X509Certificate2 cert) 
{ 
     IntPtr p = IntPtr.Zero; 
     bool result = Win32.CryptAcquireContext(ref p, "keyContainer", "Siemens Card API CSP", 1, 0); 
     byte[] pin = new ASCIIEncoding().GetBytes("0000"); 
     result = Win32.CryptSetProvParam(p, 32, pin, 0); 
     result = Win32.CertSetCertificateContextProperty(cert.Handle, 1, 0, p); 
} 

Sie kann die Namen aller installierten CSPs in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider finden.Win32 ist meine Klasse für C++/C# Interop und sieht wie folgt aus:

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern bool CryptAcquireContext(
     ref IntPtr hProv, 
     string pszContainer, 
     string pszProvider, 
     uint dwProvType, 
     uint dwFlags 
     ); 
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern bool CryptSetProvParam(
     IntPtr hProv, 
     uint dwParam, 
     [In] byte[] pbData, 
     uint dwFlags); 
[DllImport("CRYPT32.DLL")] 
    internal static extern Boolean CertSetCertificateContextProperty(
     IntPtr pCertContext, 
     uint dwPropId, 
     uint dwFlags, 
     IntPtr pvData 
     ); 
2

Wenn das HSM mit CAPI CSP kommt, kann folgendes tun:

var certificate = new X509Certificate2(pathToPublicCert); 

var cspParameters = new CspParameters() 
{ 
    ProviderType = 1, /* Use 1 instead of 24 (the default) */ 
    ProivderName = "My HSM Cryptographic Provider Name", 
    KeyContainerName = "My Private Key Container Name", 
    KeyNumber = 1, /* Key exchange key */ 
    Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseNonExportableKey, 
}; 

var privateKey = new RSACryptoServiceProvider(cspParameters); 

certificate.PrivateKey = privateKey; 

Diese funktionieren sollte. Beachten Sie, dass dies möglicherweise nicht funktioniert, wenn Sie 24 anstelle von 1 für den Anbietertyp verwenden (dies gilt nicht für den Standard-CSP).

Verwandte Themen