Сохраните X509Certificate2 в БД

Можно ли хранить X509Certificate2 в таблице SQL Server, а не извлекать файл .p12 из файловой системы? Я уверен, что вы можете, но не знаете, как это сделать.


person PositiveGuy    schedule 10.02.2010    source источник


Ответы (2)


Это определенно возможно, X509Certificate2 имеет RawData, которое можно сохранить в базу данных SQL. Чтобы восстановить сертификат, вы можете использовать этот конструктор.

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

// save data to database...

// Fetch data from database...

cert = new X509Certificate2(data);
person Rohan West    schedule 10.02.2010
comment
так что вам все еще нужно прочитать поток .p12 в объект, а затем сохранить правильно? Я не могу просто открыть файл p12, скопировать его содержимое и бросить его в поле varchar в таблицу с именем Cerficates, и после этого мне больше никогда не придется читать из физического файла? может я наивен - person PositiveGuy; 11.02.2010
comment
Итак, RawData — это массив байтов. Какой тип данных MS SQL вы бы использовали для хранения массива байтов... двоичного? - person PositiveGuy; 11.02.2010
comment
Я просто хочу прочитать один раз и не хранить этот файл .p12 на сервере. Я думаю, что это и есть намерение. Наш лидер говорит не читать его из файла, а из БД. Я бы предположил, что это означает, что я должен иметь возможность сохранить это один раз в БД и никогда больше не читать файл? - person PositiveGuy; 11.02.2010
comment
Это правильно, как только вы прочитали .p12, вы можете сохранить массив байтов в базе данных, ваш .p12 также содержит закрытый ключ? Если это так, было бы лучше хранить его в хранилище сертификатов. С другой стороны, если у вас есть только открытый ключ, его можно сохранить в базе данных. - person Rohan West; 11.02.2010

Используйте .Export(), затем Convert.ToBase64String() и сохраните как NVARCHAR(MAX)

Чтобы сохранить его:

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.

Затем просто восстановите (после получения обратно из БД) с помощью:

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

Использование Export() лучше, чем .RawData, поскольку вы можете выбрать, сохранять закрытый ключ или нет (использование .RawData всегда будет его удалять).

person jezpez    schedule 27.05.2016
comment
Спасибо jezpez, это было именно то, что мне было нужно. Так же очень чисто! - person Memetican; 25.07.2017