Как загрузить защищенные паролем сертификаты из X509Store?
Я создаю службу Azure WCF, защищенную ACS, которая потребует от клиентов аутентификации через сертификат.
Я хотел бы, чтобы клиент (и сервер) загружал их соответствующие сертификаты пароля из X509Store, а не из файловой системы.
Я использую этот код:
private static X509Certificate2 GetCertificate(string thumbprint)
{
var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
thumbprint, false);
certStore.Close();
if (certCollection.Count == 0)
{
throw new System.Security.SecurityException(string.Format(CultureInfo.InvariantCulture, "No certificate was found for thumbprint {0}", thumbprint));
}
return certCollection[0];
}
Проблема заключается в том, что она не загружает закрытый ключ, который необходим для аутентификации. Я попытался изменить оператор return на это:
return new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, "password"));
Однако это не выполняется с помощью CryptographicException "Неправильный сетевой пароль неверен".
Edit:
Метод .Export() работает правильно, если вы не передаете аргумент пароля.
Любая помощь по этому поводу?
Ответы
Ответ 1
При экспорте указанным вами паролем является пароль, который вы хотите использовать для экспортируемого файла, это не пароль для исходного сертификата.
Я не уверен, что вы можете делать с сертификатами X509Store и с защитой паролем, потому что пароль должен быть предоставлен конструктору X509Certificate, и вы получаете уже созданные объекты из хранилища.
Я думаю, вы можете просто получить необработанные данные из требуемого сертификата и построить новый с нужным паролем. Например:
X509Certificate2 cert = new X509Certificate2(certCollection[0].GetRawCertData, password);
Я также предлагаю вам попробовать использовать SecureString
при работе с паролями (но это другой мешок червей...)
Ответ 2
Я использовал Export без параметра "password", и он работал без проблем.