Elliptic-Curves

使用 OpenSSL 和 ECDHE,如何顯示正在使用的實際曲線?

  • January 31, 2016

使用

openssl s_client -host myserver.net -port 443

我可以看到協商的密碼確實ECDHE用於會話密鑰交換:

SSL handshake has read 5894 bytes and written 447 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
   Protocol  : TLSv1.2
   Cipher    : ECDHE-RSA-AES256-GCM-SHA384

客戶端和伺服器都使用完全相同的 OpenSSL 版本*“OpenSSL 1.0.1e 2013 年 2 月 11 日”*,我可以使用以下方法獲取可用的內置曲線列表:

openssl ecparam -list_curves

但是,如何找出會話中實際使用的橢圓曲線?

為了完整起見,以下是與真實會話中的曲線協商相關的 TLS 握手消息(使用opensslThomas 給出的命令):

客戶您好

>>> TLS 1.2 Handshake [length 013c], ClientHello
   01 00 01 38 03 03 52 6c 53 04 fb 32 94 d4 f4 91
   53 fe 59 5c d1 58 7f e0 67 e0 22 db da f4 8d ac
   dc 15 68 21 3d ec 00 00 a0 c0 30 c0 2c c0 28 c0
   24 c0 14 c0 0a c0 22 c0 21 00 a3 00 9f 00 6b 00
   6a 00 39 00 38 00 88 00 87 c0 32 c0 2e c0 2a c0
   26 c0 0f c0 05 00 9d 00 3d 00 35 00 84 c0 12 c0
   08 c0 1c c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0
   2f c0 2b c0 27 c0 23 c0 13 c0 09 c0 1f c0 1e 00
   a2 00 9e 00 67 00 40 00 33 00 32 00 9a 00 99 00
   45 00 44 c0 31 c0 2d c0 29 c0 25 c0 0e c0 04 00
   9c 00 3c 00 2f 00 96 00 41 00 07 c0 11 c0 07 c0
   0c c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00
   11 00 08 00 06 00 03 00 ff 01 00 00 6f 00 0b 00
   04 03 00 01 02[00 0a 00 34 00 32 00 0e 00 0d 00 [>>  ?
   19 00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00
   08 00 06 00 07 00 14 00 15 00 04 00 05]00 12 00  <<] ?
   13 00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00
   00 00 0d 00 22 00 20 06 01 06 02 06 03 05 01 05
   02 05 03 04 01 04 02 04 03 03 01 03 02 03 03 02
   01 02 02 02 03 01 01 00 0f 00 01 01

伺服器密鑰交換

<<< TLS 1.2 Handshake [length 014d], ServerKeyExchange
   0c 00 01 49 03 00 17 41 04 7e 74 d7 ed f4 7b 2f
   ...

您可以使用以下參數使 OpenSSL 列印出握手消息-msg

openssl s_client -msg -connect myserver.net:443

然後查找ServerKeyExchange消息。這是一個例子:

<<< TLS 1.2 Handshake [length 014d], ServerKeyExchange
   0c 00 01 49 03 00 17 41 04 6b d8 6e 14 1c 9b 12
   4d 58 29 20 e8 e2 1a 24 0d da 8f 38 1a 5d 85 2b
   2b 70 61 97 3b a7 5b fd b6 14 b3 5d f0 dd ea 7b
   68 d9 eb bc b2 59 32 52 9d 8e 9c 97 c0 d4 45 4c
   (...)

這可以使用RFC 5246RFC 4492作為參考進行分析。在這種情況下:

  • 0c:這是一條ServerKeyExchange消息(在RFC 4492的第 5.4 節中描述)
  • 00 01 49: 長度為 0x000149 字節(329 字節)
  • 03:曲線類型為“ named_curve
  • 00 17:曲線是secp256r1(曲線標識符在第 5.1.1 節中,標識符 0x0017 是十進制的 23)。

secp256r1也稱為 P-256,是 NIST 在FIPS 186-4中標準化的 15 條曲線之一。事實上,這是幾乎每個人都使用的曲線。

引用自:https://crypto.stackexchange.com/questions/11310