2010-02-10 38 views
7

¿Es posible almacenar un X509Certificate2 en una tabla de SQL Server en lugar de extraer un archivo .p12 del sistema de archivos? Estoy seguro de que puedes, pero no estoy seguro de cómo hacerlo.Almacenar un X509Certificate2 en DB

Respuesta

8

Esto es definitivamente posible, el X509Certificate2 tiene una propiedad RawData que se puede guardar en su base de datos SQL. Para reconstruir el certificado puede utilizar esta constructor

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

// save data to database... 

// Fetch data from database... 

cert = new X509Certificate2(data); 
+0

por lo que todavía tiene que leer el flujo .p12 en un objeto y luego almacenar ¿verdad? No puedo simplemente abrir el archivo p12 y copiar su contenido y ponerlo en un campo varchar en una tabla llamada Cerficates y nunca más tener que volver a leer de un archivo físico. tal vez soy ingenuo – PositiveGuy

+0

Ok, entonces RawData es una matriz de bytes. ¿Qué tipo de datos MS SQL usaría para almacenar una matriz de bytes ... binario? – PositiveGuy

+0

Solo quiero leer una vez y no tener que almacenar ese archivo .p12 en el servidor. Creo que esa es la intención. Nuestro líder dice que no lo lea de un archivo sino de la base de datos. Supongo que eso significa que debería poder almacenar eso una vez en el DB y nunca tener que volver a leer el archivo. – PositiveGuy

3

Uso .export() entonces Convert.ToBase64String() y guardar como nvarchar (max)

Para guardarlo:

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. 

Entonces simplemente restaure (después de recuperarlo de DB) con:

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

Usando Exportar() es mejor que .RawData, ya que puede optar por mantener la clave privada o no (con .RawData siempre lo quitará).

+0

Gracias jezpez, esto era exactamente lo que necesitaba. ¡Muy limpio también! – Memetican

Cuestiones relacionadas