Как загрузить защищенные паролем сертификаты из 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", и он работал без проблем.