通过第三方证书颁发机构启用通过 SSL 的 LDAP

本文介绍如何通过第三方证书颁发机构启用通过安全套接字层 (SSL) 的轻型目录访问协议 (LDAP)。

适用于: Windows Server 2012 R2
原始 KB 编号: 321051

摘要

LDAP 用于从 Active Directory 读取和写入。 默认情况下,LDAP 流量传输时不受保护。 你可以使用 SSL/传输层安全性 (TLS) 技术使 LDAP 流量保持机密性和安全性。 你可以根据本文中的指南从 Microsoft 证书颁发机构 (CA) 或非 Microsoft CA 安装格式正确的证书,从而启用通过 SSL 的 LDAP (LDAPS)。

没有用于配置 LDAPS 的用户界面。 在域控制器上安装有效的证书将允许 LDAP 服务侦听并自动接受 LDAP 和全局编录流量的 SSL 连接。

LDAPS 证书的要求

若要启用 LDAPS,必须安装满足以下要求的证书:

  • LDAPS 证书位于本地计算机的个人证书存储(编程方式中称为计算机的 MY 证书存储)。

    注意

    如果 NT 目录服务 (NTDS) 存储中存在证书,则 DC 将改用 NTDS 存储中的证书。

  • 与证书匹配的私钥位于本地计算机的存储中,并与证书正确关联。 私钥不能启用强私钥保护。

  • 增强型密钥使用扩展包括服务器身份验证 (1.3.6.1.5.5.7.3.1) 对象标识符(也称为 OID)。

  • 域控制器的 Active Directory 完全限定域名(例如,dc01.contoso.com)必须位于下列位置之一:

    • “使用者”字段中的公用名 (CN)。
    • 使用者可选名称扩展中的 DNS 条目。
  • 证书由域控制器和 LDAPS 客户端信任的 CA 颁发。 信任通过配置客户端和服务器信任颁发 CA 链的根 CA 而建立。

  • 使用 Schannel 加密服务提供程序 (CSP) 来生成密钥。

创建证书请求

任何创建有效 PKCS #10 请求的实用工具或应用程序都可用于形成 SSL 证书请求。 使用 Certreq 形成请求。

Certreq.exe 需要文本指令文件才能为域控制器生成适当的 X.509 证书请求。 你可以使用喜欢的 ASCII 文本编辑器创建此文件。 将文件作为 .inf 文件保存到硬盘上的任意文件夹。

若要请求适用于 LDAPS 的服务器身份验证证书,请按照以下步骤操作:

  1. 创建 .inf 文件。 下面是一个示例 .inf 文件,可用于创建证书请求。

    ;----------------- request.inf -----------------

    [Version]

    Signature="$Windows NT$"

    [NewRequest]

    Subject = “CN=<DC fqdn>” ;将 替换为 DC 的 FQDN
    KeySpec = 1
    KeyLength = 1024
    ;可以为 1024、2048、4096、8192 或 16384。
    ;较大的密钥大小更安全,但
    ;对性能影响更大。
    Exportable = TRUE
    MachineKeySet = TRUE
    SMIME = False
    PrivateKeyArchive = FALSE
    UserProtected = FALSE
    UseExistingKeySet = FALSE
    ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
    ProviderType = 12
    RequestType = PKCS10
    KeyUsage = 0xa0

    [EnhancedKeyUsageExtension]

    OID=1.3.6.1.5.5.7.3.1;用于服务器身份验证

    ;-----------------------------------------------

    剪切示例文件并将其粘贴到名为 Request.inf 的新文本文件中。 在请求中提供域控制器的完全限定 DNS 名称。

    某些第三方证书颁发机构可能需要“使用者”参数中的其他信息。 这些信息包括电子邮件地址 (E)、组织单位 (OU)、组织 (O)、区域或城市 (L)、省/市/自治区 (S) 以及国家或地区 (C)。 你可以将这些信息追加到 Request.inf 文件中的使用者名称 (CN)。 例如:

    Subject=“E=admin@contoso.com, CN=<DC fqdn>, OU=Servers, O=Contoso, L=Redmond, S=Washington, C=US.”

  2. 通过在命令提示符处运行下面的命令来创建请求文件:

    certreq -new request.inf request.req
    

    随即创建名为 Request.req 的新文件。 它是采用 base64 编码的请求文件。

  3. 将请求提交给 CA。 你可以将请求提交给 Microsoft CA 或第三方 CA。

  4. 检索颁发的证书,然后按照以下步骤将证书作为 Certnew.cer 保存到与请求文件相同的文件夹中:

    1. 创建名为 Certnew.cer 的新文件。
    2. 在记事本中打开该文件,将编码的证书粘贴到该文件,然后保存该文件。

    注意

    保存的证书必须采用 base64 编码。 某些第三方 CA 会将颁发的证书以 base64 编码文本通过电子邮件返回给请求者。

  5. 通过在命令提示符处运行下面的命令来接受颁发的证书:

    certreq -accept certnew.cer
    
  6. 按照以下步骤验证证书是否已安装在计算机的个人存储中:

    1. 打开 Microsoft 管理控制台 (MMC)。
    2. 添加在本地计算机上管理证书的证书管理单元。
    3. 依次展开“证书(本地计算机)”、“个人”、“证书”。 个人存储中应存在新证书。 在“证书属性”对话框中,显示的预期目的是“服务器身份验证”。 此证书颁发给计算机的完全限定主机名。
  7. 重新启动域控制器。

