7.6. 使用在线证书状态协议(OCSP)恢复器
7.6.1. 设置 OCSP Responder
如果在配置了在线证书状态管理器时选择了安全域中的 CA,则不需要额外的步骤来配置 OCSP 服务。CA 的 CRL 发布会自动设置,其签名证书会在在线证书状态管理器的证书数据库中自动添加并信任。但是,如果选择了非安全域 CA,则必须在配置在线证书状态管理器后手动配置 OCSP 服务。
注意
在配置 OCSP Manager 所属的安全域中的每个 CA,而不是它的每个 CA 都会被 OCSP Manager 自动信任。CA 面板中配置的 CA 证书链中的每个 CA 都由 OCSP Manager 自动信任。安全域中的其他 CA,但不能手动信任证书链。
为安全域以外的证书管理器设置在线证书状态管理器:
- 为每个将发布到 OCSP 响应器的 CA 配置 CRL。
- 启用发布、设置发布程序,并在 OCSP 服务处理的每个 CA 中设置发布规则(第 9 章 发布证书和 CRL)。如果证书管理器发布到 LDAP 目录,并且将在线证书状态管理器设置为从该目录读取,则不需要此项。
- 证书配置文件必须配置为包含授权信息访问扩展,指向证书管理器侦听 OCSP 服务请求的位置(第 7.6.4 节 “启用证书管理器的内部 OCSP 服务”)。
- 配置 OCSP Responder。
- 确定每个发布的证书管理器到 OCSP 响应器(第 7.6.2 节 “识别 CA 到 OCSP Responder”)。
- 如有必要,为签署 OCSP 签名证书(第 17.7 节 “更改 CA 证书的信任设置”)的 CA 配置信任设置。
- 配置这两个子系统后重新启动这两个子系统。
- 验证 CA 是否已正确连接到 OCSP 响应程序(第 7.6.2.1 节 “验证证书管理器和在线证书状态管理器连接”)。
7.6.2. 识别 CA 到 OCSP Responder
在将 CA 配置为向在线证书状态管理器发布 CRL 之前,必须在在线证书状态管理器的内部数据库中将 CA 识别为在线证书状态管理器。证书管理器使用与此证书关联的密钥对签名 CRL;在线证书状态管理器针对存储的证书验证签名。
注意
如果在配置了在线证书状态管理器时选择了安全域中的 CA,则不需要额外步骤来配置在线证书状态管理器来识别 CA;CA 签名证书会在在线证书状态管理器的证书数据库中自动添加和信任。但是,如果选择了非安全域 CA,则必须在配置了在线证书状态管理器后手动将 CA 签名证书添加到证书数据库中。
不需要为 CA 导入证书链,后者将其 CRL 发布到在线证书状态管理器。OCSP 服务需要证书链的唯一时间是在发布 CRL 时通过 SSL/TLS 身份验证连接到在线证书状态管理器。否则,在线证书状态管理器不需要完整的证书链。
但是,在线证书状态管理器必须具有为其证书数据库中的 CA 签名证书或单独的 CRL 签名证书的证书。OCSP 服务通过将 CRL 签名的证书与数据库中的证书进行比较来验证 CRL,而不是针对证书链。如果 root CA 及其子 CA 都向在线证书状态管理器发布 CRL,则在线证书状态管理器需要两个 CA 的 CA 签名证书。
要导入用于为 CA 发布的证书签名的 CA 或 CRL 签名证书,请执行以下操作:
- 从 CA 的端到端页面获取证书管理器的 base-64 CA 签名证书。
- 打开 Online Certificate Status Manager agent 页面。URL 格式为 https://hostname:SSLport/ocsp/agent/ocsp。
- 在左侧帧中,单击。
- 在表单中,将编码的 CA 签名证书粘贴到标记为 Base 64 编码证书(包括标头和页脚) 的文本区域中。
- 要验证证书是否已成功添加,请在左侧范围内单击 List Certificate Authority。
生成的表单应该显示有关新 CA 的信息。此 Update、Next Update 和 Requests Served Since Startup 字段应该会显示 0 值(0)。
7.6.2.1. 验证证书管理器和在线证书状态管理器连接
当证书管理器重启时,它会尝试连接到在线证书状态管理器的 SSL/TLS 端口。要验证证书管理器是否已与在线证书状态管理器通信,请检查 此 更新和 下一步更新 字段,该字段应该使用与在线证书状态管理器的最后一个通信的适当时间戳进行更新。Requests Served Since Startup 字段应该仍然显示零(0),因为没有客户端试图查询 OCSP 服务以获取证书撤销状态。
7.6.2.2. 配置撤销信息存储:内部数据库
在线证书状态管理器将每个证书管理器的 CRL 存储在其内部数据库中,并将它用作 CRL 存储以验证证书的撤销状态。要更改在线证书状态管理器用来在其内部数据库中存储 CRL 的配置:
- 打开 Online Certificate Status Manager 控制台。
pkiconsole https://server.example.com:8443/ocsp
- 在 Configuration 选项卡中,选择 Online Certificate Status Manager,然后选择 Revocation Info Stores。右侧窗格中显示在线证书状态管理器可以使用的两个存储库;默认情况下,它会在其内部数据库中使用 CRL。
- 选择 defStore,然后单击 。
- 编辑 defStore 值。
- notFoundAsGood.如果问题中的证书无法在任何 CRL 中找到,则将 OCSP 服务设置为返回 GOOD 的 OCSP 响应。如果没有选择此项,则响应为 UNKNOWN (当客户端遇到时)会导致错误消息。
- byName.OCSP Responder 只支持基本的响应类型,其中包括发出响应的 OCSP Responder 的 ID。基本响应类型中的 ResponderID 字段由
ocsp.store.defStore.byName
参数的值决定。如果byName
参数为 true 或缺失,则 OCSP 授权签名的证书主题名称将用作 OCSP 响应的 ResponderID 字段。如果byName
参数为 false,则 OCSP 授权签名证书密钥哈希将是 OCSP 响应的 ResponderID 字段。 - includeNextUpdate.包括下一个 CRL 更新时间的时间戳。
注意
pkiconsole
已被弃用。
7.6.2.3. 配置撤销信息存储:LDAP 目录
虽然 OCSP 管理器默认将 CA CRL 存储在其内部数据库中,但可以将其配置为改为使用发布到 LDAP 目录的 CRL。
重要
如果启用了
ldapStore
方法,则 OCSP 用户界面不会检查证书状态。
将在线证书状态管理器配置为使用 LDAP 目录:
- 打开 Online Certificate Status Manager 控制台。
pkiconsole https://server.example.com:8443/ocsp
- 在 Configuration 选项卡中,选择 Online Certificate Status Manager,然后选择 Revocation Info Stores。右侧窗格中显示在线证书状态管理器可以使用的两个存储库;默认情况下,它会在其内部数据库中使用 CRL。
- 要在 LDAP 目录中使用 CRL,请点击 ldapStore 选项。来启用
- 选择 ldapStore,然后单击 。
- 设置 ldapStore 参数。
- numConns.OCSP 服务应检查的 LDAP 目录的总数。默认情况下,它被设置为 0。设置此值会显示对应的主机、端口、baseDN 和 refreshInSec 字段的数量。
- host.LDAP 目录的完全限定 DNS 主机名。
- 端口。LDAP 目录的非 SSL/TLS 端口。
- baseDN.开始搜索 CRL 的 DN。例如,O=example.com。
- refreshInSec。连接刷新的频率。默认值为 86400 秒(每天)。
- caCertAttr.保留默认值 cACertificate;binary,因为它是。它是证书管理器向其 CA 签名证书发布的属性。
- crlAttr.保留默认值 certificateRevocationList;binary,因为它是。它是证书管理器向其发布 CRL 的属性。
- notFoundAsGood.如果问题中的证书无法在任何 CRL 中找到,则将 OCSP 服务设置为返回 GOOD 的 OCSP 响应。如果没有选择此项,则响应为 UNKNOWN (当客户端遇到时)会导致错误消息。
- byName.OCSP Responder 只支持基本的响应类型,其中包括发出响应的 OCSP Responder 的 ID。基本响应类型中的 ResponderID 字段由
ocsp.store.defStore.byName
参数的值决定。如果byName
参数为 true 或缺失,则 OCSP 授权签名的证书主题名称将用作 OCSP 响应的 ResponderID 字段。如果byName
参数为 false,则 OCSP 授权签名证书密钥哈希将是 OCSP 响应的 ResponderID 字段。 - includeNextUpdate.在线证书状态管理器可以包含下一次 CRL 更新时间的时间戳。
注意
pkiconsole
已被弃用。
7.6.2.4. 测试 OCSP 服务设置
通过执行以下操作来测试证书管理器是否可以正确服务 OCSP 请求:
- 在浏览器或客户端中打开撤销检查。
- 从为 OCSP 服务启用的 CA 请求证书。
- 批准请求。
- 将证书下载到浏览器或客户端。
- 确保 CA 由浏览器或客户端信任。
- 检查证书管理器内部 OCSP 服务的状态。打开 CA 代理服务页面,然后选择 OCSP Services 链接。
- 测试独立的在线证书状态管理器子系统。打开 Online Certificate Status Manager 代理服务页面,然后单击 List Certificate Authority 链接。该页面应当显示有关配置为向在线证书状态管理器发布 CRL 的证书管理器的信息。该页面还总结了在线证书状态管理器自上次开始以来的活动。
- 吊销证书。
- 在浏览器或客户端中验证证书。服务器应返回证书已被撤销。
- 再次检查证书管理器的 OCSP-service 状态,以验证是否发生以下问题:
- 浏览器向证书管理器发送 OCSP 查询。
- 证书管理器向浏览器发送 OCSP 响应。
- 使用该响应来验证证书并返回其状态的浏览器无法验证证书。
- 再次检查独立的 OCSP 服务子系统以验证是否发生以下问题:
- 证书管理器将 CRL 发布到在线证书状态管理器。
- 浏览器向在线证书状态管理器发送 OCSP 响应。
- 在线证书状态管理器向浏览器发送 OCSP 响应。
- 使用该响应来验证证书并返回其状态的浏览器无法验证证书。
7.6.3. 为 Bad Serial Numbers 设置响应
OCSP 响应器在确定证书是否有效前检查证书的撤销状态和过期日期,默认情况下,IADP 不会验证证书的其他信息。
notFoundAsGood
参数设置 OCSP 如何使用无效序列号处理证书。此参数默认为启用,这意味着如果证书存在错误序列号但证书有效,则 OCSP 会返回证书的状态。
要获得基于错误的序列号以及撤销状态的 OCSP 检查和拒绝证书,请更改
notFoundAsGood
设置。在这种情况下,OCSP 返回 UNKNOWN 状态,并带有带有错误的序列号的证书。客户端将解释为错误,并相应地响应。
- 打开 Online Certificate Status Manager 控制台。
pkiconsole https://server.example.com:8443/ocsp
- 在 Configuration 选项卡中,选择 Online Certificate Status Manager,然后选择 Revocation Info Stores。
- 选择 defStore,然后单击 。
- 编辑
notFoundAsGood
值。选择复选框意味着 OCSP 会返回 GOOD 值,即使证书的序列号不正确。取消选择复选框意味着 OCSP 发送一个 UNKNOWN 值,客户端可能会认为是错误。 - 重启 OCSP Manager。
]# pki-server restart instance-name
注意
pkiconsole
已被弃用。
7.6.4. 启用证书管理器的内部 OCSP 服务
证书管理器具有内置的 OCSP 服务,可供 OCSP 兼容客户端用来直接查询证书管理器有关证书的撤销状态。安装证书管理器后,会发布 OCSP 签名证书,并默认启用 OCSP 服务。这个 OCSP 签名证书用于签署对 OCSP 服务请求的所有响应。由于内部 OCSP 服务检查证书管理器内部数据库中存储的证书状态,因此发布不必配置为使用此服务。
客户端可以通过证书管理器的非 SSL/TLS 最终用户端口查询 OCSP 服务。当查询证书的撤销状态时,证书管理器会搜索其内部数据库的证书,检查其状态并响应客户端。由于证书管理器具有它发布的所有证书的实时状态,因此这种撤销检查的方法是最准确的。
每个 CA 的内置 OCSP 服务都会在安装时打开。但是,要使用此服务,CA 需要使用授权信息访问扩展发布证书。
- 进入 CA 的端到端页面。例如:
http
s
://server.example.com:8443/ca/ee/ca
- 查找 CA 签名证书。
- 在证书中查找授权信息访问扩展,并记录 Location URIName 值,如 http
s
://server.example.com:8443
/ca/ocsp。 - 更新注册配置文件,以启用授权信息访问扩展,并将 Location 参数设置为证书管理器的 URI。有关编辑证书配置文件的详情,请参考 第 3.2 节 “设置证书配置文件”。
- 重启 CA 实例。
]# pki-server restart instance-name
注意
要禁用证书管理器的内部 OCSP 服务,请编辑 CA 的
CS.cfg
文件,并将 ca.ocsp 参数的值改为 false。
ca.ocsp=false
7.6.5. 使用 OCSPClient 程序提交 OCSP 请求
OCSPClient 程序可用于执行 OCSP 请求。例如:
]# OCSPClient -h server.example.com -p 8080 -d /etc/pki/pki-tomcat/alias -c "caSigningCert cert-pki-ca" --serial 2 CertID.serialNumber=2 CertStatus=Good
OCSPClient 命令可与以下命令行选项一起使用:
选项 | 描述 |
---|---|
-d 数据库 | 安全数据库位置(默认:当前目录) |
-h hostname | OCSP 服务器主机名(默认为 example.com) |
-p port | OCSP 服务器端口号(默认: 8080) |
-t path | OCSP 服务路径(默认:/ocsp/ee/ocsp) |
-c nickname | CA 证书 nickname (defaut: CA Signing Certificate) |
-n times | 提交数(默认:1) |
--serial serial_number | 要检查的证书的序列号 |
--input input_file | 包含 DER 编码的 OCSP 请求的输入文件 |
--output output_file | 输出文件存储 DER 编码的 OCSP 响应的文件 |
-v,--verbose | 以详细模式运行 |
--help | 显示帮助信息 |
7.6.6. 使用 GET 方法提交 OCSP 请求
可以使用 GET 方法向在线证书状态管理器提交小于 255 字节的 OCSP 请求,如 RFC 6960 所述。通过 GET 提交 OCSP 请求:
- 为证书生成一个 OCSP 请求,该请求正在查询。例如:
]# openssl ocsp -CAfile ca.pem -issuer issuer.pem -serial serial_number -reqout - | base64 MEIwQDA+MDwwOjAJBgUrDgMCGgUABBT4cyABkyiCIhU4JpmIBewdDnn8ZgQUbyBZ44kgy35o7xW5BMzM8FTvyTwCAQE=
- 将 URL 粘贴到 Web 浏览器的地址栏中,以返回状态信息。浏览器必须能够处理 OCSP 请求。
https://server.example.com:8443/ocsp/ee/ocsp/MEIwQDA+MDwwOjAJBgUrDgMCGgUABBT4cyABkyiCIhU4JpmIBewdDnn8ZgQUbyBZ44kgy35o7xW5BMzM8FTvyTwCAQE=
- OCSP Manager 使用浏览器可以解释的证书状态进行响应。可能的状态有 GOOD、REVOKED 和 UNKNOWN。
或者,使用 curl 等工具从命令行运行 OCSP,以发送请求和 openssl 来解析响应。例如:
- 为证书生成一个 OCSP 请求,该请求正在查询。例如:
]# openssl ocsp -CAfile ca.pem -issuer issuer.pem -serial serial_number -reqout - | base64 MEIwQDA+MDwwOjAJBgUrDgMCGgUABBT4cyABkyiCIhU4JpmIBewdDnn8ZgQUbyBZ44kgy35o7xW5BMzM8FTvyTwCAQE=
- 使用 curl 连接到 OCSP Manager 来发送 OCSP 请求。
curl https://server.example.com:8443/ocsp/ee/ocsp/MEIwQDA+MDwwOjAJBgUrDgMCGgUABBT4cyABkyiCIhU4JpmIBewdDnn8ZgQUbyBZ44kgy35o7xW5BMzM8FTvyTwCAQE= > ocspresp.der
- 使用 openssl 解析响应:
openssl ocsp -respin ocspresp.der -resp_text
对于由带有授权信息访问扩展的 7.1 CA 发布的证书使用 GET 方法发送到 OCSP,需要创建一个重定向来将请求转发到适当的 URL,如 第 7.6.7 节 “为证书系统 7.1 和 Earlier 中发布的证书设置重定向” 所述。
7.6.7. 为证书系统 7.1 和 Earlier 中发布的证书设置重定向
OCSP 用户页面的位置在 URL 中指定,文件为
/ocsp/ee/ocsp/
,在证书系统 10 或证书系统 8.1 中与证书系统 7.1 中的位置不同,这只是 /ocsp/
。为了使 7.1 或更早的 CA 发布的证书以及授权信息访问扩展发送到 OCSP,请创建一个重定向以将请求转发到适当的 URL。
注意
只需要设置重定向,才能管理由带有授权信息访问扩展的 7.1 或更早的 CA 发布的证书。如果证书由更新的版本证书管理器或不包含授权信息访问扩展发布,则不需要此配置。
- 停止 OCSP Responder。
]# pki-server stop instance-name
- 进入 OCSP 的最终用户 Web 应用程序目录。例如:
]# cd /var/lib/pki-ocsp/webapps/ocsp
- 更改为 OCSP Web 应用目录的
ROOT
文件夹中的ROOT/WEB-INF/
目录。例如:]# cd /var/lib/pki-ocsp/webapps/ocsp/ROOT/WEB-INF/
- 在 OCSP Web 应用目录的
ROOT
文件夹中创建并打开lib/
目录。]# mkdir lib ]# cd lib/
- 创建链接到
/usr/share/java/pki/cms.jar
JAR 文件的符号链接。例如:]# ln -s /usr/share/java/pki/cms.jar cms.jar
- 移到主 Web 应用目录。例如:
]# cd /var/lib/pki-ocsp/webapps/ocsp/
- 重命名当前实例(
ocsp
)目录。例如:]# mv /var/lib/pki-ocsp/webapps/ocsp/ocsp /var/lib/pki-ocsp/webapps/ocsp/ocsp2
- 更改到原始
ocsp/
目录中的WEB-INF/
目录。例如:]# cd /var/lib/pki-ocsp/webapps/ocsp/ocsp/WEB-INF
- 在原始
ocsp/WEB-INF/
目录中,编辑web.xml
文件并添加eeocspAddCRL
和csadmin-wizard
servlets 之间的行映射。<servlet-mapping> <servlet-name> ocspOCSP </servlet-name> <url-pattern> /ee/ocsp/* </url-pattern> </servlet-mapping>
- 在
ROOT
目录中创建并安装web.xml
文件。例如:<?xml version="1.0" encoding="ISO-8859-1"?> <web-app> <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> <servlet> <servlet-name>ocspProxy</servlet-name> <servlet-class>com.netscape.cms.servlet.base.ProxyServlet</servlet-class> <init-param> <param-name>destContext</param-name> <param-value>/ocsp2</param-value> </init-param> <init-param> <param-name>destServlet</param-name> <param-value>/ee/ocsp</param-value> </init-param> </servlet> <servlet> <servlet-name>ocspOther</servlet-name> <servlet-class>com.netscape.cms.servlet.base.ProxyServlet</servlet-class> <init-param> <param-name>destContext</param-name> <param-value>/ocsp2</param-value> </init-param> <init-param> <param-name>srcContext</param-name> <param-value>/ocsp</param-value> </init-param> <init-param> <param-name>destServlet</param-name> <param-value></param-value> </init-param> <init-param> <param-name>matchURIStrings</param-name> <param-value>/ocsp/registry,/ocsp/acl,/ocsp/jobsScheduler,/ocsp/ug,/ocsp/server,/ocsp/log, /ocsp/auths,/ocsp/start,/ocsp/ocsp,/ocsp/services,/ocsp/agent,/ocsp/ee, /ocsp/admin</param-value> </init-param> <init-param> <param-name>destServletOnNoMatch</param-name> <param-value>/ee/ocsp</param-value> </init-param> <init-param> <param-name>appendPathInfoOnNoMatch</param-name> <param-value>/ocsp</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ocspProxy</servlet-name> <url-pattern>/ocsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ocspOther</servlet-name> <url-pattern>/ocsp/*</url-pattern> </servlet-mapping> </web-app>
- 编辑
/var/lib/pki-ocsp/conf/context.xml
文件,更改以下行:<Context> to <Context crossContext="true" >
- 编辑
/var/lib/pki-ocsp/webapps/ocsp/ocsp2/services.template
文件并更改以下行:result.recordSet[i].uri); to result.recordSet[i].uri + "/");
- 启动 OCSP 实例。
]# pki-server start instance-name