Windows Server 2012 子 CA 失败,因为使用来自 Linux/OpenSSL 根 CA 的根 CA 证书时撤销处于离线状态

Windows Server 2012 子 CA 失败,因为使用来自 Linux/OpenSSL 根 CA 的根 CA 证书时撤销处于离线状态

我一直在实验室里工作,使用 Linux(带有 OpenSSL 的 Debian 9)根证书颁发机构和 Windows Server 2012 R2 从属证书颁发机构建立两层 PKI。

当我尝试在 Windows 服务器上安装已签名的从属证书时,我首先收到一条警告,指出无法验证根 CA。我单击“确定”以忽略警告,之后 ADCS 不会启动。当我手动启动 ADCS 时,我收到错误消息;

“由于撤销服务器处于离线状态,撤销功能无法检查撤销”

我认为问题在于我如何指向 Linux 根 CA 上的 CRL 分发点和 AIA 或者如何在 Windows 服务器上设置 IIS(可能两者兼而有之)。

设置

  • rootca:Linux Debain 9 作为根证书颁发机构
  • testpki:Windows Server 2012 R2 作为从属证书颁发机构/IIS
  • dc0:Windows Server 2012 R2 作为域控制器

Linux

我在 rootca 上设置了一个自定义 OpenSSL 配置文件,添加了以下行;

authorityInfoAccess = caIssuer;URI:http://testpki.example.com/crld/root.cer
crlDistributionPoints = URI:http://testpki.example.com/crld/root.crl

到配置文件的 v3_ca 和 v3_intermediate_ca 部分。

视窗

我为“testpki.example.com”设置了 DNS 记录,以便在 dc0 上进行名称解析。

Linux 机器中的根证书被导入到 testpki 上的证书颁发机构管理单元中的受信任的根证书颁发机构目录中。

在testpki上安装IIS之后,我设置了一个别名为crld的虚拟目录,并将根证书和CRL复制到该目录中。

输入 URL“testpki.example.com/crld”时我可以连接到 IIS,但如果输入 URL“testpki.example.com/crld/root.cer”,即使“root.cer”显示在“../crld”页面索引中,我也会收到 404 错误。

其余设置按照本指南完成:使用 openssl 作为 Windows 的 root ca

任何见解都将不胜感激。

-谢谢

certutil -verify -urlfetch ..\subca.cer 输出

发行人:
    CN=示例-TESTPKI-CA
  名称哈希(sha1):e6c59398cbed5b994ff33c6e6380312fe2ad9a4a
  名称哈希(md5):b0f8c7beb298a3ba230f71fbc927b386
主题:
    CN=示例-TESTPKI-CA-Xchg
  名称哈希(sha1):86f6ae3e12a21350005b9d70b1229ecb1b78dd0b
  名称哈希(md5):dd1324e864c4233d2f87e9c0c342dfcd
证书序列号:4b0000000478b909e350cb7280000000000004

dwFlags = CA_VERIFY_FLAGS_CONSOLE_TRACE (0x20000000)
dwFlags = CA_VERIFY_FLAGS_DUMP_CHAIN (0x40000000)
链标志 = CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT (0x40000000)
HCCE_本地机器
CERT_CHAIN_POLICY_BASE
-------- CERT_CHAIN_CONTEXT --------
ChainContext.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
ChainContext.dwErrorStatus = CERT_TRUST_REVOCATION_STATUS_UNKNOWN (0x40)
ChainContext.dwErrorStatus = CERT_TRUST_IS_OFFLINE_REVOCATION (0x1000000)

SimpleChain.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
SimpleChain.dwErrorStatus = CERT_TRUST_REVOCATION_STATUS_UNKNOWN (0x40)
SimpleChain.dwErrorStatus = CERT_TRUST_IS_OFFLINE_REVOCATION (0x1000000)

证书上下文[0][0]: dwInfoStatus=102 dwErrorStatus=0
  颁发者:CN=example-TESTPKI-CA
  未早于:2018 年 2 月 7 日下午 3:37
  NotAfter:2018 年 2 月 14 日下午 3:47
  主题:CN=example-TESTPKI-CA-Xchg
  序列号:4b0000000478b909e350cb7280000000000004
  模板:CAExchange
  a13e6c1703f95408910d21dc380818b23c76e79f
  元素.dwInfoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER (0x2)
  元素.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
  ---------------- AIA 证书 ----------------
  错误颁发者“证书 (0)”时间:0
    [0.0] ldap:///CN=example-TESTPKI-CA,CN=AIA,CN=Public%20Key%20Services,
