Como forçar um servidor a usar uma curva elíptica específica no início do handshake via openssl?

4

Existe uma possibilidade ou comando no openssl para forçar um servidor a usar uma curva elíptica específica que estou solicitando com um certificado ou chave? Posso "perguntar" ao processo que as curvas são capazes de usar?

    
por SmithCorner 07.05.2015 / 21:24

2 respostas

5

Sua pergunta é ambígua e as respostas são bem diferentes.

Protocolo. A extensão de curvas suportadas na mensagem ClientHello especifica as curvas (padrão / nomeadas ou 'explícitas' GF (2 ^ k) ou GF (p)) que o cliente está disposto a ter o uso do servidor. Se especificar mais de um, o servidor pode escolher qualquer um deles; se especificar um, esse é o único que o servidor pode usar. Se o servidor não suportar a curva ou qualquer curva especificada, a negociação não poderá selecionar nenhum pacote EC e, a menos que outras suítes sejam suportadas e aceitáveis para ambas as extremidades, a negociação falhará.

O

cliente OpenSSL para qualquer servidor até 1.0.1 sempre envia essa extensão para permitir todas as curvas nomeadas (em rfc4492) e nenhuma curva explícita. Exceto que o RedHat (AFAIK ainda?), Nobriga seu OpenSSL apenas para o P-256, P-384 e P-521. 1.0.2 adiciona novas chamadas de API para controlar essa extensão, consulte o link . Então, codifique e construa seu programa cliente contra 1.0.2 * e não no RedHat, ou faça com que quem mantiver seu programa cliente o faça.

Qualquer cliente para servidor OpenSSL para ECDHE. O servidor OpenSSL até 1.0.1 pode ser configurado antes do handshake, para todas as conexões que compartilham um SSL_CTX ou para cada conexão SSL separadamente, com o ECDHE "temporário parâmetros "que é (são?) a curva. Apenas a curva configurada é usada para troca de chaves. Para o ECDHE-ECDSA, a chave pública no cert usado (com sua chave privada correspondente) para autenticar , pode usar uma curva diferente ; essa chave e curva foi escolhida antes de o certificado ser emitido e "aprovado" pela CA e não poder ser alterado agora, enquanto a escolha "temporária" do ECDHE é feita pelo código ou pela configuração do servidor. Se a curva "temp" ou a curva cert quando o certificado é ECC não estiver na lista permitida pelo cliente, o ECDHE ou o ECDHE-ECDSA não poderão ser negociados.

Em vez de configurar antecipadamente, o servidor pode definir um retorno de chamada chamado pela biblioteca OpenSSL para escolher a curva (ou chave) ECDHE para um determinado handshake. Isso deve escolher uma curva aceitável para o cliente, a menos que isso seja inaceitável para o servidor. Novamente para ECDHE-ECDSA, a curva no certificado para autenticação pode ser diferente, já foi escolhida antes da emissão e não pode ser alterada, e se não for aceitável para o cliente não pode ser negociada. Finalmente, novo em 1.0.2 , há uma opção para o OpenSSL escolher automaticamente uma curva ECDHE aceitável para o cliente enquanto "corresponde" à força da autenticação.

No servidor para ECDH estático , a curva (e chave) usada para troca de chaves é a do certificado, que foi escolhida antes do certificado ser emitido e não pode ser alterado. Se essa curva não for aceitável para o cliente, o ECDH não poderá ser negociado.

    
por 08.05.2015 / 08:31
2

Is there a possibility or command in openssl to force a server to use a specific elliptic curve

Em geral, não sei como fazer isso através de um arquivo CONF. As chamadas da API SSL_CONF_* (mostradas abaixo) parecem indicar que ela pode fazer parte de um arquivo de configuração. Mas eu nunca fiz isso.

How to force a server to use a specific elliptic curve at the beginning of the handshake via openssl?

Você pode, mas precisa modificar suas fontes. Aqui está um dos desenvolvedores OpenSSL em um email privado. Mas não tenho certeza se funciona na prática porque uso o método de correção descrito abaixo.

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);

Para o 1.0.1 e abaixo, você pode modificar as fontes para t1_lib.c . Em particular, encontre ssl_prepare_clienthello_tlsext e pref_list e mude para o que você gosta. Aqui está o que parece por padrão:

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) */
 };

Veja também Problema nº 3179: Solicitação de recurso: defina uma lista de preferências para Curvas EC no Cliente .

Para o OpenSSL 1.0.2 e superior, você pode usar SSL_CTX_set1_curves . pref_list não está mais presente quando as fontes são usadas.

    
por 12.05.2015 / 00:13

Tags