<div dir="ltr"><div><div>Hello,<br><br></div>according to RFC 4492 the key usage for ECDHE and ECDH ciphers need to be observed in regards to key agreement: When I use ECDH_ECDSA ciphers then the server certificate must have the keyAgreement usage. When I use ECDHE_ECDSA ciphers then the server certificate must have "digitalSignature".<br><br><pre class="gmail-newpage"># Note that there is no structural difference between ECDH and ECDSA
# keys.  A certificate issuer may use X.509 v3 keyUsage and
# extendedKeyUsage extensions to restrict the use of an ECC public key
# to certain computations [<a href="https://tools.ietf.org/search/rfc4492#ref-15" title=""Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile"">15</a>].  This document refers to an ECC key as
# ECDH-capable if its use in ECDH is permitted.  ECDSA-capable is
# defined similarly.</pre><br></div>This rule is enforced by the openssl s_client: when the server proposes a cipher which does not pass this check it will terminate the connection:<br><br>> openssl s_client -cipher ECDHE-ECDSA-AES128-SHA256 -connect localhost:1234<br><div>> 1252:error:1411713E:SSL routines:ssl_check_srvr_ecc_cert_and_alg:ecc cert not for signing:.\ssl\ssl_lib.c:2512:<br>> 1252:error:14082130:SSL routines:ssl3_check_cert_and_algorithm:bad ecc cert:.\ssl\s3_clnt.c:3544:<br><br></div><div>In this case the certificate had key usage:<br><br>> [ server-exch ]<br>> extendedKeyUsage = serverAuth<br>> basicConstraints = CA:FALSE<br>> keyUsage = keyAgreement<br>> subjectAltName=IP:127.0.0.1,DNS:localhost.<br><br></div><div>The connect with static ECDH works:<br><br>> openssl s_client -cipher ECDH-ECDSA-AES128-SHA256 -connect localhost:1234<br>...<br>> SSL-Session:<br>>    Protocol  : TLSv1.2<br>>    Cipher    : ECDH-ECDSA-AES128-SHA256<br><br></div><div>The other way around, when I use the following key usage:<br><br>> [ server-sign ]<br>> extendedKeyUsage = serverAuth<br>> basicConstraints = CA:FALSE<br>> keyUsage = digitalSignature<br>> subjectAltName=IP:127.0.0.1,DNS:localhost.<br><br></div><div>OpenSSL client works this way:<br><br>>openssl s_client -cipher ECDH-ECDSA-AES128-SHA256 -connect localhost:1234<br>>9916:error:1411713D:SSL routines:ssl_check_srvr_ecc_cert_and_alg:ecc cert not for key agreement<br><br>>openssl s_client -cipher ECDHE-ECDSA-AES128-SHA256 -connect localhost:1234<br>>SSL-Session:<br>>    Protocol  : TLSv1.2<br>>    Cipher    : ECDHE-ECDSA-AES128-SHA256<br><br></div><div>In both cases however JSSE (OracleJDK8u121 or OpenJDK 9-ea+162) will offer both cipher suites and not filter them by key usage capabilties. Would you agree this is a bug? And should this also apply to client side? I have not tested it with RSA certificates, but I would expect this to be the same.<br><br></div><div>Gruss<br></div><div>Bernd<br><br></div><div>PS: config file and openssl commands to create multiple ECC certificates used for this test:<br><a href="https://gist.github.com/ecki/d66d79bf0cf12872d015804f5edec6e4">https://gist.github.com/ecki/d66d79bf0cf12872d015804f5edec6e4</a><br><br></div><div><br></div></div>