Сертификат Установить Предупреждение безопасности Обходной путь? - PullRequest
10 голосов
/ 16 ноября 2010

У меня есть некоторый код C # 4.0, который пытается установить сертификат CA (в кодировке .der) в хранилище «Trusted Root Certification Authorities» для текущего (My) пользователя.Мое маленькое консольное приложение работает незаметно для других хранилищ, но для этого хранилища появляется всплывающее окно с графическим интерфейсом: «Вы собираетесь установить сертификат из центра сертификации ... Windows не может проверить, действительно ли сертификат получен из .....хотите установить этот сертификат? "

Это окно сообщений является проблемой, поскольку идея состоит в том, чтобы автоматически развернуть приложение с MSI и безошибочно получить нужные сертификаты в нужном месте.Наличие модального окна убьет автоматическое развертывание.

Как выполнить эту установку без сообщения о нарушении развертывания?

1 Ответ

27 голосов
/ 21 ноября 2010

Звучит нелогично, но для предупреждения не следует добавлять сертификат не в хранилище корневых сертификатов текущего пользователя, а вместо этого в корневой каталог локальной машины.Вы можете легко проверить, что

certmgr.exe -add -c t.cer -s -r currentUser root

выдает предупреждение безопасности, но

certmgr.exe -add -c t.cer -s -r localMachine root

нет.

Так что если вы хотите импортировать сертификат в .NET, то соответствующийкод может быть примерно следующим

using System;
using System.Security.Cryptography.X509Certificates;

namespace AddCertToRootStore {
    class Program {
        static void Main (string[] args) {
            X509Store store = new X509Store (StoreName.Root,
                                             StoreLocation.LocalMachine);
            store.Open (OpenFlags.ReadWrite);
            X509Certificate2Collection collection = new X509Certificate2Collection();
            X509Certificate2 cert = new X509Certificate2 (@"C:\Oleg\t.cer");
            byte[] encodedCert = cert.GetRawCertData();
            Console.WriteLine ("The certificate will be added to the Root...");
            store.Add (cert);
            Console.WriteLine("Verify, that the certificate are added successfully");
            Console.ReadKey ();
            Console.WriteLine ("The certificate will be removed from the Root");
            store.Remove (cert);
            store.Close ();
        }
    }
}
...