服务,CN=配置,DC=示例,DC=com?cACertificate?base?objectCla
认证机构

  吊销检查失败“证书(1)”时间:0
    [0.1] ldap:///CN=example-TESTPKI-CA,CN=AIA,CN=Public%20Key%20Services,
服务,CN=配置,DC=示例,DC=com?cACertificate?base?objectCla
认证机构

  ---------------- 证书 CDP ----------------
  已验证“基本 CRL (02)”时间:0
    [0.0] ldap:///CN=example,CN=com,CN=CDP,CN=Public%20Key%
服务,CN = 服务,CN = 配置,DC = 示例,DC = com?certificateRevoca
nList?base?objectClass=cRLDistributionPoint

  已验证“Delta CRL (02)”时间:0
    [0.0.0] ldap:///CN=example-TESTPKI-CA,CN=testpki,CN=CDP,CN=Public%20Ke
0服务,CN=服务,CN=配置,DC=示例,DC=com?deltaRevocation
t?base?objectClass=cRLDistributionPoint

  ---------------- 基本 CRL CDP ----------------
  确定“Delta CRL (02)”时间:0
    [0.0] ldap:///CN=example-TESTPKI-CA,CN=testpki,CN=CDP,CN=Public%20Key%
服务,CN = 服务,CN = 配置,DC = 示例,DC = com?deltaRevocationLi
基础?对象类=cRLDistributionPoint

  ---------------- 证书 OCSP ----------------
  无 URL “无” 时间:0
  --------------------------------
    证书吊销清单 02:
    颁发者:CN=example-TESTPKI-CA
    此更新:2018 年 2 月 7 日下午 3:52
    下一更新:2018 年 2 月 15 日 上午 4:12
    7f6e7f6f4d13cd98164e53d35ce406e2dde3dd3a
    達美 CRL 02:
    颁发者:CN=example-TESTPKI-CA
    此更新:2018 年 2 月 7 日下午 3:52
    下一更新:2018 年 2 月 9 日 上午 4:12
    07de3204292fbc0ab4a42cfef02b6b4837a78529
  应用程序[0] = 1.3.6.1.4.1.311.21.5 私钥存档

证书上下文[0][1]: dwInfoStatus=102 dwErrorStatus=1000040
  颁发者:CN=rootca
  未早于:2018 年 2 月 7 日下午 1:17
  NotAfter:2023 年 2 月 6 日下午 1:17
  主题:CN=example-TESTPKI-CA
  序列号:1000
  d74fdf7e86c80171e91dd72a16a1f8f72c9666a3
  元素.dwInfoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER (0x2)
  元素.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
  Element.dwErrorStatus = CERT_TRUST_REVOCATION_STATUS_UNKNOWN (0x40)
  Element.dwErrorStatus = CERT_TRUST_IS_OFFLINE_REVOCATION (0x1000000)
  ---------------- AIA 证书 ----------------
  失败“AIA”时间:0
    检索 URL 时出错:不支持该请求。0x80070032 (WIN32: 50
ROR_不支持)
    testpki.example.com/crld/root.cer

  ---------------- 证书 CDP ----------------
  失败的“CDP”时间:0
    检索 URL 时出错:未找到 (404)。0x80190194 (-2145844844 HTTP_E_STA
_未找到)
    http://testpki.example.com/crld/rootca.crl

  ---------------- 证书 OCSP ----------------
  无 URL “无” 时间:0
  --------------------------------

证书上下文[0][2]: dwInfoStatus=10a dwErrorStatus=0
  颁发者:CN=rootca
  未早于:2018 年 2 月 7 日下午 12:54
  NotAfter:2023 年 2 月 6 日下午 12:54
  主题:CN=rootca
  序列号:94cb4df27b1cb5a3
  99a30cec9d5dbc21afe5e4b679e5db844f7a9dd0
  元素.dwInfoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER (0x2)
  元素.dwInfoStatus = CERT_TRUST_IS_SELF_SIGNED (0x8)
  元素.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
  ---------------- AIA 证书 ----------------
  失败“AIA”时间:0
    检索 URL 时出错:不支持该请求。0x80070032 (WIN32: 50
ROR_不支持)
    testpki.example.com/crld/root.cer

  ---------------- 证书 CDP ----------------
  失败的“CDP”时间:0
    检索 URL 时出错:未找到 (404)。0x80190194 (-2145844844 HTTP_E_STA
_未找到)
    http://testpki.example/crld/rootca.crl

  ---------------- 证书 OCSP ----------------
  无 URL “无” 时间:0
  --------------------------------

