путаница с сертификатами

У меня есть веб-служба WCF REST, размещенная на IIS, она работает по HTTPS, я генерирую сертификат в IIS и назначаю Https на порт.

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

Либо пункт назначения не определен, либо я все неправильно понимаю. также

Ошибка, которую я получил от обратного вызова «CheckValidationResult ()», - это либо CertCN_NO_MATCH = 0x800B010F, либо «Неизвестная проблема с сертификатом», certificateProblem (параметр CheckValidationResult) в этом случае равен 0

Что такое ошибка CertCN_NO_MATCH, что такое CN?

См. Код ниже.

 ServicePointManager.CertificatePolicy = new CertPolicy();

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(String.Format("https://{0}/uri", ip));
            //request.ClientCertificates.Add(new X509Certificate("D:\\ThePubKey.cer"));


            request.ContentType = "application/x-www-form-urlencoded";

            request.Method = "POST";

            using (StreamWriter stream = new StreamWriter(request.GetRequestStream()))
            {
                stream.Write("RequestType=CheckStatus&ReportType=Fulfillment&ReportID=5");
            }

            using (StreamReader stream = new StreamReader(request.GetResponse().GetResponseStream()))
            {
                Response.ContentType = "text/xml";

                Response.Output.Write(stream.ReadToEnd());
                Response.End();
            } 

    class CertPolicy : ICertificatePolicy
        {
            public enum CertificateProblem : uint
            {
                CertEXPIRED = 0x800B0101,
                CertVALIDITYPERIODNESTING = 0x800B0102,
                CertROLE = 0x800B0103,
                CertPATHLENCONST = 0x800B0104,
                CertCRITICAL = 0x800B0105,
                CertPURPOSE = 0x800B0106,
                CertISSUERCHAINING = 0x800B0107,
                CertMALFORMED = 0x800B0108,
                CertUNTRUSTEDROOT = 0x800B0109,
                CertCHAINING = 0x800B010A,
                CertREVOKED = 0x800B010C,
                CertUNTRUSTEDTESTROOT = 0x800B010D,
                CertREVOCATION_FAILURE = 0x800B010E,
                CertCN_NO_MATCH = 0x800B010F,
                CertWRONG_USAGE = 0x800B0110,
                CertUNTRUSTEDCA = 0x800B0112
            }


            public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
            {
                // You can do your own certificate checking.
                // You can obtain the error values from WinError.h.

                // Return true so that any certificate will work with this sample.

                String error = "";

                using (StringWriter writer = new StringWriter())
                {

                    writer.WriteLine("Certificate Problem with accessing " + request.RequestUri);
                    writer.Write("Problem code 0x{0:X8},", (int)certificateProblem);
                    writer.WriteLine(GetProblemMessage((CertificateProblem)certificateProblem));

                    error = writer.ToString();
                }

                return true;
            }

            private String GetProblemMessage(CertificateProblem Problem)
            {
                String ProblemMessage = "";
                CertificateProblem problemList = new CertificateProblem();
                String ProblemCodeName = Enum.GetName(problemList.GetType(), Problem);
                if (ProblemCodeName != null)
                    ProblemMessage = ProblemMessage + "-Certificateproblem:" +
                       ProblemCodeName;
                else
                    ProblemMessage = "Unknown Certificate Problem";
                return ProblemMessage;
            }

        }

person Costa    schedule 22.06.2010    source источник


Ответы (1)


Я только что ответил на этот аналогичный вопрос ( на Java).

CN - это «общее имя». Это должно быть имя хоста сервера, к которому вы подключаетесь (если оно не указано в альтернативном имени субъекта). Из вашего примера кода я предполагаю, что вы напрямую используете IP-адрес. В этом случае CN должен быть этим IP-адресом (обычно лучше использовать имя хоста, а не IP-адрес). См. Спецификации в RFC 2818 (раздел 3.1).

Обратите внимание, что альтернативное имя CN или субъекта является с точки зрения клиента, поэтому, если вы подключаетесь к https://some.example.com/, тогда имя в сертификате должно быть some.example.com, если вы подключаетесь к https://localhost/, тогда имя в сертификате должно быть localhost, даже если some.example.com и localhost могут фактически быть одним и тем же сервером. (Я предполагаю, что по умолчанию IIS может сгенерировать сертификат для внешнего имени, но вам нужно будет посмотреть на сертификат, чтобы узнать; это должно быть видно где-то в свойствах сертификата.)

person Bruno    schedule 22.06.2010
comment
Есть кое-что, чего я не понимаю. Когда я вообще не ставлю сертификат, SSL-соединение устанавливается успешно, мне интересно, как сервер расшифровывает сообщение без сертификата клиента. - person Costa; 23.06.2010
comment
Сертификат клиента используется только для аутентификации. Это сертификат сервера, который используется для шифрования общих ключей (впрочем, в зависимости от набора шифров). При использовании дополнительных клиентских сертификатов отказ от предоставления сертификата - это нормально, но предоставление недействительного сертификата приводит к сбою рукопожатия. Я подозреваю, что сервер не настроен на доверие вашему клиентскому сертификату (это сертификат клиента от центра сертификации, которому доверяет ваш сервер?), Или, возможно, нет сопоставления этого сертификата с пользователем, известным системе. (Не знаю, как это работает с IIS.) Возможно, стоит посмотреть msdn.microsoft.com/en-us/library/aa376545%28VS.85%29.aspx - person Bruno; 27.06.2010