我一直在实验室里工作,使用 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)中。
我建议你撤销在这里所做的一切并从头开始。
首先,您需要设计您的解决方案,规划好各个方面。
- 确定将使用证书的应用程序。
- 描述证书要求并规划证书范围。
- 根据[2]确定您将使用的证书模板及其配置。
- 设计 CA 放置图并创建证书流程图(证书注册、客户端应用程序验证)。
- 设计灾难恢复计划,其中包括备份和恢复计划。
否则,你的解决方案将一文不值。即使这是测试部署,你仍然必须通过所有这些步骤。
正确规划 CRT/CRL 发布和下载 URL。您需要仔细检查,因为这些问题无法在不重新部署所有证书的情况下轻松修复。关于此主题的一般建议:
- 不要在 CDP/AIA 中使用 LDAP URL。考虑仅使用 HTTP。
- 使用专用的 Web 服务器来提供 CRT/CRL 文件(不要将 SubCA 与 Web 服务器角色相结合)。
- 不要在根证书中使用 CDP/AIA 扩展
- 确保所有客户端(将使用您的证书)都可以访问 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 证书管理单元中)
- 通过服务器管理器安装 Active Directory 证书服务(注意:该计算机必须加入域)
- 确保安装管理功能,在角色安装向导中为角色服务选择企业 CA,为 CA 类型选择从属 CA。
- 对于私钥设置,选择新私钥,在下拉菜单中选择 MS-RSA,对于哈希算法,选择 sha256,并将密钥长度设置为 4096。这将生成一个 CSR,该 CSR 将被复制到 Linux 根 CA
- 您现在可以将 rootca 证书导入 mmc 证书管理单元
- 将您的 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 服务器上创建的虚拟目录中 - 确保 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 文件的位置。单击“确定”
在用作中间 CA 的 Windows 服务器上
回到 Linux CA
返回 Windows 中级服务器
您的 Windows 中级 CA 现在应该已启动并正在运行。
来源
答案3
您可能需要尝试按照以下步骤禁用 CRL 检查:
certutil –setreg ca\CRLFlags +CRLF_REVCHECK_IGNORE_OFFLINE