123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- =pod
- =head1 NAME
- verify - Utility to verify certificates.
- =head1 SYNOPSIS
- B<openssl> B<verify>
- [B<-CApath directory>]
- [B<-CAfile file>]
- [B<-purpose purpose>]
- [B<-policy arg>]
- [B<-ignore_critical>]
- [B<-crl_check>]
- [B<-crl_check_all>]
- [B<-policy_check>]
- [B<-explicit_policy>]
- [B<-inhibit_any>]
- [B<-inhibit_map>]
- [B<-x509_strict>]
- [B<-extended_crl>]
- [B<-use_deltas>]
- [B<-policy_print>]
- [B<-untrusted file>]
- [B<-help>]
- [B<-issuer_checks>]
- [B<-verbose>]
- [B<->]
- [certificates]
- =head1 DESCRIPTION
- The B<verify> command verifies certificate chains.
- =head1 COMMAND OPTIONS
- =over 4
- =item B<-CApath directory>
- A directory of trusted certificates. The certificates should have names
- of the form: hash.0 or have symbolic links to them of this
- form ("hash" is the hashed certificate subject name: see the B<-hash> option
- of the B<x509> utility). Under Unix the B<c_rehash> script will automatically
- create symbolic links to a directory of certificates.
- =item B<-CAfile file>
- A file of trusted certificates. The file should contain multiple certificates
- in PEM format concatenated together.
- =item B<-untrusted file>
- A file of untrusted certificates. The file should contain multiple certificates
- =item B<-purpose purpose>
- the intended use for the certificate. Without this option no chain verification
- will be done. Currently accepted uses are B<sslclient>, B<sslserver>,
- B<nssslserver>, B<smimesign>, B<smimeencrypt>. See the B<VERIFY OPERATION>
- section for more information.
- =item B<-help>
- prints out a usage message.
- =item B<-verbose>
- print extra information about the operations being performed.
- =item B<-issuer_checks>
- print out diagnostics relating to searches for the issuer certificate
- of the current certificate. This shows why each candidate issuer
- certificate was rejected. However the presence of rejection messages
- does not itself imply that anything is wrong: during the normal
- verify process several rejections may take place.
- =item B<-policy arg>
- Enable policy processing and add B<arg> to the user-initial-policy-set
- (see RFC3280 et al). The policy B<arg> can be an object name an OID in numeric
- form. This argument can appear more than once.
- =item B<-policy_check>
- Enables certificate policy processing.
- =item B<-explicit_policy>
- Set policy variable require-explicit-policy (see RFC3280 et al).
- =item B<-inhibit_any>
- Set policy variable inhibit-any-policy (see RFC3280 et al).
- =item B<-inhibit_map>
- Set policy variable inhibit-policy-mapping (see RFC3280 et al).
- =item B<-policy_print>
- Print out diagnostics, related to policy checking
- =item B<-crl_check>
- Checks end entity certificate validity by attempting to lookup a valid CRL.
- If a valid CRL cannot be found an error occurs.
- =item B<-crl_check_all>
- Checks the validity of B<all> certificates in the chain by attempting
- to lookup valid CRLs.
- =item B<-ignore_critical>
- Normally if an unhandled critical extension is present which is not
- supported by OpenSSL the certificate is rejected (as required by
- RFC3280 et al). If this option is set critical extensions are
- ignored.
- =item B<-x509_strict>
- Disable workarounds for broken certificates which have to be disabled
- for strict X.509 compliance.
- =item B<-extended_crl>
- Enable extended CRL features such as indirect CRLs and alternate CRL
- signing keys.
- =item B<-use_deltas>
- Enable support for delta CRLs.
- =item B<-check_ss_sig>
- Verify the signature on the self-signed root CA. This is disabled by default
- because it doesn't add any security.
- =item B<->
- marks the last option. All arguments following this are assumed to be
- certificate files. This is useful if the first certificate filename begins
- with a B<->.
- =item B<certificates>
- one or more certificates to verify. If no certificate filenames are included
- then an attempt is made to read a certificate from standard input. They should
- all be in PEM format.
- =back
- =head1 VERIFY OPERATION
- The B<verify> program uses the same functions as the internal SSL and S/MIME
- verification, therefore this description applies to these verify operations
- too.
- There is one crucial difference between the verify operations performed
- by the B<verify> program: wherever possible an attempt is made to continue
- after an error whereas normally the verify operation would halt on the
- first error. This allows all the problems with a certificate chain to be
- determined.
- The verify operation consists of a number of separate steps.
- Firstly a certificate chain is built up starting from the supplied certificate
- and ending in the root CA. It is an error if the whole chain cannot be built
- up. The chain is built up by looking up the issuers certificate of the current
- certificate. If a certificate is found which is its own issuer it is assumed
- to be the root CA.
- The process of 'looking up the issuers certificate' itself involves a number
- of steps. In versions of OpenSSL before 0.9.5a the first certificate whose
- subject name matched the issuer of the current certificate was assumed to be
- the issuers certificate. In OpenSSL 0.9.6 and later all certificates
- whose subject name matches the issuer name of the current certificate are
- subject to further tests. The relevant authority key identifier components
- of the current certificate (if present) must match the subject key identifier
- (if present) and issuer and serial number of the candidate issuer, in addition
- the keyUsage extension of the candidate issuer (if present) must permit
- certificate signing.
- The lookup first looks in the list of untrusted certificates and if no match
- is found the remaining lookups are from the trusted certificates. The root CA
- is always looked up in the trusted certificate list: if the certificate to
- verify is a root certificate then an exact match must be found in the trusted
- list.
- The second operation is to check every untrusted certificate's extensions for
- consistency with the supplied purpose. If the B<-purpose> option is not included
- then no checks are done. The supplied or "leaf" certificate must have extensions
- compatible with the supplied purpose and all other certificates must also be valid
- CA certificates. The precise extensions required are described in more detail in
- the B<CERTIFICATE EXTENSIONS> section of the B<x509> utility.
- The third operation is to check the trust settings on the root CA. The root
- CA should be trusted for the supplied purpose. For compatibility with previous
- versions of SSLeay and OpenSSL a certificate with no trust settings is considered
- to be valid for all purposes.
- The final operation is to check the validity of the certificate chain. The validity
- period is checked against the current system time and the notBefore and notAfter
- dates in the certificate. The certificate signatures are also checked at this
- point.
- If all operations complete successfully then certificate is considered valid. If
- any operation fails then the certificate is not valid.
- =head1 DIAGNOSTICS
- When a verify operation fails the output messages can be somewhat cryptic. The
- general form of the error message is:
- server.pem: /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
- error 24 at 1 depth lookup:invalid CA certificate
- The first line contains the name of the certificate being verified followed by
- the subject name of the certificate. The second line contains the error number
- and the depth. The depth is number of the certificate being verified when a
- problem was detected starting with zero for the certificate being verified itself
- then 1 for the CA that signed the certificate and so on. Finally a text version
- of the error number is presented.
- An exhaustive list of the error codes and messages is shown below, this also
- includes the name of the error code as defined in the header file x509_vfy.h
- Some of the error codes are defined but never returned: these are described
- as "unused".
- =over 4
- =item B<0 X509_V_OK: ok>
- the operation was successful.
- =item B<2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: unable to get issuer certificate>
- the issuer certificate of a looked up certificate could not be found. This
- normally means the list of trusted certificates is not complete.
- =item B<3 X509_V_ERR_UNABLE_TO_GET_CRL: unable to get certificate CRL>
- the CRL of a certificate could not be found.
- =item B<4 X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: unable to decrypt certificate's signature>
- the certificate signature could not be decrypted. This means that the actual signature value
- could not be determined rather than it not matching the expected value, this is only
- meaningful for RSA keys.
- =item B<5 X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: unable to decrypt CRL's signature>
- the CRL signature could not be decrypted: this means that the actual signature value
- could not be determined rather than it not matching the expected value. Unused.
- =item B<6 X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: unable to decode issuer public key>
- the public key in the certificate SubjectPublicKeyInfo could not be read.
- =item B<7 X509_V_ERR_CERT_SIGNATURE_FAILURE: certificate signature failure>
- the signature of the certificate is invalid.
- =item B<8 X509_V_ERR_CRL_SIGNATURE_FAILURE: CRL signature failure>
- the signature of the certificate is invalid.
- =item B<9 X509_V_ERR_CERT_NOT_YET_VALID: certificate is not yet valid>
- the certificate is not yet valid: the notBefore date is after the current time.
- =item B<10 X509_V_ERR_CERT_HAS_EXPIRED: certificate has expired>
- the certificate has expired: that is the notAfter date is before the current time.
- =item B<11 X509_V_ERR_CRL_NOT_YET_VALID: CRL is not yet valid>
- the CRL is not yet valid.
- =item B<12 X509_V_ERR_CRL_HAS_EXPIRED: CRL has expired>
- the CRL has expired.
- =item B<13 X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: format error in certificate's notBefore field>
- the certificate notBefore field contains an invalid time.
- =item B<14 X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: format error in certificate's notAfter field>
- the certificate notAfter field contains an invalid time.
- =item B<15 X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD: format error in CRL's lastUpdate field>
- the CRL lastUpdate field contains an invalid time.
- =item B<16 X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: format error in CRL's nextUpdate field>
- the CRL nextUpdate field contains an invalid time.
- =item B<17 X509_V_ERR_OUT_OF_MEM: out of memory>
- an error occurred trying to allocate memory. This should never happen.
- =item B<18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: self signed certificate>
- the passed certificate is self signed and the same certificate cannot be found in the list of
- trusted certificates.
- =item B<19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: self signed certificate in certificate chain>
- the certificate chain could be built up using the untrusted certificates but the root could not
- be found locally.
- =item B<20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: unable to get local issuer certificate>
- the issuer certificate could not be found: this occurs if the issuer
- certificate of an untrusted certificate cannot be found.
- =item B<21 X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: unable to verify the first certificate>
- no signatures could be verified because the chain contains only one certificate and it is not
- self signed.
- =item B<22 X509_V_ERR_CERT_CHAIN_TOO_LONG: certificate chain too long>
- the certificate chain length is greater than the supplied maximum depth. Unused.
- =item B<23 X509_V_ERR_CERT_REVOKED: certificate revoked>
- the certificate has been revoked.
- =item B<24 X509_V_ERR_INVALID_CA: invalid CA certificate>
- a CA certificate is invalid. Either it is not a CA or its extensions are not consistent
- with the supplied purpose.
- =item B<25 X509_V_ERR_PATH_LENGTH_EXCEEDED: path length constraint exceeded>
- the basicConstraints pathlength parameter has been exceeded.
- =item B<26 X509_V_ERR_INVALID_PURPOSE: unsupported certificate purpose>
- the supplied certificate cannot be used for the specified purpose.
- =item B<27 X509_V_ERR_CERT_UNTRUSTED: certificate not trusted>
- the root CA is not marked as trusted for the specified purpose.
- =item B<28 X509_V_ERR_CERT_REJECTED: certificate rejected>
- the root CA is marked to reject the specified purpose.
- =item B<29 X509_V_ERR_SUBJECT_ISSUER_MISMATCH: subject issuer mismatch>
- the current candidate issuer certificate was rejected because its subject name
- did not match the issuer name of the current certificate. Only displayed when
- the B<-issuer_checks> option is set.
- =item B<30 X509_V_ERR_AKID_SKID_MISMATCH: authority and subject key identifier mismatch>
- the current candidate issuer certificate was rejected because its subject key
- identifier was present and did not match the authority key identifier current
- certificate. Only displayed when the B<-issuer_checks> option is set.
- =item B<31 X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH: authority and issuer serial number mismatch>
- the current candidate issuer certificate was rejected because its issuer name
- and serial number was present and did not match the authority key identifier
- of the current certificate. Only displayed when the B<-issuer_checks> option is set.
- =item B<32 X509_V_ERR_KEYUSAGE_NO_CERTSIGN:key usage does not include certificate signing>
- the current candidate issuer certificate was rejected because its keyUsage extension
- does not permit certificate signing.
- =item B<50 X509_V_ERR_APPLICATION_VERIFICATION: application verification failure>
- an application specific error. Unused.
- =back
- =head1 BUGS
- Although the issuer checks are a considerably improvement over the old technique they still
- suffer from limitations in the underlying X509_LOOKUP API. One consequence of this is that
- trusted certificates with matching subject name must either appear in a file (as specified by the
- B<-CAfile> option) or a directory (as specified by B<-CApath>. If they occur in both then only
- the certificates in the file will be recognised.
- Previous versions of OpenSSL assume certificates with matching subject name are identical and
- mishandled them.
- Previous versions of this documentation swapped the meaning of the
- B<X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT> and
- B<20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY> error codes.
- =head1 SEE ALSO
- L<x509(1)|x509(1)>
- =cut
|