Udostępnij za pośrednictwem


Negocjacje protokołu TLS nie powiodły się z powodu błędu NoCredentials, jeśli komunikaty do domen zewnętrznych są odroczone

Oryginalny numer KB: 4495258

Symptomy

Email komunikaty wysyłane do domen zewnętrznych są umieszczane w kolejce w Exchange Server lokalnym (2016 lub 2013). Po sprawdzeniu stanu zostanie wyświetlony następujący komunikat o błędzie:

Upłynął limit czasu połączenia 421 4.4.1" Podjęto próbę przejścia w tryb failover do alternatywnego hosta, ale nie powiodło się. Brak alternatywnych hostów lub dostarczenie nie powiodło się dla wszystkich hostów alternatywnych.

Ponadto następujący wpis błędu w dziennikach wyślij łącznika wskazuje, że negocjacje protokołu TLS (Transport Layer Security) nie powiodły się:

Negocjacje protokołu TLS nie powiodły się z powodu błędu NoCredentials

Przyczyna

Ten problem występuje, jeśli spełnione są następujące warunki:

  • W certyfikacie używanym do wychodzącego protokołu TLS brakuje klucza prywatnego.
  • Atrybut należy wypełnić TLSCertificateName przy użyciu ciągów Wystawcy i SubjectName certyfikatu. Ponadto <I>Issuer string<S>SubjectName string atrybut jest używany do wychodzącego protokołu TLS w łączniku wysyłania w celu kierowania wiadomości e-mail do domen zewnętrznych.

Rozwiązanie

Aby rozwiązać ten problem, wykonaj następujące kroki:

  1. Włącz rejestrowanie w łączniku wyślij autorytatywny do wysyłania wiadomości e-mail. W tym celu uruchom następujące polecenie cmdlet programu PowerShell jako administrator:

    Set-SendConnector "NameOfTheSendCconnector" -ProtocolLoggingLevel Verbose
    
  2. Przejrzyj dzienniki wysyłania łącznika, aby zidentyfikować certyfikat używany podczas wychodzącego protokołu TLS. Na przykład wpis dziennika może wyglądać następująco:

    Date/Time.ConnectorId,Outbound to Office 365,SessionId,16,192.168.0.78:28252,172.16.38.36:25,,,,Sending certificate
    Date/Time.ConnectorId,Outbound to Office 365,SessionId,17,192.168.0.78:28252,172.16.38.36:25,CN
    =.xxx.xxx.xxx,podmiot certyfikatu
    Date/Time.ConnectorId,Outbound to Office 365,SessionId,18,192.168.0.78:28252,172.16.38.36:25,
    ,"CN=xxxxxx, OU=xxxxxx, O=xxxx, L=xxxx, S=xxxxx, C=xx",Nazwa wystawcy certyfikatu
    Date/Time.ConnectorId,Outbound to Office 365,SessionId,19,192.168.0.78:28252,172.16.38.36:25,xxxxxxxxx,Numer seryjny certyfikatu
    Date/Time.ConnectorId,Outbound to Office 365,SessionId,20,192.168.0.78:28252,172.16.38.36:25,
    ,xxxxxxxxxxxx, odcisk palca certyfikatu
    Date/Time.ConnectorId,Outbound to Office 365,SessionId,21,192.168.0.78:28252,172.16.38.36:25,,.xxxx.xxx.xx alternatywne nazwy
    Date/Time.ConnectorId,Outbound to Office 365,SessionId,22,192.168.0.78:28252,172.167.38.36:25,*,,Negocjacje protokołu TLS nie powiodły się z powodu błędu NoCredentials

  3. Sprawdź stan PrivateKey właściwości certyfikatu, który został zidentyfikowany w kroku 2. W tym celu uruchom następujące polecenie cmdlet:

    Get-ChildItem -Path Cert:\LocalMachine\My | where {$_.Thumbprint -like 'Certificate thumbprint identified in step 2'} | Select-Object -Property thumbprint,hasprivatekey
    
  4. Usuń certyfikat zidentyfikowany w kroku 2, uruchamiając następujące polecenie cmdlet:

    Get-ChildItem -Path Cert:\LocalMachine\My | where {$_.Thumbprint -like 'Certificate thumbprint identified in step 2'} | remove-item
    

    Uwaga

    Przed usunięciem certyfikatu zidentyfikowanego w kroku 2 upewnij się, że nie istnieje zależność certyfikatu od żadnej innej aplikacji uruchomionej na serwerze z uruchomionym Microsoft Exchange Server. Jeśli istnieje zależność, wprowadź wymagane zmiany w aplikacji, aby aplikacja została uruchomiona przy użyciu certyfikatu wymienionego w kroku 5.

  5. Zaimportuj prawidłowy certyfikat innej firmy przez zwykły proces importowania, a następnie sprawdź stan certyfikatu z powłoki zarządzania programu Exchange, uruchamiając następujące polecenie cmdlet.

    Get-ExchangeCertificate | where {$_.rootca -eq 'third-party certificate'}
    

    Uwaga

    Powłoka zarządzania programu Exchange zawsze wyświetla listę certyfikatów, które mają prawidłowy klucz prywatny.

  6. Włącz usługę SMTP na nowo zaimportowanym certyfikacie innej firmy, uruchamiając następujące polecenie cmdlet:

    Enable-Exchangecertificate -thumbprint "Thumbprint of the new certificate" -services SMTP
    

    Uwaga

    Po wyświetleniu monitu o zastąpienie istniejącego certyfikatu przy użyciu nowego certyfikatu wpisz Nie.

  7. Jeśli certyfikat innej firmy został już zaimportowany, Exchange Server uruchamiany przy użyciu nowego certyfikatu innej firmy.

  8. Uruchom następujące polecenie cmdlet, aby wykonać ponawianie próby względem komunikatów w kolejce.

    Get-queue -resultsize unlimited | where {$_.status -eq 'retry'} | retry-queue