无法删除安装在 Exchange Server 中的证书

症状

请考虑以下情况:

在这种情况下,您会收到以下错误消息:

“服务器 <服务器名称>上出现特殊的 Rpc 错误:这些证书使用以下发送连接器标记: <发送连接器名称>。 从发送连接器中删除和替换证书会中断邮件流。 如果仍要继续,请从发送连接器替换或删除这些证书,然后尝试此命令。”

尝试删除与发送连接器关联的传输证书时收到的错误的屏幕截图。

如果新证书的颁发者名称和使用者名称与旧证书使用的相同,则会出现此问题。

原因

为了避免邮件流中断,如果颁发者名称和使用者名称在任何发送连接器的 TlsCertificateName 属性中指定,Exchange Server将阻止删除证书。 属性值的格式 TlsCertificateName 为“<I>IssuerName<S>SubjectName”。 TlsCertificateName如果值与旧证书和新证书匹配,Exchange Server将阻止删除这两个证书。

解决方案

若要删除旧证书,请使用以下步骤。 除非另有说明,否则请在 Exchange 命令行管理程序中运行以下 PowerShell 命令 (EMS) 。

  1. 获取新旧证书的指纹。 为此,请运行以下命令获取所有Exchange Server证书的列表。 然后,确定列表中的新证书和旧证书。

    Get-ExchangeCertificate | Format-List FriendlyName,Subject,Issuer,CertificateDomains,Thumbprint,NotBefore,NotAfter
    
  2. 对于错误消息中报告的每个发送连接器,请使用 Get-SendConnector cmdlet 生成关联的 源传输服务器的聚合列表:

    Get-SendConnector -Identity <connector name> | Format-List SourceTransportServers
    

    或者,在 EAC 中标识源传输服务器,如下所示:

    1. 导航到 “邮件流>发送连接器”。

    2. 对于错误消息中报告的每个发送连接器:

      1. 双击以打开连接器。

      2. 导航到 “范围>源服务器 ”,查看与该连接器关联的服务器。

  3. 若要在此过程中尽量减少邮件流问题,请在步骤 2 中找到的每个源传输服务器上运行以下命令来停止 Microsoft Exchange 传输服务。 命令不必在 EMS 中运行,但它需要提升的 PowerShell 会话。

    Stop-Service MSExchangeTransport
    

    或者,在每个源传输服务器上使用 Services.msc 管理单元停止 Microsoft Exchange 传输服务。

    注意

    停止传输服务后,将停止每个源传输服务器上的邮件流,直到在此过程的最后一步中重启 Microsoft Exchange 传输服务。 有关Exchange Server中邮件流的详细信息,请参阅队列中的队列和邮件

  4. 对于错误消息中报告的每个发送连接器,请使用 Set-SendConnector cmdlet 清除其 TlsCertificateName 属性:

    Set-SendConnector -Identity <connector name> -TlsCertificateName $Null
    

    注意

    如果具有使用不同站点的大型环境,则可能必须 强制 AD 复制 以完全删除 TlsCertificateName 受影响的源传输服务器上的属性值。

  5. 对于在步骤 2 中找到的每个源传输服务器,请运行以下命令删除旧证书:

    Remove-ExchangeCertificate -Server <server name> -Thumbprint <old certificate thumbprint>
    

    或者,可以在 EAC 中删除旧证书,如下所示:

    1. 导航到 “服务器>证书”。

    2. 对于在步骤 2 中找到的每个源传输服务器:

      1. 选择服务器。

      2. 选择旧证书,然后将其删除。

    注意

    如果在重新分配 TlsCertificateName 属性值之前未从所有适用的源传输服务器中删除旧证书,则必须重复解析过程以删除旧证书的剩余实例。

  6. TlsCertificateName通过运行以下命令生成属性值:

    $cert = Get-ExchangeCertificate -Thumbprint <new certificate thumbprint>
    $tlscertificatename = "<i>$($cert.Issuer)<s>$($cert.Subject)"
    
  7. 对于错误消息中报告的每个发送连接器,请运行以下命令以分配 TlsCertificateName 在步骤 6 中生成的属性值:

    Set-SendConnector -Identity <connector name> -TlsCertificateName $tlscertificatename
    
  8. 通过在步骤 2 中找到的每个源传输服务器上运行以下命令,重启 Microsoft Exchange 传输服务。 命令不必在 EMS 中运行,但它需要提升的 PowerShell 会话。

    Start-Service MSExchangeTransport
    

    或者,可以在每个源传输服务器上的 Services.msc 管理单元中启动 Microsoft Exchange 传输服务。

更多信息

若要确定发送或接收连接器使用的证书,请执行以下步骤:

  1. 为连接器启用协议日志记录 。 有关协议日志记录的详细信息,请参阅 Exchange Server 中的协议日志记录

  2. 打开连接器的最新协议日志文件。 通过在 EMS 中运行以下命令,可以确定适用的日志文件夹路径:

    Get-TransportService | Format-List Identity,*ProtocolLogPath
    
  3. 在协议日志文件中,通过在 列中搜索以“发送证书”开头的条目,查找连接器的 context 证书信息。 证书信息位于同一 data 行的 列中。 证书信息的格式为“使用者>颁发者><SerialNumber><Thumbprint<>NotBefore><NotAfter><CertificateDomains”。><<

    通过在 EMS 中运行以下命令,可以找到相应的Exchange Server证书:

    Get-ExchangeCertificate | Format-List Subject,Issuer,SerialNumber,Thumbprint,NotBefore,NotAfter,CertificateDomains
    

有关证书管理的详细信息,请参阅 Exchange Server 中的证书过程