如何强制服务器在通过 openssl 握手开始时使用特定的椭圆曲线?

如何强制服务器在通过 openssl 握手开始时使用特定的椭圆曲线?

openssl 中是否有可能或命令强制服务器使用我通过证书或密钥请求的特定椭圆曲线?我可以“询问”进程可以使用的曲线吗?

答案1

您的问题很模糊,答案也大相径庭。

协议。ClientHello 消息中的受支持曲线扩展指定客户端愿意让服务器使用的曲线(标准/命名,或“显式”GF(2^k) 或 GF(p))。如果它指定多个,服务器可以选择其中任何一个;如果它指定一个,那就是服务器可以使用的唯一一个。如果服务器不支持或任何指定的曲线,则协商无法选择任何 EC 套件,除非其他套件得到双方支持和接受,否则协商失败。

OpenSSL 客户端到任何服务器直到 1.0.1 始终发送此扩展以允许所有命名曲线(在 rfc4492 中)并且没有显式曲线。除了红帽(据我所知还有吗?)将其 OpenSSL 版本仅修订为 P-256、P-384 和 P-521。1.0.2添加新的 API 调用来控制此扩展,请参阅https://www.openssl.org/docs/ssl/SSL_CTX_set1_curves_list.html。因此,要么针对 1.0.2* 编写并构建您的客户端程序,而不是在 RedHat 上,要么让维护您的客户端程序的人这样做。

任何客户端都可以访问 OpenSSL 服务器来获取 ECDHE。OpenSSL 服务器(直到 1.0.1)可以在握手之前进行配置,无论是为所有共享 SSL_CTX 的连接还是为每个 SSL 连接单独配置,使用 ECDHE“临时参数”(即曲线)。只有配置的曲线才用于密钥交换。对于 ECDHE-ECDSA,证书用来(与其匹配的私钥)认证,可以使用不同的曲线;该密钥和曲线是在证书颁发和 CA“批准”之前选择的,现在无法更改,而“临时”ECDHE 选择是由服务器代码或配置做出的。如果“临时”曲线或证书为 ECC 时的证书曲线不在客户端允许的列表中,则无法协商 ECDHE 或 ECDHE-ECDSA。

服务器无需提前配置,而是可以设置由 OpenSSL 库调用的回调来选择特定握手的 ECDHE 曲线(或密钥)。这应该选择客户端可以接受的曲线,除非服务器无法接受。同样,对于 ECDHE-ECDSA,证书中用于身份验证的曲线可能不同,在颁发之前已经选择并且无法更改,如果客户端不接受,则无法协商。最后是新的1.0.2OpenSSL 有一个选项,可以自动选择客户端可接受的 ECDHE 曲线,同时“匹配”身份验证强度。

静态 ECDH 服务器用于密钥交换的曲线(和密钥)是证书中的曲线,如上所述,它是在颁发证书之前选择的,并且无法更改。如果客户端不接受此曲线,则无法协商 ECDH。

答案2

openssl 中是否有可能或命令强制服务器使用特定的椭圆曲线

总的来说,我不确定如何通过 CONF 文件执行此操作。APISSL_CONF_*调用(如下所示)似乎表明它可以成为配置文件的一部分。但我从未这样做过。


如何强制服务器在通过 openssl 握手开始时使用特定的椭圆曲线?

可以,但你必须修改源代码。这是来自一位 OpenSSL 开发人员的一封私人电子邮件。但我不确定它在实践中是否有效,因为我使用了下面描述的修补方法。

Under 0.9.x:
         int nid = OBJ_sn2nid(named_curve);
         ecdh = EC_KEY_new_by_curve_name(nid);
         SSL_CTX_set_tmp_ecdh(ctx,ecdh);
         EC_KEY_free(ecdh);

 Under 1.x:
         SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
         SSL_CONF_cmd(cctx, "-named_curve", "P-256");
         SSL_CONF_CTX_finish(cctx);

对于 1.0.1 及以下版本,您可以将源修改为t1_lib.c。具体来说,找到ssl_prepare_clienthello_tlsextpref_list并将其更改为您喜欢的内容。默认情况下它看起来如下:

static int pref_list[] =
 {
   NID_sect571r1, /* sect571r1 (14) */
   NID_sect571k1, /* sect571k1 (13) */
   NID_secp521r1, /* secp521r1 (25) */
   NID_sect409k1, /* sect409k1 (11) */
   NID_sect409r1, /* sect409r1 (12) */
   NID_secp384r1, /* secp384r1 (24) */
   NID_sect283k1, /* sect283k1 (9) */
   NID_sect283r1, /* sect283r1 (10) */
   NID_secp256k1, /* secp256k1 (22) */
   NID_X9_62_prime256v1, /* secp256r1 (23) */
   NID_sect239k1, /* sect239k1 (8) */
   NID_sect233k1, /* sect233k1 (6) */
   NID_sect233r1, /* sect233r1 (7) */
   NID_secp224k1, /* secp224k1 (20) */
   NID_secp224r1, /* secp224r1 (21) */
 };

另请参阅问题 #3179:功能请求:在客户端中设置 EC 曲线的偏好列表


对于 OpenSSL 1.0.2 及以上版本,您可以使用SSL_CTX_set1_curves在 grep 源时, .pref_list不再存在。

相关内容