排除叶证书:
  a7b797168cbc0ff36636479d8cd2de6f2b184355
全链条:
  7e1caac607a7a5b087b491accf72df2f8d4cf06e
  颁发者:CN=example-TESTPKI-CA
  未早于:2018 年 2 月 7 日下午 3:37
  NotAfter:2018 年 2 月 14 日下午 3:47
  主题:CN=example-TESTPKI-CA-Xchg
  序列号:4b0000000478b909e350cb7280000000000004
  模板:CAExchange
  a13e6c1703f95408910d21dc380818b23c76e79f
撤销功能无法检查撤销,因为撤销
rver 处于离线状态。0x80092013 (-2146885613 CRYPT_E_REVOCATION_OFFLINE)
------------------------------------
跳过吊销检查--服务器离线
叶证书吊销检查已通过
CertUtil:-verify 命令已成功完成。

答案1

好的,现在好多了。这里有几个问题:

  Wrong Issuer "Certificate (0)" Time: 0
    [0.0] ldap:///CN=example-TESTPKI-CA,CN=AIA,CN=Public%20Key%20Services,
Services,CN=Configuration,DC=example,DC=com?cACertificate?base?objectCla
certificationAuthority

此错误表示 Active Directory 中发布了错误的子 CA 证书。您必须通过运行以下命令将子 CA 证书重新发布到 Active Directory:

certutil -dspublish -f SubCA.cer SubCA

现在你的根 CA:

  Failed "AIA" Time: 0
    Error retrieving URL: The request is not supported. 0x80070032 (WIN32: 50
ROR_NOT_SUPPORTED)
    testpki.example.com/crld/root.cer

您在 OpenSSL 配置中输入了错误的 URL。缺少协议前缀。您需要添加http://前缀并重新颁发 SubCA 证书。

  Failed "CDP" Time: 0
    Error retrieving URL: Not found (404). 0x80190194 (-2145844844 HTTP_E_STA
_NOT_FOUND)
    http://testpki.example.com/crld/rootca.crl

这个 URL 看起来是正确的(至少它包含了协议前缀),CA 服务器可以访问 Web 服务器,但是 Web 服务器响应 404,表示请求的路径上没有任何内容。


老实说,你的设置一点都不好。你遇到了太多问题,因为(看起来)设计没有计划好,或者计划没有经过验证。

除了明确的问题之外,您的根 CA 本身包括 CRL 分发点 (CDP) 和授权信息访问 (AIA) 扩展,这些扩展是多余的。您应该从根证书中删除它们。不使用 AIA 是为了避免在路径构建期间出现循环。不使用根证书中的 CDP,因为您无法撤销根(自签名)证书,这是先有鸡还是先有蛋的问题。但它们(CDP 和 AIA 扩展)必须包含在颁发的证书(即下属 CA)中。

我建议你撤销在这里所做的一切并从头开始。

首先,您需要设计您的解决方案,规划好各个方面。

  1. 确定将使用证书的应用程序。
  2. 描述证书要求并规划证书范围。
  3. 根据[2]确定您将使用的证书模板及其配置。
  4. 设计 CA 放置图并创建证书流程图(证书注册、客户端应用程序验证)。
  5. 设计灾难恢复计划,其中包括备份和恢复计划。

否则,你的解决方案将一文不值。即使这是测试部署,你仍然必须通过所有这些步骤。

正确规划 CRT/CRL 发布和下载 URL。您需要仔细检查,因为这些问题无法在不重新部署所有证书的情况下轻松修复。关于此主题的一般建议:

  1. 不要在 CDP/AIA 中使用 LDAP URL。考虑仅使用 HTTP。
  2. 使用专用的 Web 服务器来提供 CRT/CRL 文件(不要将 SubCA 与 Web 服务器角色相结合)。
  3. 不要在根证书中使用 CDP/AIA 扩展
  4. 确保所有客户端(将使用您的证书)都可以访问 CRT/CRL 文件

关于 CDP/AIA 扩展规划,我建议查看我的博客文章:设计 CRL 分发点和授权信息访问位置。尽管本文是针对 Microsoft CA 撰写的,但相同的原则也适用于任何其他 CA 实现,因为这些是最佳实践。

答案2

我设法让我的测试中级 CA 启动并运行。问题很可能出在我的 OpenSSL 配置文件中,特别是 CDP 和 AIA 位。但是,对于其他可能尝试完成类似任务的人,我将描述我所做的最终成功的方法。


在开始之前,你应该先看一下 Crypt32 提供的链接,可以找到这里


