Как работать с сертификатами X509 в коде .NET - PullRequest
1 голос
/ 14 января 2012

У меня есть код, который должен работать с информацией о сертификате X509.Я скачал пример, который делает это:

const string CertWithoutPrivateKey = "MII....";
const string CertWithPrivateKey = "MII...";

public static SecurityToken GetSigningToken(bool includePrivateKey)
{
    X509Certificate2 cert = null;
    if (includePrivateKey)
    {
        cert = new X509Certificate2(
            Convert.FromBase64String(CertWithPrivateKey), 
            "pw", X509KeyStorageFlags.PersistKeySet);
    }
    else
    {
        cert = new X509Certificate2(
            Convert.FromBase64String(CertWithoutPrivateKey));
    }
    return cert;
}

Код должен быть в состоянии получить сертификат с закрытым ключом.Saml2AuthenticationModule (из расширения WIF для протокола SAML 2.0) использует этот закрытый ключ для расшифровки информации, отправляемой от поставщика удостоверений SAML.

Я не знаю много о сертификатах или шифровании, но мне кажется, что жесткое кодирование сертификата в класс небезопасно.

Итак, как мой код должен извлекать сертификат с закрытым ключом? На самом деле, этот код запускается только один раз при запуске приложения (так что, вероятно, также после перезагрузки пула приложений).

Я мог бы:

  1. Сохранить сертификат как appSetting в файле конфигурации.Пока appSettings зашифрованы в конфигурации, это безопасно?
  2. Храните сертификат в базе данных.
  3. Сохраните сертификат в виде файла в bin / App_Data.Afaik это означает, что он не может быть прочитан через Интернет, но будет понятен любому, кто может получить доступ к хост-серверу.Мне кажется, что если кто-то может проникнуть на мой сервер, то пусть он прочитает этот сертификат, наверное, меньше всего меня беспокоит.

Есть ли другие варианты?Что наиболее уместно в этом случае?

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Сертификат с закрытым ключом или без него можно сохранить в хранилище пользователя или компьютера X509. Это уже имеет встроенную безопасность Windows, которая должна быть достаточной. Вы можете использовать mmc с оснасткой «Сертификаты» для добавления сертификатов в хранилище и управления ими.

Ссылка на сертификат, например, его имя или эскиз, может быть сохранена в файле конфигурации и использована для получения сертификата. Поиск может выглядеть следующим образом:

public static X509Certificate2 GetCertificate(string name)
{
    try
    {
        X509Store store = new X509Store (StoreLocation.LocalMachine);
        X509Certificate2Collection collection = store.Certificates;
        foreach (X509Certificate2 x509 in collection)
        {
            if (x509.FriendlyName.Equals(name)) 
            {
                return x509;
            }
        }
    }
    finally
    {
        store.Close();
    }
    return null;
}

Использование Find в коллекции - еще один (и более чистый) способ поиска сертификатов.

1 голос
/ 14 января 2012

Я не уверен, как WIF это делает (вы, вероятно, могли бы использовать Reflector, чтобы увидеть внутреннюю информацию о том, как он взаимодействует с хранилищем сертификатов), но похоже, что вы используете WIF в приложении, размещенном в IIS. Если это так, WIF должен позаботиться обо всех взаимодействиях с сертификатами для вас . Вам просто нужно убедиться, что у вас настроены следующие вещи:

  1. Раздел конфигурации идентификационной модели , настроенный со ссылками на отпечаток сертификата, который вы используете для шифрования или проверки цифровой подписи токена.
  2. Сертификат необходимо зарегистрировать в IIS
  3. Идентификатор хостинга пула приложений должен иметь разрешение на «чтение» сертификата для извлечения информации о секретном ключе (см. Принятый ответ здесь )
...