I am trying to use ECDH-RSA-AES256-SHA with ssl3 with s_client and s_server on
the master branch. (cloned at commit f7683aaf36341dc65672ac2ccdbfd4a232e3626d)
and then retested with a more recent clone: (commit
da27006df06853a33b132133699a7aa9d4277920).
We are running a test suite that tests all supported cipher and protocol
combinations and this test is part of that suite.
Our test suite is failing with an unmodified build of OpenSSL with the
following commands:-
s_server:
./openssl s_server -cert prime256v1-rsaTestServer.cert.pem -key
prime256v1-rsaTestServer.key.pem -WWW -accept 4411 -cipher ECDH-RSA-AES256-SHA
-nbio -ssl3 -debug -state
s_client:
echo "GET /file_1byte.html HTTP/1.0" | ./openssl s_client -host localhost
-port 4411 -cipher ECDH-RSA-AES256-SHA -ssl3 -ign_eof -debug -state
The output from s_client is:-
SSL_connect:before/connect initialization
SSL_connect:SSLv3 write client hello A
SSL3 alert read:fatal:handshake failure
SSL_connect:failed in SSLv3 read server hello A
139749978326688:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert
handshake failure:s3_pkt.c:1482:SSL alert number 40
139749978326688:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake
failure:s3_pkt.c:664:
CONNECTED(00000003)
write to 0x1284120 [0x128e913] (52 bytes => 52 (0x34))
0000 - 16 03 00 00 2f 01 00 00-2b 03 00 af 73 f8 85 b4 ..../...+...s...
0010 - 01 5f d4 79 66 4e 94 fa-bf e7 5e 5b 19 75 c8 5f ._.yfN....^[.u._
0020 - 44 73 bb bd 47 8c 23 57-01 c0 1a 00 00 04 c0 0f Ds..G.#W........
0030 - 00 ff 01 ...
0034 - <SPACES/NULS>
read from 0x1284120 [0x128a3c3] (5 bytes => 5 (0x5))
0000 - 15 03 00 00 02 .....
read from 0x1284120 [0x128a3c8] (2 bytes => 2 (0x2))
0000 - 02 28 .(
---
no peer certificate available
The output from s_server is:-
Using default temp DH parameters
ACCEPT
turning on non blocking io
SSL_accept:before/accept initialization
read from 0x21b32b0 [0x21b7993] (5 bytes => 5 (0x5))
0000 - 16 03 00 00 2f ..../
read from 0x21b32b0 [0x21b7998] (47 bytes => 47 (0x2F))
0000 - 01 00 00 2b 03 00 aa 75-39 f4 b5 78 46 3e 8c cb ...+...u9..xF>..
0010 - a9 18 92 01 cd 24 cf fd-7b a7 de 29 7c b8 d9 bc .....$..{..)|...
0020 - c4 62 1c c5 33 7f 00 00-04 c0 0f 00 ff 01 .b..3.........
002f - <SPACES/NULS>
0:[00000020:00000010:00000188:00000084]0x6055a0:ECDH-RSA-AES256-SHA
write to 0x21b32b0 [0x21c6910] (7 bytes => 7 (0x7))
0000 - 15 03 00 00 02 02 28 ......(
SSL3 alert write:fatal:handshake failure
SSL_accept:error in SSLv3 read client hello C
139792107542176:error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared
cipher:s3_srvr.c:1366:
ACCEPT
I am using an ECC test certificate that uses curve prime256v1 and is signed
with an rsa2k key.
The cert/key were generated using RSAcertgen.sh followed by ECC-RSAcertgen.sh
modified only for the curve and RSA key size I am using.
Here is a dump of the certificate:
./openssl x509 -in prime256v1-rsaTestServer.cert.pem -text -noout
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 16838786626002069798 (0xe9af63387b73a926)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=CA, L=Mountain View, O=Sun Microsystems, Inc., OU=Sun
Microsystems Laboratories, CN=Test CA (2048 bit RSA)
Validity
Not Before: Mar 13 11:38:21 2015 GMT
Not After : Apr 21 11:38:21 2019 GMT
Subject: C=US, ST=CA, L=Mountain View, O=Sun Microsystems, Inc., OU=Sun
Microsystems Laboratories, CN=Test Server (prime256v1 key signed with RSA)
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:0d:a6:16:d8:43:25:dc:83:6d:18:fb:f0:b7:41:
bc:05:88:a2:f2:56:8a:76:7a:d0:2b:7f:de:0a:44:
33:4b:de:5b:30:44:ff:34:0e:17:c6:38:77:d7:53:
b2:c2:fa:9f:7f:d5:e3:a4:b5:de:ce:29:9d:74:e6:
59:76:9f:e6:eb
ASN1 OID: prime256v1
NIST CURVE: P-256
Signature Algorithm: sha256WithRSAEncryption
d0:1c:97:60:b9:14:cf:5a:c8:ea:8d:65:63:75:50:f2:63:68:
82:06:0c:47:f5:52:13:a5:61:4b:cd:99:ab:d0:56:81:a7:92:
21:c7:07:e3:12:25:4a:a8:c7:83:7a:bd:57:11:c7:55:88:28:
74:f1:37:bb:cd:0b:5b:7b:6f:45:e6:8d:1a:be:1a:fd:e0:d2:
5b:e5:ee:39:2e:73:c8:d6:03:5c:f6:f9:37:4a:81:e4:41:5a:
87:d5:0d:da:48:67:14:bb:75:3b:ae:68:b9:c4:25:2d:19:a7:
05:90:a2:fb:b4:d3:00:4f:40:19:e9:2d:83:75:db:3c:53:fe:
08:ae:ca:ba:3d:a5:4d:6e:f6:14:af:ee:7e:6d:dc:45:96:91:
92:6d:37:52:b6:b7:ad:70:02:d0:11:0d:84:1b:f1:3b:82:be:
66:af:a6:3c:17:33:d0:98:c3:cb:d3:22:39:d1:66:6e:94:ce:
7e:70:3c:02:29:6a:b6:87:e9:c4:e9:44:b4:9b:f1:8e:47:82:
2d:20:79:0e:f6:91:b1:e9:cf:83:66:8f:ff:e1:4f:2f:a1:ab:
ca:2d:81:53:7d:7f:69:b5:11:59:7e:9a:47:1c:6a:c8:83:54:
83:0a:7d:46:ec:2e:e9:82:f3:b4:d4:f6:04:57:bc:a5:b2:c5:
0c:ed:a6:fa
Running the exact same s_server/s_client commands above with either the system
openssl (1.0.0o) or the baseline we normally release against (1.0.1l) works
fine.
Running on the master branch with the same certificate and commands above but
with tls1, tls1_1 or tls1_2 works perfectly, only ssl3 fails.
Running with a sect163r1 curve signed with an rsa1k key also produces the same
failure.
My build is as follows:
./openssl version -a
OpenSSL 1.1.0-dev xx XXX xxxx
built on: reproducible build, date unspecified
platform: linux-x86_64
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -g -I. -I.. -I../include -DOPENSSL_TLS_SECURITY_LEVEL=0
-DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack
-m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT
-DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM
-DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM
-DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/local/ssl"
As you can see the only flag I have enabled (apart from -g while debugging) is
-DOPENSSL_TLS_SECURITY_LEVEL=0. We need this flag to allow some of the older
cipher suites we test against but the issue is seen with or without that flag
defined.
I'm not overly familiar with the master branch as we do not normally build
against it so my real question is whether I am doing something wrong in terms
of configuration on the master branch (is there a flag I need to enable to
allow ECDH-RSA with ssl3 that I haven't spotted?) or is this a genuine bug?
Single stepping through the code I can see the failure is occurring in
tls1_check_ec_key when it is called from tls1_check_cert_param.
It appears to go around a for loop (j) twice. The first time through it
correctly matches the curve it is looking for. The second time round the list
is empty and 0 is returned. This failure causes the Elliptical curve cert not
to be declared as valid and consequently the handshake fails with the no shared
cipher message.
I don't have a good understanding of how the certificate code works so I
haven't managed to debug any further than that in order to determine why the
second time round the loop the list is empty.
--
Steve Linsell Intel Shannon DCG/CID
Software Development Team
[email protected]
--------------------------------------------------------------
Intel Shannon Limited
Registered in Ireland
Registered Office: Collinstown Industrial Park, Leixlip, County Kildare
Registered Number: 308263
Business address: Dromore House, East Park, Shannon, Co. Clare
This e-mail and any attachments may contain confidential material for the sole
use of the intended recipient(s). Any review or distribution by others is
strictly prohibited. If you are not the intended recipient, please contact the
sender and delete all copies.
_______________________________________________
openssl-users mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users