首先,对于 DNS 名称解析,请在运行加入域的 DNS 服务的服务器上设置 A 记录,您需要子 CA 和 IIS 服务器的记录。还要确保要用作中间 CA 的 Windows 服务器配置为使用此 DNS 服务器来解析地址。



    在 Linux 根 CA 上
  • 创建目录来保存你的 CA
    mkdir -p ./ca/{certs,private}  
    
    chmod 700 ./ca/private  
    
    触摸索引.txt  
    
    echo 0001 > 串行  
    
    echo 0001 > crlnumber
    
  • 将此配置文件修改需要复制到Linux根CA上的ca目录中
      
    #
    #OpenSSL 配置文件。
    #
    
    # 建立工作目录。
    
    ROOT_CA_FILENAME = rootca #示例 ca 文件名
    HTTP_HOST = pki.example.local #CDP 的示例 URL
    
    目录 = 。
    
    default_ca=CA_Default
    
    [ CA_默认 ]
    串行=$dir/串行
    数据库 = $dir/index.txt
    new_certs_dir = $dir/certs
    crlnumber = $dir/crlnumber
    默认crl_days = 213
    default_md = sha256
    保留 = 否
    email_in_dn = 否
    nameopt=default_ca
    certopt = default_ca
    政策=policy_any
    private_key = $dir/private/$ROOT_CA_FILENAME.key.pem
    证书 = $dir/certs/$ROOT_CA_FILENAME.cert.pem
    
    # 在脚本中设置:default_days = 7305
    
    
    [ 政策任何 ]
    countryName = 可选
    stateOrProvinceName = 可选
    localityName = 可选
    organizationName = 可选
    组织单位名称 = 可选
    commonName = 提供
    emailAddress = 可选
    
    [ 要求 ]
    # `req` 工具的选项(`man req`)。
    默认位数 = 4096
    专有名称 = 请求专有名称
    string_mask = utf8only
    
    # SHA-1 已弃用,因此请改用 SHA-2。
    default_md = sha256
    
    # 使用 -x509 选项时添加的扩展。
    x509_extensions = v3_ca
    
    [ 请求可分辨名称 ]
    # 看 。
    countryName = 国家名称(2 个字母代码)
    stateOrProvinceName = 州或省份名称
    localityName = 地点名称
    0.organizationName = 组织名称
    organizationUnitName = 组织单位名称
    commonName = 通用名称
    emailAddress = 电子邮件地址
    
    # 可选地,指定一些默认值。
    countryName_default =
    州或省份名称_默认 =
    localityName_default =
    0.组织名称_默认=
    组织单位名称_默认=
    电子邮件地址_默认 =
    
    [ v3_ca ]
    # 典型 CA 的扩展(“man x509v3_config”)。
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:始终,发行人
    基本约束 = 关键,CA:true
    keyUsage = 关键,数字签名,cRLSign,keyCertSign
    
    [ v3_intermediate_ca ]
    # 典型中间 CA 的扩展(“man x509v3_config”)。
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:始终,发行人
    基本约束 = 关键,CA:true,路径长度:0
    keyUsage = 关键,数字签名,cRLSign,keyCertSign
    crlDistributionPoints = URI:http://$HTTP_HOST/crldist/$ROOT_CA_FILENAME.crl
    authorityInfoAccess = caIssuers;URI:http://$HTTP_HOST/crldist/$ROOT_CA_FILENAME.crt
    
    [ usr_cert ]
    # 客户端证书的扩展(“man x509v3_config”)。
    基本约束 = CA:FALSE
    nsCertType = 客户端,电子邮件
    nsComment = “OpenSSL 生成的客户端证书”
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,发行者
    keyUsage = 关键、不可否认、数字签名、keyEncipherment
    扩展密钥使用情况 = clientAuth,电子邮件保护
    
    [ 服务器证书 ]
    # 服务器证书的扩展(“man x509v3_config”)。
    基本约束 = CA:FALSE
    nsCertType = 服务器
    nsComment = “OpenSSL 生成的服务器证书”
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,发行人:始终
    keyUsage = 关键,数字签名,密钥加密
    扩展密钥使用情况 = 服务器验证
    
    [ crl_ext ]
    # CRL 的扩展(`man x509v3_config`)。
    authorityKeyIdentifier=keyid:始终
    
    [ OCSP ]
    # OCSP 签名证书的扩展(“man ocsp”)。
    基本约束 = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,发行者
    keyUsage = 关键,数字签名
    扩展密钥使用情况 = 关键,OCSPSigning
    
    
  • 生成密钥对
     
    openssl genrsa -aes256 -out private/rootca.key.pem 4096  
    chmod 400 private/rootca.key.pem  
    openssl req -config /路径/到/配置 \  
    -密钥私钥/rootca.key.pem \  
    -新-x509-天1825-sha256-extensions v3_ca \  
    -输出证书/rootca.cert.pem  
    
    输入 ca.key.pem 的密码:secretpassword
    您将被要求输入将被纳入的信息
    到您的证书请求中。
    -----
    国家名称(2 个字母代码)[XX]:.
    州或省名称 []:.
    地点名称 []:.
    机构名称 []:。
    组织单位名称 []:.
    通用名称 []:测试根 CA
    电子邮件地址 []:。
    
    chmod 444 certs/rootca.cert.pem
    
  • 在运行 IIS 的 Windows 服务器上
  • 打开 IIS 管理器
  • 展开左侧窗格中的目录,然后右键单击“默认站点”。选择添加虚拟目录
  • 在“别名”下的添加虚拟目录对话框中,输入您在上面的 OpenSSL 配置文件中用于 CDP 和 AIA URL 的内容
  • 在“物理路径”下,输入您要用于证书注册的目录的路径,按 Enter 并单击确定
  • 返回 IIS 管理器,在左侧窗格中选择新的虚拟目录,在中间窗格中选择目录浏览。在右侧的详细信息窗格中选择启用
  • 在左窗格中仍然选中虚拟目录的情况下,选择配置编辑器
  • 在配置编辑器中,在下拉菜单中导航到 system.webServer\security\requestFiltering 并将“Double Escaping”设置为 True
  • 应用更改
  • 您可能需要调整虚拟目录的权限。此外,您现在可以将 rootca 证书导入 IIS 服务器本地计算机受信任的根证书颁发机构目录(位于 IIS 服务器上的 MMC 证书管理单元中)

  • 在用作中间 CA 的 Windows 服务器上
  • 通过服务器管理器安装 Active Directory 证书服务(注意:该计算机必须加入域)
  • 确保安装管理功能,在角色安装向导中为角色服务选择企业 CA,为 CA 类型选择从属 CA。
  • 对于私钥设置,选择新私钥,在下拉菜单中选择 MS-RSA,对于哈希算法,选择 sha256,并将密钥长度设置为 4096。这将生成一个 CSR,该 CSR 将被复制到 Linux 根 CA
  • 您现在可以将 rootca 证书导入 mmc 证书管理单元

  • 回到 Linux CA
  • 将您的 CSR 复制到您之前创建的根 CA 目录后,运行:
    openssl ca -config /path/to/config -extensions v3_intermediate_ca -days 1825 -notext -md sha256 -in ca/"CSR 文件" -out ca/certs/subca.cer
  • 您现在在 ca/certs 目录中有一个已签名的中级 CA 证书,可以将其复制到 Windows 子 CA
  • 在将 subca 证书安装到 ADCS 之前,使用以下命令生成 CRL:
    openssl ca -gencrl -out rootca.crl.pem -config /path/to/config
    并将生成的 crl 和根证书复制到之前在 IIS 服务器上创建的虚拟目录中

  • 返回 Windows 中级服务器
  • 确保 IIS 服务器的 FQDN 可以从中间 CA 解析,在上面的配置文件中输入用于 CDP 的 URL,如果您在配置文件中使用了 CA_FILENAME 和 HTTP_HOST 示例,则在浏览器的 URL 栏中输入“http://pki.example.local/crldist/rootca.crl”,系统应提示您下载或打开 crl 文件。如果出现 404 错误,请检查用于 CDP 的虚拟目录的权限,如果出现 401 错误,请检查 IIS 服务器的身份验证设置
  • 从服务器管理器打开“证书颁发机构”应用程序,右键单击左侧窗格中的子证书颁发机构,选择导入
  • 浏览到从 Linux 根 CA 复制的 subca.cer 文件的位置。单击“确定”

您的 Windows 中级 CA 现在应该已启动并正在运行。

来源

  • 使用 OpenSSL 作为 Windows 的根 CA
  • 创建证书吊销列表分发点
  • 创建 CRL
  • 答案3

    您可能需要尝试按照以下步骤禁用 CRL 检查:

    https://social.technet.microsoft.com/wiki/contents/articles/964.certificate-revocation-list-crl-verification-an-application-choice.aspx

    certutil –setreg ca\CRLFlags +CRLF_REVCHECK_IGNORE_OFFLINE
    

    相关内容