用途:

证书验证工具。

用法:

openssl verify [-CApath directory] [-CAfile file] [-purpose purpose] [-policy arg] [-verify_depth depth] 
[-ignore_critical] [-issuer_checks] [-crl_check] [-crl_check_all] [-policy_check] [-explicit_policy] [-inhibit_any] 
[-inhibit_map] [-x509_strict] [-extended_crl] [-use_deltas] [-policy_print] [-check_ss_sig]
[-untrusted file] [-trusted file] [-CRLfile] [-help] [-verbose] [-engine e] [-] [certificates]

选项说明:

-CApath directory:设置信任CA文件所在路径,此路径中的ca文件名采用特殊的形式:xxx.0,其中xxx为CA证书持有者的哈希值,它通过x509 -hash命令获得。

-CAfile filename:某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。

-purpose purpose:证书的用途,如果不设置此选项,则不会验证证书链。purpose的值可以是:sslclient、sslserver、nssslserver、smimesign和smimeencrypt。

-policy arg:指定CA策略,arg为配置文件中的策略段。

-verify_depth depth:设置证书的验证深度。记得CA也是分层次的吧?如果对方的证书的签名CA不是Root CA,那么你可以再去验证给该CA的证书签名的CA,一直到Root CA. 目前的验证操作即使这条CA链上的某一个证书验证有问题也不会影响对更深层的CA的身份的验证。所以整个CA链上的问题都可以检查出来。当然CA的验证出问题并不会直接造成连接马上断开,好的应用程序可以让你根据验证结果决定下一步怎么走。

-ignore_critical:如果设置此选项,则忽略掉临界扩展项。

-issuer_checks:打印出目前证书中相关的颁发者的信息值。

-crl_check:检查实体证书是否在CA的废除列表中。如果没有找到CA的废除列表,则会出现错误。

-crl_check_all:检查实体证书中的证书链是否在CA的废除列表中。

-policy_check:检查证书的策略。

-explicit_policy:设置证书策略为require-explicit-policy。

-inhibit_any:设置证书策略为inhibit-any-policy。

-inhibit_map:设置证书策略为inhibit-policy-mapping。

-x509_strict:严格的服从X.509标准,使坏的证书失去工作区。

-extended_crl:使扩展的CRL结构能够运行。例如迂回的CRLs和用密钥签名的交替CRLs。

-use_deltas:使支持三角CRLs。

-policy_print:打印出与诊断相关的策略处理。

-check_ss_sig:用自签名的根证书来验证签名值。默认是不启用的,因为没有添加任何安全保障。

-untrusted file:不信任的证书列表。File中必须包含多个PEM格式的证书信息值。

-trusted file:信任的证书列表。

-CRLfile:CRL列表。

-help:打印出使用消息。

-verbose:打印出操作的额外信息。

-engine e:硬件引擎。

-:表明最后的选项。所有的参数都是以-开头的。对第一个证书名字来说这个参数非常有用。

certificates:需要验证的证书,有可能是一个,也有可能是多个。证书必须是PEM格式。

验证结果如下:

X509_V_OK(0):操作成功。

X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT(2):不能够获取颁发者的信息值。颁发者的信息不能够从证书中找到。这个选项默认的是可信任的证书时不完整的。

X509_V_ERR_UNABLE_TO_GET_CRL(3):不能够获取到证书CRL。即证书的CRL列表不能够找到。

X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE(4):不能够解密证书的签名值。这就意味着实际的签名值不能够匹配所期望的值。这个仅仅用到RSA密钥中。

X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE(5):不能够解密CRL的签名值。这就意味着实际的签名值不能够匹配所期望的值。从来没有使用过。

X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY(6):不能够编码颁发者的公钥值。不能够读取证书中的公钥值SubjectPublicKeyInfo。

X509_V_ERR_CERT_SIGNATURE_FAILURE(7):证书签名值是无效的(证书签名)。

X509_V_ERR_CRL_SIGNATURE_FAILURE(8):证书签名值是无效的(CRL 签名)。

X509_V_ERR_CERT_NOT_YET_VALID(9):证书是无效的。证书开始起效时间在当前时间之后。

X509_V_ERR_CERT_HAS_EXPIRED(10):证书已经过期,证书有效时间在当前时间之后。

X509_V_ERR_CRL_NOT_YET_VALID(11):CRL列表还没有起效。

X509_V_ERR_CRL_HAS_EXPIRED(12):CRL列表已经过期。

X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD(13):证书的notBefore域的格式出错。证书的notBefore域包含有效时间。

X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD(14):证书的notAfter域的格式出错。证书的notAfter域包含有效时间。

X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD(15):CRL的lastUpdate域的格式出错。CRL的lastUpdate域包含有效时间。

X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD(16):CRL的nextUpdate域的格式出错。CRL的nextUpdate域包含有效时间。

X509_V_ERR_OUT_OF_MEM(17):内存溢出。试图分配内存的时候出现错误。这个错误必须不能发生。

X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT(18):自签名的证书。传送过来的证书时自签名的证书,并在可信任列表中不能够找到该证书。

X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN(19):自签名证书在证书链中。证书链可能在不受信任的证书列表中。根证书在本地不能够找到。

X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY(20):不能够获取本地的颁发者的证书。颁发者的证书在不信任的证书列表中找不到。

X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE(21):不能够验证第一个证书。没有签名值可供验证,因为证书链中仅仅包含一个证书并不是自签名的证书。

X509_V_ERR_CERT_CHAIN_TOO_LONG(22):证书链太长。证书链的长度比所支持的深度长。从没有使用过。

X509_V_ERR_CERT_REVOKED(23):证书已经处于废除列表中。

X509_V_ERR_INVALID_CA(24):无效的CA证书。

X509_V_ERR_PATH_LENGTH_EXCEEDED(25):路径长度超过约束。basicConstraints路径参数已经溢出。

X509_V_ERR_INVALID_PURPOSE(26):不支持的证书用途。

X509_V_ERR_CERT_UNTRUSTED(27):证书不是受信任的。对某些特殊的证书用途来说,根CA被标记不受信任的。

X509_V_ERR_CERT_REJECTED(28):证书被拒绝的。对某些特殊的证书用途来说,根CA被标记为拒绝的。

X509_V_ERR_SUBJECT_ISSUER_MISMATCH(29):证书申请者与证书颁发者(候补的)不匹配。目前的颁发者的证书是无效的,因为申请者的信息不匹配颁发者的信息。当-issuer_checks选项启用后才有效。

X509_V_ERR_AKID_SKID_MISMATCH(30):权威机构和颁发者的密钥标识不匹配。目前的颁发者的证书是无效的,是因为当前证书的申请者的密钥标识与权威机构的密钥标识不匹配。当-issuer_checks选项启用后才有效。

X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH(31):权威机构和颁发者的序列号不匹配。目前的颁发者的证书是无效的,是因为当前证书的申请者的序列号与权威机构的密钥标识不匹配。当-issuer_checks选项启用后才有效。

X509_V_ERR_KEYUSAGE_NO_CERTSIGN(32):密钥使用不包含证书签名。

X509_V_ERR_APPLICATION_VERIFICATION(50):应用程序确认失败。应用程序出现了错误。从未使用过。