在线证书状态协议(OCSP)让应用能判断一个证书的(吊销)状态(RFC 2560)。
ocsp
命令执行很多常用的 OCSP 任务。它可以用于打印请求和回复,创建请求并发送请求至 RCSP 响应端,以及将自己作为一个迷你 OCSP 服务器。
该命令可以作为客户端或者服务器。下方描述的选项,按照这两个模式区分开。
- -help
-
打印用法信息。
- -out filename
-
指定输出的文件名,默认为标准输出。
- -issuer filename
-
指定当前签发者证书。该选项可以被多次指定。在 filename 中指定的证书必须为 PEM 格式。该选项 必须 处在任何
-cert
选项之前。 - -cert filename
-
在请求中添加证书 filename。签发证书从前序的
issuer
选项中取得,若不指定签发者证书,则生成一个错误。 - -serial num
-
同
cert
选项,但指定的是证书对应的序列号(num)。除非前缀了0x
否则将作为十进制数解析。负整数可以通过在值前追加负号-
来表示。 - -signer filename, -signkey filename
-
为 OCSP 请求签名,签名所使用的证书在
singer
选项中指定,签名所使用的私钥在signkey
选项中指定。若不指定signkey
,那么私钥从证书文件中读取。若两个选项均不指定,则 OCSP 请求不会被签名。 - -sign_other filename
-
已签名请求中包含的额外证书。
- -nonce, -no_nonce
-
为请求追加一个 OCSP nonce 扩展,或禁用 OCSP nonce 附加。通常情况下,若一个 OCSP 请求通过
reqin
选项输入,则不会添加 nonce:使用nonce
选项会强制添加一个 nonce。若一个 OCSP 请求(通过cert
和serial
选项)被创建,会自动添加一个 nonce,指定no_nonce
来覆盖它。 - -req_text, -tesp_text, -text
-
依次用于输出文本形式的 OCSP 请求、响应或两者。
- -reqout file, -respout file
-
将 DER 编码的证书请求或回应写至 file。
- -reqin file, -respin file
-
从 file 读取 OCSP 请求或响应。若 OCSP 请求或响应是由其它选项(比如
serial
、cert
、host
选项)生成的,那么忽略本选项。 - -url responder_url
-
指定响应端 URI。可以指定 HTTP 或者 HTTPS(SSL/TLS)URL。
- -host hostname:port, -path pathname
-
若出现了
host
选项,那么 OCSP 请求会发送至 hostname 主机的 port 端口上。path
指定了要使用的 HTTP 路径,或者使用默认值/
。它等价于指定-url
并将值设置为 http:// 、主机名、端口名和路径名。 - -header name=value
-
为发送给响应端的 OCSP 请求追加头部变量名 name 和对应的值 value。该选项可以重复指定。
- -timeout seconds
-
以秒计算的 OCSP 响应端连接超时。在 POSIX 系统上,作为 OCSP 响应端运行时,该选项同样会限制响应端等待客户端请求的时间。该时间从响应端接受请求连接开始计时,直到接受到完整的请求时结束计时。
- -multi process-count
-
运行指定个数的 OCSP 响应端子进程,父进程会根据需求产生子进程。子进程会检测 CA 索引文件的变动,并自动重载它。当作为响应端运行时,建议使用
-timeout
选项来限制每个子进程等待客户端的 OCSP 请求的时间。该选项在 POSIX 系统(也即是支持 fork() 和其他需要的 unix 系统调用的系统)上可用。 - -CAfile file, -CApath pathname
-
包含可信 CA 证书的文件或路径名。它们被用于检验 OCSP 响应的签名。
- -no-CAfile
-
不要从默认的文件位置加载可信 CA 证书。
- -no-CApath
-
不要从默认的目录位置加载可信 CA 证书。
- -attime, -check_ss_sig, -crl_check, -crl_check_all, -explicit_policy, -extended_crl, -ignore_critical, -inhibit_any, -inhibit_map, -no_alt_chains, -no_check_time, -partial_chain, -policy, -policy_check, -policy_print, -purpose, -suiteB_128, -suiteB_128_only, -suiteB_192, -trusted_first, -use_deltas, -auth_level, -verify_depth, -verify_email, -verify_hostname, -verify_ip, -verify_name, -x509_strict
-
设置不同的证书验证选项。参见 verify(1) 手册页了解详情。
- -verify_other file
-
当尝试定位 OCSP 响应签名证书时,要追加的包含额外证书的文件。有些响应端会从响应中隐去实际的签名者证书:该选项可以被用于在这类情况下提供需要的证书。
- -trust_other
-
通过
-verify_other
选项指定的证书应该为显式可信的,且不会对它们执行额外的检查。当完整的响应端证书链不可用,或者可信根 CA 不正确时,该选项十分有用。 - -VAfile file
-
包含显式可信响应端证书的文件。等价于
-verify_other
和-trust_other
两个选项。 - -noverify
-
不要尝试验证 OCSP 响应签名,或者 onnce 值。该选项通常仅用作排错,因为它会禁用对于响应端证书的任何验证。
- -no_intern
-
当搜索签名者证书时,忽略 OCSP 响应中包含的证书证书。使用该选项时,签名者证书必须通过
-verify_other
或者-VAfile
选项指定。 - -no_signature_verify
-
不要检查 OCSP 响应中的签名。由于该选项会允许 OCSP 响应上的无效签名,所以它通常仅用于测试目的。
- -no_cert_verify
-
完全不验证 OCSP 响应的签名者证书。由于该选项运行 OCSP 响应被任何证书签名,所以它应该仅用于测试目的。
- -no_chain
-
不要将响应中的证书用于附加的非可信 CA 证书。
- -no_explicit
-
不要显式信任根 CA,即便它被设置为 OCSP 签名可信。
- -no_cert_checks
-
不要对 OCPS 响应签名者证书执行任何额外的检查。也就是不要执行任何检查来了解签名者证书被授权提供必要的状态信息:于是该选项应该仅用于测试目的。
- -validity_period nsec, -status_age age
-
这些选项指定了以秒计算的时间范围,它们将作为 OCSP 响应可以接受的时间范围。每个证书状态响应包含一个
notBefore
时间和一个可选的notAfter
时间。当前时间应该介于这两者之间,但这两个时间的间隔可能仅有几秒。实际上来说,由于 OCSP 响应端和客户端的钟可能并不精确同步,导致验证可能失败。要避免它,可以使用-validity_period
选项来指定一个以秒计的,可接受的错误范围,默认值为 5 分钟。
若noAfter
时间从响应中略去,那么它意为着新状态立即有效。在这种情况下,会检查notBefore
字段的年龄,来了解它不会老于 age 秒。默认情况,该附加检查不会被执行。 - -digest
-
该选项设置用于检验 OCSP 请求中的证书标识的摘要算法。任何被 OpenSSL dgst 命令支持的摘要算法均可被使用。默认值为 SHA-1。该选项可以被多次使用,来指定要用于其后的证书标识要使用的摘要算法。
- -index indexfile
-
indexfile 参数是一个文本索引文件的名称,该文件为 ca 格式,其中包含了证书吊销信息。
若指定了index
选项,那么 ocsp 工具就处于响应端模式,否则就处在客户端模式。响应端要处理的请求可以通过命令行(issuer
和serial
选项)、一个文件(使用reqin
选项)、或过外部的 OCSP 客户端(若指定了port
或url
)来指定。
若出现了index
选项,那么CA
和rsigner
选项也必须一同出现。 - -CA file
-
与 indexfile 中的吊销信息对应的 CA 证书。
- -rsigner file
-
用于签名 OCSP 响应的证书。
- -rother file
-
在 OCSP 响应中要追加的额外证书。
- -resp_no_certs
-
不要在 OCSP 响应中包含任何证书。
- -resp_key_id
-
用 key ID 表示签名者证书,默认使用主体名。
- -rkey file
-
用于签名 OCPS 响应的私钥:若不指定则使用
rsigner
中指定的文件。 - -rsigopt nm:v
-
当签名 OCPS 响应时,要传递给签名算法的选项。这些选项名称和值均为算法特定的。
- -port portnum
-
监听 OCSP 请求的端口。端口同样可以用
url
选项指定。 - -ignore_err
-
忽略格式错误的请求和响应:当作为 OCSP 客户端时,接收到格式错误的响应时执行重试。当作为 OCSP 响应端时,接收到错误格式的请求时,继续运行,而非终止自身。
- -nrequest number
-
OCSP 服务器将在接收到 number 数量的请求后退出,默认为无穷多个。
- -nmin minutes, -ndays days
-
几分钟或者几天后会刷新吊销信息:用于 nextUpdate 字段。若均不指定两者,则忽略 nextUpdate 字段,这意味着更新吊销信息是立即可用的。
OCSP 响应依照 RFC2560 中定义的规则。
一开始,会定位 OCSP 响应端证书,并用响应端证书的公钥来检查 OCSP 请求的签名。
接着,对 OCSP 响应端证书执行一次常规证书检验,并在过程中建立起一条证书链。用于建立链条的可信证书的位置可以用 CAfile
和 CApath
选项指定,或者它们将在标准 OpenSSL 证书目录中查找。
若初始检验失败,那么 OCSP 验证过程将以一个错误而停止。
否则,请求中的签发 CA 证书将与 OCSP 响应端证书进行对比:对比成功则 OCSP 验证成功。
否则,OCSP 响应端证书的 CA 与请求中的签发 CA 证书进行比对。若校验成功,且 OCSP 响应端证书中出现了 OCSPSigning 扩展密钥用法,则 OCSP 验证成功。
否则,若没有设置 -no_explicit
,那么 OCSP 响应端 CA 的根 CA 会被检查其是否对 OCSP 签名可信。若可信则 OCSP 验证成功。
若上述检验均不成功,则 OCSP 验证失败。
它意味着,若 OCSP 响应端证书由 CA 直接授权,且它给出的吊销信息是与该 CA 相关的(且被正确配置了),那么验证就会成功。
若 OCSP 响应端为“全局响应端”,也就是可以提供多个 CA 的详细信息,且它具有其独立的证书链,那么它的根 CA 可以作为 OCSP 签名可信。举例来说:
openssl x509 -in ocspCA.pem -addtrust OCSPSigning -out trustedCA.pem
或者响应端证书自身可以通过 -VAfile 被显式地可信。
如上面注明的,大部分验证选项是用于测试和查错目的的。通常情况下,仅有 -CApath
-CAfile
以及(若响应端为 “全局 VA”时)-VAfile
需要被使用。
OCSP 服务器仅在测试和演示目的时有用:它不能作为正真有用的全功能 OCSP 响应端。它仅包含一个十分简单的 HTTP 请求处理,且仅能处理 POST 样式的 OCSP 请求。同时它以序列的方式处理请求,意味着它在处理完当前的请求前,不能响应新的请求。对于大量的吊销数据来说,以文本索引文件格式表示的吊销记录也是并不高效的。
也可以通过调用了 reqin
和 respout
选项的 CGI 脚本将 ocsp 应用运行在响应端模式。
创建一个 OCSP 请求,并写入一个文件:
openssl ocsp -issuer issuer.pem -cert c1.pem -cert c2.pem -reqout req.der
对位于 URL http://ocsp.myhost.com/ 上的 OCSP 响应端发送请求,保存响应至文件,以文本格式打印,并验证响应:
openssl ocsp -issuer issuer.pem -cert c1.pem -cert c2.pem -url http://ocsp.myhost.com/ -resp_text -respout resp.der
读入一个 OCSP 响应,并以文本格式打印:
openssl oscp -respin resp.der -text -noverify
在 8888 端口上建立的 OCSP 服务器,其使用了一个标准的 ca 配置,以及一个独立的响应端证书。全部的请求和响应均打印至一个文件。
openssl ocsp -index demoCA/index.txt -port 8888 -rsigner rcert.pem -CA demoCA/cacert.pem -text -out log.txt
同上,但在处理了一个请求后就退出:
openssl ocsp -index demoCA/index.txt -port 8888 -rsigner rcert.pem -CA demoCA/cacert.pem -nrequest 1
用一个内部生成的请求,查询状态信息:
openssl ocsp -index demoCA/index.txt -rsigner rcert.pem -CA demoCA/cacert.pem -issuer demoCA/cacert.pem -serial 1
用一个读取自文件的请求查询状态信息,并将响应写入另一个文件。
openssl ocsp -index demoCA/index.txt -rsigner rcert.pem -CA demoCA/cacert.pem -reqin req.der -respout resp.der