2010-02-10 7 views
7

Ist es möglich, ein X509Certificate2 in einer SQL Server-Tabelle zu speichern, anstatt eine .p12-Datei aus dem Dateisystem zu ziehen? Ich bin sicher, Sie können, aber nicht sicher, wie das geht.Ein X509Certificate2 in DB speichern

Antwort

8

Dies ist definitiv möglich, das X509Certificate2 hat eine RawData Eigenschaft, die in Ihrer SQL-Datenbank gespeichert werden kann. Um das Zertifikat zu rekonstruieren können Sie diese constructor verwenden

var cert = new X509Certificate2(filename); 
var data = cert.RawData; 

// save data to database... 

// Fetch data from database... 

cert = new X509Certificate2(data); 
+0

also müssen Sie noch den .p12-Stream in ein Objekt lesen und dann richtig speichern? Ich kann nicht einfach die p12-Datei öffnen und deren Inhalt kopieren und in ein Varchar-Feld in eine Tabelle namens Cerficates werfen und danach nie wieder von einer physischen Datei lesen? vielleicht bin ich naiv – PositiveGuy

+0

Ok, also RawData ist ein Byte-Array. Welchen MS SQL-Datentyp würden Sie verwenden, um ein Byte-Array zu speichern .... binary? – PositiveGuy

+0

Ich möchte nur einmal lesen und muss diese .p12 Datei nicht auf dem Server speichern. Ich denke, das ist die Absicht. Unsere Führung sagt, dass wir es nicht aus einer Datei, sondern aus der Datenbank lesen sollen. Ich würde davon ausgehen, dass ich das einmal in der DB speichern und die Datei nie wieder lesen muss? – PositiveGuy

3

Verwenden .export() dann Convert.ToBase64String() und speichern als NVARCHAR (MAX)

es sparen:

var cert = new X509Certificate2(filename); 
var stringOfCertWithPrivateKey = Convert.ToBase64String(cert.Export(X509ContentType.Pkcs12)); 

// Or as a regular cert, which will strip the private key out 
var stringOfCertWithoutPrivateKey = Convert.ToBase64String(cert.Export(X509ContentType.Cert)); 

// Save either string as NVARCHAR(MAX) in the DB, it's just a string now. 

Dann einfach wiederherstellen (nachdem es von der DB zurückgeholt wurde) mit:

var certBytes = Convert.FromBase64String(stringOfCertWithPrivateKey); 
var cert = new X509Certificate2(certBytes); 

Verwendung von Export() ist besser als .RawData, da Sie den privaten Schlüssel beibehalten können oder nicht (mit .RawData wird es immer entfernt).

+0

Danke Jezpez, das war genau das, was ich brauchte. Sehr sauber! – Memetican

Verwandte Themen