Como gerar novos parâmetros Diffie-Hellman de 2048 bits com o Java keytool?

8

Somos não-especialistas tentando - sem sucesso até agora - atualizar as configurações do nosso servidor web (JBoss-5.1.0.GA) para atender aos padrões Diffie-Hellman. Depois de executar um teste no link , somos informados de que precisamos "gerar novos parâmetros Diffie-Hellman de 2048 bits". No passado, geramos chaves com o keytool Java, mas não conseguimos encontrar informações sobre como gerar um novo parâmetro Diffie-Hellman de 2048 bits com o keytool Java. Alguém sabe como fazer isso ou pode nos apontar na direção certa? Obrigada!

    
por user2072931 14.09.2015 / 15:51

3 respostas

12

Você não pode fazer isso com o keytool. Primeiro, keytool não suporta DH. Segundo, keytool não gera parâmetros por si só para qualquer algoritmo, apenas uma chave privada / par de chaves. Terceiro, quando keytool gera um par de chaves, ele também gera um certificado auto-assinado (que às vezes é subsequentemente substituído por um certificado "real" emitido por CA) e é impossível gerar um certificado autoassinado para DH porque o DH não assina. Você poderia escrever um programa Java muito simples (cerca de 10 linhas) para gerar parâmetros DH. Mas provavelmente não faria bem a você porque:

O Java não aceita parâmetros DHE aqui mesmo. O JbossWS (o servidor Jboss, depois Wildfly) é um fork do Tomcat e normalmente usa a implementação Java de SSL / TLS, JSSE. Através do Java 7, o JSSE usa seus próprios parâmetros DHE, que são de 768 bits, o que é inaceitavelmente fraco. (Exceto para as suítes EXPORT onde o JSSE obedece ao requisito RFC para o DH-512, que é totalmente quebrado, mas os conjuntos EXPORT são por design totalmente quebrados de qualquer maneira e desativados por padrão no Java 7.) O Java 8 JSSE permite que você controlar o tamanho dos parâmetros DHE, mas não o valor real.

Suas opções (algumas sobrepostas) são:

Use Java 8. JSSE no Java 8, mas não antes, padrão DHE para 1024 bits, que a maioria das autoridades considera strong o suficiente mesmo que weakdh.org não, e permite que você especifique mais, consulte link e para o plano de fundo link . Observe que, se você tiver quaisquer clientes Java antes do Java 8, eles falharão se o servidor utilizar DHE acima de 1024 bits. Não conheço nenhum outro cliente que tenha esse problema, mas teste o seu antes de se comprometer com essa alteração.

Ative o ECDHE. O JSSE no Java 7 e posterior implementa o ECDHE, que não está sujeito a pré-computação como o DHE (normalmente) usando o P-256, que é mais do que suficiente. (Embora algumas pessoas não confiem nenhuma das curvas NIST ECC, porque o NIST, em geral, é influenciado pela NSA, embora nenhuma fonte aberta que conheça tenha mostrado um problema específico nas curvas ECC.) Java 6 na verdade tem a parte JSSE para o ECDHE, mas ela só é ativada se a JVM tiver um "provedor" de criptografia para primitivos ECC, o que o Java 6 não possui. O bcprov - * - jdk15on do link é um provedor JCE para uma variedade de primitivos criptográficos Java, incluindo ECC, portanto, se você adicionar o jar ao seu JRE/lib/ext e adicione org.bouncycastle.jce.provider.BouncyCastleProvider à lista em JRE/lib/security/java.security (ou faça um Security.add/insertProvider() adequado em algum lugar no início do seu código) O Java 6 pode fazer o ECDHE. Claro, se você deveria ter algum Java 6 ainda em uso, é uma questão por si só.

Há alguns anos, o suporte para o ECDHE em navegadores e outros clientes era duvidoso, mas hoje em dia todos os navegadores atuais da AFAIK o suportam e o preferem ao DHE - ou seja, o navegador ola lista os pacotes ECDHE antes dos conjuntos DHE para que, se o servidor implementar ambos, escolha ECDHE. Clientes não-navegadores talvez não; teste para ter certeza.

Desative o DHE. Você pode configurar a lista de cifras no atributo Conector para excluir as cifras DHE; enquanto você está nisso, também exclui staticDH e staticECDH que são inúteis e (single) DES e (all) "EXPORT" se presente (Java 6). Isso significa que os navegadores e clientes que não fazem o ECHDE ficarão presos com o RSA simples e sem o Forward Scripting, mas pelo menos terão sigilo "atual". Não me lembro com certeza, mas acho que a configuração do 5.1 Connector ainda estava em algum lugar como $server/deploy/jbossweb/server.xml .

Tente nativo. Tomcat, que como eu disse que o JbossWS começou, tem uma opção para implementar HTTPS (SSL / TLS) usando "nativo" aka "APR" que na verdade é OpenSSL em vez de JSSE . Tive muito sucesso ao obter essa opção para trabalhar no JbossWS e não me lembro de 5.1. Se seu JbossWS tiver uma opção nativa de TC trabalhável, e se puder manipular a configuração dos parâmetros DH, use openssl para gerar os parâmetros DH e as instruções nativas do JbossWS para configurar eles.

    
por 14.09.2015 / 21:20
3

