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
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to