2016-10-21 4 views
0

У меня есть веб-сайт ASP.NET MVC, который я настроил для аутентификации через службу федерации Active Directory. Все работало нормально, пока я не попытался включить шифрование токена. Как обычно, я создал еще один самозаверяющий сертификат в IIS, добавил его в доверенные корневые полномочия на моем веб-сервере и сервере ADFS и очень быстро запускал приложение, как он работает.Ошибка проверки цепи сертификата шифрования ADFS

Мое приложение правильно перенаправило меня на страницу службы ADFS, чтобы ввести учетные данные. Но когда я представляю свой логин и пароль, я сразу же получить «An error occured» сообщение на ту же странице входа с не очень полезными деталями раздела:

Activity ID: 00000000-0000-0000-b039-0080010000e4 
Relying party: [My relying party name] 
Error time: Fri, 21 Oct 2016 18:48:24 GMT 
Cookie: enabled 
User agent string: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 

я не попадаю на мой сайт после этого и сетевой панели не содержит никаких запросов.

Но я обнаружил, что если я добавить следующий параметр в web.config моего веб-сайта, он начинает работать снова:

<certificateValidation certificateValidationMode="None" /> 

Таким образом, ошибка должна быть связана с тем, что мой сертификат само- подписан. Но я добавил его к доверенным корневым службам как на веб-сервере, так и на сервере ADFS (а также несколько других «подозрительных» сертификатов).

Есть ли у кого-нибудь идеи, что может быть отсутствует, и Что я могу сделать, чтобы моя тестовая среда работала с самозаверяющими сертификатами, проверяя цепочку сертификатов?

ответ

0

Похоже, что для устранения ошибки достаточно добавить сертификат подписи токена ADFS в качестве доверенного корневого центра сертификации на моем веб-сервере.

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

0

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

Что-то, что может помочь вам устранить неполадки.

Установка обратного вызова проверки серт на что-то вроде:

// validate server cert 
ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate; 

Затем в методе проверки вы можете опрашивать цепочку:

private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
     { 
      // default validation bool to false 
      var isValid = false; 

      // If the certificate is a valid, signed certificate, return true to short circuit any add'l processing. 
      if (sslPolicyErrors == SslPolicyErrors.None) 
      { 
       return true; 
      } 
      else 
      { 
       // cast cert as v2 in order to expose thumbprint prop 
       var requestCertificate = (X509Certificate2)certificate; 

       // init string builder for creating a long log entry 
       var logEntry = new StringBuilder(); 

       // capture initial info for the log entry 
       logEntry.AppendFormat("Certificate Validation Error - SSL Policy Error: {0} - Cert Issuer: {1} - SubjectName: {2}", 
        sslPolicyErrors.ToString(), 
        requestCertificate.Issuer, 
        requestCertificate.SubjectName.Name); 

       //init special builder for thumprint mismatches 
       var thumbprintMismatches = new StringBuilder(); 

       // load valid certificate thumbs for comparison later 
       var validThumbprints = new string[] { "thumbprint A", "thumbprint N" }; 

       // else if a cert name mismatch then assume api pass thru issue and verify thumb print 
       if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch) 
       { 
        // compare thumbprints 
        var hasMatch = validThumbprints.Contains(requestCertificate.Thumbprint, StringComparer.OrdinalIgnoreCase); 

        // if match found then we're valid so clear builder and set global valid bool to true 
        if (hasMatch) 
        { 
         thumbprintMismatches.Clear(); 
         isValid = true; 
        } 
        // else thumbprint did not match so append to the builder 
        else 
        { 
         thumbprintMismatches.AppendFormat("|Thumbprint mismatch - Issuer: {0} - SubjectName: {1} - Thumbprint: {2}", 
          requestCertificate.Issuer, 
          requestCertificate.SubjectName.Name, 
          requestCertificate.Thumbprint); 
        } 
       } 
       // else if chain issue, then iterate over the chain and attempt find a matching thumbprint 
       else if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) //Root CA problem 
       { 
        // check chain status and log 
        if (chain != null && chain.ChainStatus != null) 
        { 
         // check errors in chain and add to log entry 
         foreach (var chainStatus in chain.ChainStatus) 
         { 
          logEntry.AppendFormat("|Chain Status: {0} - {1}", chainStatus.Status.ToString(), chainStatus.StatusInformation.Trim()); 
         } 

         // check for thumbprint mismatches 
         foreach (var chainElement in chain.ChainElements) 
         { 
          // compare thumbprints 
          var hasMatch = validThumbprints.Contains(chainElement.Certificate.Thumbprint, StringComparer.OrdinalIgnoreCase); 

          // if match found then we're valid so break, clear builder and set global valid bool to true 
          if (hasMatch) 
          { 
           thumbprintMismatches.Clear(); 
           isValid = true; 
           break; 
          } 
          // else thumbprint did not match so append to the builder 
          else 
          { 
           thumbprintMismatches.AppendFormat("|Thumbprint mismatch - Issuer: {0} - SubjectName: {1} - Thumbprint: {2}", 
            chainElement.Certificate.Issuer, 
            chainElement.Certificate.SubjectName.Name, 
            chainElement.Certificate.Thumbprint); 
          } 
         } 
        } 
       } 

       // if still invalid and thumbprint builder has items, then continue 
       if (!isValid && thumbprintMismatches != null && thumbprintMismatches.Length > 0) 
       { 
        // append thumbprint entries to the logentry as well 
        logEntry.Append(thumbprintMismatches.ToString()); 
       } 

       // log as WARN here and not ERROR - if method ends up returning false then it will bubble up and get logged as an ERROR 
       LogHelper.Instance.Warning((int)ErrorCode.CertificateValidation, logEntry.ToString().Trim()); 
      } 

      // determine env 
      var isDev = EnvironmentHelper.IsDevelopment(); 
      var isTest = EnvironmentHelper.IsTest(); 

      // if env is dev or test then ignore cert errors and return true (reference any log entries created from logic above for troubleshooting) 
      if (isDev || isTest) 
       isValid = true; 

      return isValid; 
     } 

ПРИМЕЧАНИЕ: вам нужно отключить/изменить некоторые из пользовательских кодов - отпечаток пальца, ведение журнала и т. д.

0

Добавление сертификатов в ваш доверенный магазин CA означает, что вы trus t эмитент сертификата, который является самим сертификатом в этом случае, поскольку он является самозаверяющим сертификатом. Отсутствует то, что проверка сертификата выполняет проверку проверки цепочки и аннулирования, и одна из двух проверок не удалась для вас. Обратите внимание, что даже если вы доверяете сертификату, его все равно можно было бы отозвать в последнее время и, следовательно, больше не следует доверять. Поэтому проверка отзыва всегда необходима. Для тестирования отключение проверки отзыва является одним из способов. Одна сторона ADFS, вы можете отключить проверку отзыва на каждую доверяющую сторону. Если проверка происходит по вашему собственному коду, вы можете полностью отключить проверку или использовать код Stinky Towel, чтобы выборочно разрешать только некоторые сертификаты.

+0

Как это можно отменить, если я только что создал его? И так как это самозапись, какая проверка цепи вы имеете в виду? –

+1

Я не сказал, что ваш сертификат был отозван. Я сказал, что по умолчанию WIF/ADFS проверяет, было ли оно отменено, и если они не могут выполнить проверку, потому что самозаверяющий сертификат не предоставляет ни CRL, ни OCSP, проверка отзыва считается «неудачной». – Thuan

 Смежные вопросы

  • Нет связанных вопросов^_^