Eu tenho passado por esse mesmo problema, mas da Glassfish.

Em primeiro lugar, recomendo (se puder) colocar algum tipo de proxy reverso na frente do seu servidor JBoss, pois ele removerá o link entre a segurança de criptografia / certificado e a versão do Java que você está executando.

Para obter um tamanho de chave Ephemeral DH maior que 768 bits, você precisa estar executando no Java 8. 1024 é o novo padrão, e você pode ir até 2048 usando jdk.tls.ephemeralDHKeySize (detalhes: personalizar as chaves DH ). Pelo que pude encontrar, não há nenhum conceito de regenerar os parâmetros chave separadamente em Java.

    
por 14.09.2015 / 21:04
3

Na verdade, você pode especificar parâmetros DHE personalizados com versões recentes do Java 8 . Isso é independente do aplicativo (desde que ele esteja usando a implementação JSSE TLS).

Primeiro, você precisa especificar o tamanho da chave DHE a ser usada ( -Djdk.tls.ephemeralDHKeySize=1024 ou -Djdk.tls.ephemeralDHKeySize=2048 ). No servidor, isso usará uma combinação gerador / primária predefinida para o DHE. Com o Java 8, apenas 1024 ou 2048 podem ser usados, o JDK 9 suportará tamanhos maiores .

Se você quiser fornecer uma combinação diferente, poderá especificá-los em jre / lib / security / Java.security com a propriedade jdk.tls.server.defaultDHEParameters security (desde 8u51). Ele pega uma lista de parâmetros (um para cada tamanho de chave usado) e deve conter o primo e o gerador (normalmente 2 ou 5) como hexadecimais.

Se você usou openssl dhparam -out dhparam2048.pem 2048 para gerar um novo par, use openssl dhparam -noout -text -check -in dhparam2048.pem para ler e imprimir esse arquivo no modo de texto. Você terá que copiar e colar o texto nas propriedades de segurança do Java (usando tr -d ':' para remover o : entre a representação hexa openssl)

Aqui está uma amostra (apenas 1024 bis):

>openssl dhparam -in p -check -text -noout | tr -d ':'
PKCS#3 DH Parameters: (1024 bit)
    prime:
       00f7a63b59edcc43a43df12077f0e9
        14129c20a73cef95f919896e608ebc
        8722776c948765bbbf61542e118329
        6c6ea74ecbded3a93aff77a062aba4
        fcf04fc01030e65077f5a802605058
        65b836368dd5ea389d77691fac0f2c
        f7a161c51c8e97ddecb3cf7f872b0c
        cfaf54373d5203edcabc575e871bb1
        107ec2f30c78ebf403
    generator: 2 (0x2)
DH parameters appear to be ok.

E isso resulta em

jdk.tls.server.defaultDHEParameters= \
    { \
        00f7a63b59edcc43a43df12077f0e9 \
        14129c20a73cef95f919896e608ebc \
        8722776c948765bbbf61542e118329 \
        6c6ea74ecbded3a93aff77a062aba4 \
        fcf04fc01030e65077f5a802605058 \
        65b836368dd5ea389d77691fac0f2c \
        f7a161c51c8e97ddecb3cf7f872b0c \
        cfaf54373d5203edcabc575e871bb1 \
        107ec2f30c78ebf403, 2 }

Você deve reiniciar o Servidor e verificar se ele realmente usa este primo (e não os padrões), já que o processo não é direto, então muita coisa pode dar errado. O padrão é definido na fonte , para 2048 bits, o primo é do rascunho TLS FFDHE.

Por exemplo, ao executar o openssl s_client, eu posso ver o tamanho de 1024 bits ( ffffff ffffffffffc90f ... 5381ffffffffffffffff ) ao se conectar a um servidor Java 8 JSSE:

>openssl s_client -msg -cipher DHE-RSA-AES128-SHA256 -connect localhost:1234
...
<<< TLS 1.2 Handshake [length 018f], ServerKeyExchange
0c 00 01 8b 00 80 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
08 79 8e 34 04 dd ef 95 19 b3 cd 3a 43 1b 30 2b
0a 6d f2 5f 14 37 4f e1 35 6d 6d 51 c2 45 e4 85
b5 76 62 5e 7e c6 f4 4c 42 e9 a6 37 ed 6b 0b ff
5c b6 f4 06 b7 ed ee 38 6b fb 5a 89 9f a5 ae 9f
24 11 7c 4b 1f e6 49 28 66 51 ec e6 53 81 ff ff
ff ff ff ff ff ff 00 01 02 ...

Em vez disso, você deve ver seus parâmetros personalizados quando instalado.

Os Parâmetros Padrão para o Java 7 (768 bits) seriam "e9e642 ... 7a3daf" com um longo gerador "30470ad..529252" , conforme definido no ParameterCache .

    
por 20.08.2016 / 08:32