有关创建证书请求的详细信息,请参阅以下《高级证书注册和管理》白皮书。 要查看此白皮书,请访问高级证书注册和管理

验证 LDAPS 连接

安装证书后,按照以下步骤验证是否启用了 LDAPS:

  1. 启动 Active Directory 管理工具 (Ldp.exe)。

  2. 在“连接”菜单上,单击“连接”

  3. 键入要连接到的域控制器的名称。

  4. 键入 636 作为端口号。

  5. 单击“确定”。

    右侧窗格会输出 RootDSE 信息,指示连接成功。

可能存在的问题

  • 启动 TLS 扩展请求

    LDAPS 通信通过端口 TCP 636 进行。 通过 TCP 3269 与全局编录服务器进行 LDAPS 通信。 当连接到端口 636 或 3269 时,会在交换任何 LDAP 流量之前协商 SSL/TLS。

  • 多个 SSL 证书

    Microsoft SSL 提供程序 Schannel 会选择它在本地计算机存储中找到的第一个有效证书。 如果本地计算机存储中提供多个有效证书,则 Schannel 可能不会选择正确的证书。

  • SP3 之前的 SSL 证书缓存问题

    如果现有 LDAPS 证书通过续订过程或者由于颁发 CA 已更改替换为另一个证书,则必须重启服务器才能让 Schannel 使用新证书。

改进

本文中最初的建议是将证书放在本地计算机的个人存储中。 尽管支持此选项,但还可以将证书放入 NTDS 服务在 Windows Server 2008 和更高版本的 Active Directory 域服务 (AD DS) 中的个人证书存储中。 有关如何将证书添加到 NTDS 服务的个人证书存储的详细信息,请参阅 事件 ID 1220 - LDAP over SSL

AD DS 优先通过本地计算机的存储查找此存储中的证书。 这样可以更轻松地将 AD DS 配置为使用要使用的证书。 这是因为本地计算机个人存储中可能有多个证书,因此可能很难预测会选择哪个证书。

AD DS 检测新证书何时被放入其证书存储中,然后触发 SSL 证书更新,而无需重启 AD DS 或重启域控制器。

名为 renewServerCertificate 的新 rootDse 操作可用于手动触发 AD DS 以更新其 SSL 证书,而无需重启 AD DS 或重启域控制器。 可以使用 adsiedit.msc 或导入 LDAP 目录交换格式中的更改 (LDIF) 使用 ldifde.exe 来更新此属性。 有关使用 LDIF 更新此属性的详细信息,请参阅 renewServerCertificate

最后,如果 Windows Server 2008 或更高版本的域控制器在其存储中发现多个证书,它将随机选择其中一个证书。

所有这些都适用于 Windows Server 2008 AD DS 和 2008 Active Directory 轻型目录服务 (AD LDS)。 对于 AD LDS,将证书放入与 AD LDS 实例对应的服务,而不是 NTDS 服务的个人证书存储中。