Отправка цифровых сертификатов

Я использовал инструмент makecert для создания:

  1. самоподписанный сертификат
  2. сертификат сервера с использованием самозаверяющего сертификата
  3. клиентский сертификат с использованием самозаверяющего сертификата

Затем я установил самоподписанный сертификат в разделе «Доверенные центры сертификации» в mmc.

Сертификат сервера и сертификат клиента были установлены в личном разделе в mmc.

Затем я развернул веб-службу в IIS как HTTP, используя сертификат сервера.

Затем у меня есть другое приложение, которое использует веб-службу. Он отправляет сертификат клиента с запросом веб-службы, как показано ниже:

public static void Main(string[] args)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, "client.com", true);

            if (col.Count == 1)
            {
                ServicePointManager.Expect100Continue = true;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;

                ClientServices web_service = new ClientServices();
                web_service.ClientCertificates.Add(col[0]);

                try
                {
                    string check = web_service.CheckCertificate();

                    Console.WriteLine(check);
                }
                catch (WebException e)
                {
                    Console.WriteLine(e.Message.ToString());
                }
            }

            else
            {
                Console.WriteLine("The certificate was not found!");
            }
            Console.ReadKey();
        }

На стороне сервера я проверяю сертификат клиента следующим образом:

[WebMethod]
        public string CheckCertificate()
        {
            string message;

            try
            {
                X509Certificate2 cert = new X509Certificate2(Context.Request.ClientCertificate.Certificate);                

                if (cert != null)
                {
                    message = cert.SerialNumber.ToString();
                }

                else
                {
                    message = "Error: No certificate was found!";
                }
            }
            catch (Exception e)
            {
                message = e.Message.ToString();
            }
            return message;
        }

Всякий раз, когда я запускаю клиентское приложение, я получаю следующее сообщение об ошибке:

Запрос был прерван. Не удалось создать безопасный канал SSL/TLS.

Как я могу решить эту проблему?


person Matthew    schedule 27.04.2013    source источник


Ответы (1)


Я нашел виновного.

Я установил инструмент WinHttpCertCfg и предоставил доступ к закрытому ключу сертификата.

Команда, которую я использовал, такова:

WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "<name of certificate>" -a EVERYONE
person Matthew    schedule 28.04.2013