title: OpenSSL client not sending client certificate
body: <p>I am struggling with a client certificate problem and hope somebody here can help me. I'm developing a client/server pair using boost asio but I'll try to be unspecific. I'm on windows and using openssl 1.0.1e</p>
  
  <p>Basically, I want to have client authentication by using client certificates. The server shall only accept clients that have a certificate signed by my own CA. So I have setup a self signed CA. This has issued two more certificates. One for the client and one for the server. Both signed by the CA.
  I have done that quite a few times now and I am confident that I got it.</p>
  
  <p>My server side also works fine. It requests client certificates and if I'm using s_client and give those certs everything works. Also if I'm using a browser and have my root CA installed as trusted and then import the client certs.</p>
  
  <p>The only thing that I can't get to work is the libssl client. It always fails during the handshake and as far as I can see it will not send the client certficate:</p>
  
  <pre><code>$ openssl.exe s_server -servername localhost -bugs -CAfile myca.crt -cert server.crt
   -cert2 server.crt -key private/server.key -key2 private/server.key -accept 8887 -www 
   -state -Verify 5
  verify depth is 5, must return a certificate
  Setting secondary ctx parameters
  Using default temp DH parameters
  Using default temp ECDH parameters
  ACCEPT
  SSL_accept:before/accept initialization
  SSL_accept:SSLv3 read client hello A
  SSL_accept:SSLv3 write server hello A
  SSL_accept:SSLv3 write certificate A
  SSL_accept:SSLv3 write key exchange A
  SSL_accept:SSLv3 write certificate request A
  SSL_accept:SSLv3 flush data
  SSL3 alert read:warning:no certificate
  SSL3 alert write:fatal:handshake failure
  SSL_accept:error in SSLv3 read client certificate B
  SSL_accept:error in SSLv3 read client certificate B
  2675716:error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a
  certificate:s3_srvr.c:3193:
  ACCEPT
  </code></pre>
  
  <p>I'm using this s_server as debugging tool but against my real server the same thing occurs.
  s_client will work fine with the same certificates. Also, if I disable "-Verify" in the server the connection works. So it really seems just the client refusing to send it's certficate. What can be the reason for that?</p>
  
  <p>Since I'm using boost asio as an SSL wrapper the code looks like this:</p>
  
  <pre><code>m_ssl_context.set_verify_mode( asio::ssl::context::verify_peer );
  m_ssl_context.load_verify_file( "myca.crt" );
  m_ssl_context.use_certificate_file( "testclient.crt", asio::ssl::context::pem );
  m_ssl_context.use_private_key_file( "testclient.key", asio::ssl::context::pem );
  </code></pre>
  
  <p>I have also tried to bypass asio and access the SSL context directly by saying:</p>
  
  <pre><code>SSL_CTX *ctx = m_ssl_context.impl();
  SSL *ssl = m_ssl_socket.impl()-&gt;ssl;
  int res = 0;
  res = SSL_CTX_use_certificate_chain_file(ctx, "myca.crt");
  if (res &lt;= 0) {
      // handle error
  }
  res = SSL_CTX_use_certificate_file(ctx, "testclient.crt", SSL_FILETYPE_PEM);
  if (res &lt;= 0) {
      // handle error
  }
  res = SSL_CTX_use_PrivateKey_file(ctx, "testclient.key", SSL_FILETYPE_PEM);
  if (res &lt;= 0) {
      // handle error
  }
  </code></pre>
  
  <p>I can't see any difference in behavior. It should be mentioned that I am using a very old boost 1.43 asio which I cannot update but I suppose all relevant calls go more or less directly to OpenSSL anyway and the server works fine with that version so I think I can rule that out.</p>
  
  <p>If I start forcing client and server to specific versions, the error messages change but it never works and still always works with the s_client test. Currently it is set to TLSv1</p>
  
  <p>If I switch it to TLSv1 for example there is more chatter between client and server and eventually I get the error:</p>
  
  <pre><code>...
  SSL_accept:SSLv3 read client key exchange A
  &lt;&lt;&lt; TLS 1.0 ChangeCipherSpec [length 0001]
      01
  &lt;&lt;&lt; TLS 1.0 Handshake [length 0010], Finished
      14 00 00 0c f4 71 28 4d ab e3 dd f2 46 e8 8b ed
  &gt;&gt;&gt; TLS 1.0 Alert [length 0002], fatal unexpected_message
      02 0a
  SSL3 alert write:fatal:unexpected_message
  SSL_accept:failed in SSLv3 read certificate verify B
  2675716:error:140880AE:SSL routines:SSL3_GET_CERT_VERIFY:missing verify 
  message:s3_srvr.c:2951:
  2675716:error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure:s3_pkt.c:989:
  ACCEPT
  </code></pre>
  
  <p>I have found an older bug entry posted on the openssl mailing list that refereed to this. Apparently a wrong CRLF in the handshake that has been fixed two yrs ago. Or has it? </p>
  
  <p>I have been debugging this for almost a week now and I'm really stuck. Does anyone have a suggestion on what to try? I'm out of ideas...</p>
  
  <p>Cheers,
  Stephan</p>
  
  <p>PS: Here is what the above s_server debug out would be with s_client and the same certficate:</p>
  
  <pre><code>$ openssl s_client -CAfile ca.crt -cert testclient.crt -key private/testclient.key -verify 2 -connect myhost:8887
  
  ACCEPT
  SSL_accept:before/accept initialization
  SSL_accept:SSLv3 read client hello A
  SSL_accept:SSLv3 write server hello A
  SSL_accept:SSLv3 write certificate A
  SSL_accept:SSLv3 write key exchange A
  SSL_accept:SSLv3 write certificate request A
  SSL_accept:SSLv3 flush data
  depth=1 C = DE, // further info
  verify return:1
  depth=0 C = DE, // further info
  verify return:1
  SSL_accept:SSLv3 read client certificate A
  SSL_accept:SSLv3 read client key exchange A
  SSL_accept:SSLv3 read certificate verify A
  SSL_accept:SSLv3 read finished A
  SSL_accept:SSLv3 write session ticket A
  SSL_accept:SSLv3 write change cipher spec A
  SSL_accept:SSLv3 write finished A
  SSL_accept:SSLv3 flush data
  ACCEPT
  </code></pre>
  
  <p>... handshake completes and data is transferred.</p>