The openssl
commandline verify
operation reads only one certificate, the first one, from the file given as operand, or from each file if more than one is given. This differs from the files specified with the -CAfile -trusted -untrusted
options which can (and typically do) contain multiple certs.
Your file client/org1_client_crt.pem
presumably contains the client cert and the 'org CA' cert, in that order. Only the client cert is used, the 'org CA' cert is ignored, and as a result you do not have a valid chain to verify.
If you want to use commandline to mimic/test the validation that a receiver (for a client cert, the server) would do, supply the leaf cert as the operand and all other transmitted (chain) certs with -untrusted
, and the anchor(s) plus any 'known' intermediates in the truststore either explicit or defaulted.
There is no openssl connect
operation; I assume you mean openssl s_client
with options including -connect
since that's one place it would make sense to use a client cert chain. The -cert
option to s_client
similarly uses only the first cert in the file. There is no option on commandline to specify the client chain except in the most recent version, 1.1.0, and even there it isn't documented so you have to read the help message carefully or the code, although the API/library has long supported this for code you write yourself.
Through 1.0.2 if you want to send a client cert with full chain to the server (as you should per the RFCs), assuming the server requests client authentication which is not usual and not the default for nginx (among others), you have to use a trick: supply all the certs needed for the client chain in the truststore, in addition to the anchor(s) needed to verify the server, either using -CAfile
and/or -CApath
explicitly, or using (modifying if needed) the default truststore unless your openssl
is an older non-RedHat version where the default truststore didn't work in s_client s_server s_time
only.
And the same is true about the server cert/chain in s_server
except that it is used almost always instead of very rarely.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…