It looks like s_client and s_server only work with trusted certificates and cannot handle certificate chains. It only seems to use SSL_CTX_use_certificate and not SSL_CTX_use_certificate_chain_file.
Experts! correct me if I am wrong. Thanks, Sandeep On Fri, Jun 3, 2011 at 12:47 AM, Mary Zhang <[email protected]> wrote: > Sandeep, > > I put the whole chain in the client's cert file client1ica1.test.com.pem. > > Thanks! > > Mary > > > On Thu, Jun 2, 2011 at 4:16 AM, sandeep kiran p > <[email protected]>wrote: > >> I searched through the list of certificates that you have sent but could >> not find the issuer certificate for client1ica1.test.com.pem. >> >> E:\ssl\install\test\tls\test.com>openssl x509 -issuer -in >> client1ica1.test.com.pem -noout >> issuer= /C=US/ST=CO/L=Denver/O=CCG/OU=XCP/CN=ica1.test.com >> >> Unless the server has access to a certificate whose subject is >> "/C=US/ST=CO/L=Denver/O=CCG/OU=XCP/CN=ica1.test.com", certificate >> verification would fail. >> >> depth=0 C = US, ST = CO, L = Denver, O = CCG, OU = XCP, CN = >> client1ica1.test.com >> verify error:num=20:unable to get local issuer certificate >> >> Thanks, >> Sandeep >> >> On Wed, Jun 1, 2011 at 10:40 AM, Mary Zhang <[email protected]>wrote: >> >>> In fact, I just found that openssl s_sever gives same result of untrusted >>> client cert - I forgot to specify "Verify" option to require client auth. >>> >>> It looks like the s_client didn't send the certificate chain from the >>> client cert file to server side, and the server cannot build the chain for >>> validation. >>> However, if I add client's intermediate CA to server's ca file (the root >>> ca always there), then it works. >>> >>> Double check, should the cert chain be sent over by client and server >>> only need have the root ca in its ca file? Or server need include the >>> intermediate CA in its ca file directly? >>> >>> And how can I force s_client to send the cert chain to server if it's >>> supported? >>> >>> BTW, my test certs are attached (created using xca), my test cmds are: >>> >>> openssl s_server -cert tls/example.com/cert.pem -CAfile tls/ >>> test.com/ca.pem -accept 8888 -Verify 10 >>> openssl s_client -connect localhost:8888 -msg -showcerts -cert >>> client1ica1.test.com.pem >>> >>> >>> Thanks! >>> >>> Mary >>> >>> >>> On Sat, May 28, 2011 at 10:42 AM, sandeep kiran p < >>> [email protected]> wrote: >>> >>>> Can you verify the client certificate using "openssl verify" with >>>> -CApath and -CAfile similar to what you have used in >>>> >>>> SSL_CTX_load_verify_locations(ctx, (char*)ca_fname, ca_path_ptr) >>>> >>>> Does it work if you specify only the client cert and not the entire >>>> chain when using s_client? >>>> >>>> /Sandeep >>>> >>>> On Sat, May 28, 2011 at 12:18 AM, Mary Zhang >>>> <[email protected]>wrote: >>>> >>>>> Ziyu, please see my answers inline. >>>>> >>>>> Thanks! >>>>> >>>>> Mary >>>>> >>>>> 2011/5/27 Ziyu Liu <[email protected]> >>>>> >>>>>> >>>>>> At 2011-05-27 13:27:43,"Mary Zhang" <[email protected]> wrote: >>>>>> >>>>>> Thanks, Ziyu. >>>>>> >>>>>> >The certificate is ok. >>>>>> >In fact, openssl s_client using same test cert works fine against >>>>>> openssl >s_server, and if I put the intermediate CA into my SSL server's >>>>>> ca >>>>>> file, it >works as well. >>>>>> >>>>>> Did you attach the intermediate CA to your client certificate chain >>>>>> file? >>>>>> >>>>>> [Mary] Yeah, client cert file contains the whole chain. >>>>> >>>>>> >>>>>> >So the issue is that my SSL server is not building the cert chain >>>>>> >correctly to validate against the root ca. >>>>>> >And I'm not sure whether I missed some call/config to enable the cert >>>>>> >chain validation. >>>>>> >>>>>> There is no specific difference between cert or cert chain. >>>>>> What verification depth have you set? >>>>>> Have you set the same CN when generating the root CA and intermediate >>>>>> CA? >>>>>> >>>>>> [Mary] You mean for validation of cert or cert chain, there is >>>>> no difference in code: same code should work? >>>>> That's what I expected, but somehow it failed with chain case >>>>> only. >>>>> >>>>>> The verification depth is set to 10 by default (previous other's >>>>>> code), I may double check that part. >>>>>> >>>>>> The root CA and intermediate CA have different CNs. And I used >>>>> xca to create them. >>>>> >>>>> >>>>>> You can test your server with the certifcates in my attachment. >>>>>> Structure: >>>>>> rootcert.pem signs servercert.pem,a intermediate cert which is in the >>>>>> clientchian.pem >>>>>> a intermediate cert signs the clientcert.pem. >>>>>> [Mary] Will try, but my test certs work fine with OpenSSL s_client and >>>>>> s_server, and so don't think the certs have issue. >>>>>> >>>>>> >>>>> >>>>>> Thanks! >>>>>> >>>>>> Mary >>>>>> >>>>>> 2011/5/26 Ziyu Liu <[email protected]> >>>>>> >>>>>>> Use the command 'openssl x509 -in serverCA.pem -text -noout' to check >>>>>>> if your certificate is generated ok.When you are goting to use the >>>>>>> intermediate CA , you must use X509 v3 extension. >>>>>>> Check if you have this content: >>>>>>> * X509v3 extensions: >>>>>>> X509v3 Basic Constraints: >>>>>>> CA:TRUE* >>>>>>> >>>>>>> >>>>>>> At 2011-05-27 06:53:04,"Mary Zhang" <[email protected]> wrote: >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I am using OpenSSL for a SSL server and "openssl s_client" to test it >>>>>>> with client auth required. >>>>>>> Self-sigend root cert is used for creating client certs, and the >>>>>>> self-signed root cert is added to SSL server's trusted ca file. >>>>>>> >>>>>>> It works fine when client cert has no chain, but if the client cert >>>>>>> is created by an intermediate ca which is signed by previous root ca, >>>>>>> the >>>>>>> SSL server failed with unknown ca. >>>>>>> From the debug trace, looks like s_client sent the whole chain (the >>>>>>> client cert file contains the private key and the whole chain in PEM >>>>>>> format). >>>>>>> >>>>>>> I've thought that OpenSSL will automatically build the chain based on >>>>>>> what sent from client, and since the root ca is trusted, and it should >>>>>>> work. >>>>>>> Am I wrong? Do I need get the client's cert chain and set to the SSL >>>>>>> CTX for validation? >>>>>>> >>>>>>> BTW, here are the functions used: >>>>>>> >>>>>>> SSL_CTX_new(SSLv23_method()); >>>>>>> >>>>>>> >>>>>>> SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_BOTH); >>>>>>> >>>>>>> SSL_CTX_set_options(ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2); >>>>>>> >>>>>>> >>>>>>> SSL_CTX_set_cipher_list(ctx, CIPHER_LIST) >>>>>>> >>>>>>> SSL_CTX_use_certificate_chain_file(ctx, cert_fname) >>>>>>> >>>>>>> SSL_CTX_use_PrivateKey_file(ctx, cert_fname, SSL_FILETYPE_PEM) >>>>>>> >>>>>>> STACK_OF(X509_NAME) *ca_certs = SSL_load_client_CA_file((char >>>>>>> *)ca_fname); >>>>>>> >>>>>>> SSL_CTX_set_client_CA_list(ctx, ca_certs); >>>>>>> >>>>>>> >>>>>>> SSL_CTX_load_verify_locations(ctx, (char*)ca_fname, ca_path_ptr) >>>>>>> >>>>>>> >>>>>>> >>>>>>> SSL_CTX_set_verify(ctx, >>>>>>> SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); >>>>>>> >>>>>>> >>>>>>> SSL_CTX_set_verify_depth(ctx, _verify_depth); >>>>>>> >>>>>>> >>>>>>> Thank you very much! >>>>>>> >>>>>>> >>>>>>> Mary >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >> >
