Как автоматизировать доступ к веб-сайту IIS, на котором «требуются клиентские сертификаты»? - PullRequest
3 голосов
/ 27 июля 2010

Я работаю на веб-сайте IIS6 / ASP.NET, который должен «требовать сертификаты клиента» в виде смарт-карты (в частности, Common Access Card ). Мне нужно создать несколько служб для доступа к различным URL-адресам по таймеру, чтобы выполнять такие вещи, как обновление поисковых индексов, прогрев страниц Sharepoint и другие задачи.

Как это можно сделать, если сайт не разрешает доступ, если у вас нет сертификата, который находится на смарт-карте? Я попытался загрузить сертификат (.cer) и загрузить его следующим образом:

HttpWebRequest request = (HttpWebRequest)
            WebRequest.Create("https://.../someURL.html");

const string certFilename = @"my.cer";
var cert = X509Certificate2.CreateFromCertFile(certFilename);
cert.Import(certFilename, "my pin", X509KeyStorageFlags.Exportable);
request.ClientCertificates.Add(cert);
HttpWebResponse response = (HttpWebResponse)
       request.GetResponse();

Но я получаю 403 Запрещено.

Ответы [ 4 ]

1 голос
/ 23 сентября 2010

Это не ответ, но у меня недостаточно репутации, чтобы комментировать. .Cer не имеет закрытого ключа, это просто открытый сертификат, поэтому вы не можете его использовать. Вам необходимо загрузить закрытый ключ прямо со смарт-карты. Я полагаю, что это может включать создание параметров CSP с именем CSP устройства чтения смарт-карт, а затем загрузить сертификат x509 с закрытым ключом непосредственно с карты. Насколько я знаю, закрытый ключ не будет автоматически установлен для текущего пользователя или моего хранилища текущего компьютера, поэтому вы не сможете загрузить его оттуда. Нет кода извините.

1 голос
/ 23 сентября 2010

Вы можете загрузить свой сертификат из личного магазина следующим образом:

 System.Security.Cryptography.X509Certificates.X509Certificate cert = FindCertByName(PART_AFTER_CN_IN_CERT_SUBJECT);
request.ClientCertificates.Add(cert);

..

        private System.Security.Cryptography.X509Certificates.X509Certificate FindCertByName(string simpleName)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            foreach (X509Certificate cert in store.Certificates)
            {
                if( cert.Subject.Contains("CN="+simpleName))
                {
                    return cert;
                }
            }

            string msg = "The '" + simpleName + "' security certificate is not installed on this system!";
            throw new ApplicationException(msg);
        }
0 голосов
/ 23 сентября 2010

Вы пытались добавить X509 в кеш учетных данных? Пример:

X509Certificate cert = new X509Certificate("sslCert.txt"); X509CertificateCollection certColl = new X509CertificateCollection(); certColl.Add(cert); CredentialCache credCache = new CredentialCache(); credCache.Add(new Uri(string.Concat(outputReport.reportURI)), "Basic", new NetworkCredential(NexConfig.User, NexConfig.Pass)); wr.AllowAutoRedirect = false; wr.ClientCertificates = certColl; wr.Credentials = credCache; HttpWebResponse resp = (HttpWebResponse)wr.GetResponse();

0 голосов
/ 16 сентября 2010

Если вы используете SharePoint 2010:

  1. Перейдите в центр администрирования SharePoint
  2. Перейдите в Управление приложениями> Управление веб-приложениями
  3. Выделите фронтальную версию SharePointsite.
  4. Выберите «Расширить» в верхнем меню.

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

...