2016-06-04 26 views
7

Quindi questo è il codice del mio server ssl Java. ctx è un SSLContext inizializzato con il keystore del server.Il server SSL Java disabilita le curve ellittiche deboli

public SSLEngine createSSLEngine() { 

     SSLEngine sslEngine = ctx.createSSLEngine(); 

     String[] ciphersuites = new String[]{ 
       "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", 
       "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", 
       "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", 
       "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", 
       "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", 
       "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", 
       "TLS_EMPTY_RENEGOTIATION_INFO_SCSV" 
     }; 

     sslEngine.setEnabledCipherSuites(ciphersuites); 

     sslEngine.setUseClientMode(false); 

     return sslEngine; 
    } 

ho provato con cipherscan (https://github.com/jvehent/cipherscan), i ciphersuites guardare bene, ma il server supporta tutte le possibili curve ellittiche (sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, secp192k1, prime192v1, secp224k1, secp224r1, secp256k1, prime256v1, secp384r1, secp521r1).

C'è un modo per disabilitare tutte le curve, tranne quelle forti come secp384r1?

risposta

0

Ho lo stesso problema. Qui ci sono i miei risultati, che solo in parte risolvono il problema:

  1. TLS con curve ellittiche sono basate su RFC 3546 (estensioni TLS) e RFC 4492 (estensione TLS per le curve ellittiche)
  2. Java implementa queste estensioni in com.sun.security.ssl.HelloExtension (che elenca tutte le estensioni) e com.sun.security.ssl.SupportedEllipticCurves (che è l'estensione della curva ellittica che fornisce un elenco di curve consentite)
  3. Purtroppo queste classi sono incluse nella JVM e sembra che non ci sia modo di modificare l'elenco con un parametro. :(
  4. Ho letto un rapporto di bugfix che sarà incluso in Java 9.1, che può includere una funzionalità di configurazione. Così il 2018, immagino?

Ignorando le licenze di OpenJDK (eccezione GPLv2 + Classpath) e Oracle JDK (qui: Java Environment Binary License) per un momento, ecco un modo per risolvere tecnicamente il problema:

  1. prendere il codice dal OpenJDK, ad esempio, la classe com.sun.security.ssl.SupportedEllipticCurves
  2. modificare di conseguenza (l'elenco dei gli ID delle curve sono disponibili in com.sun.ec.CurveDB.java)
  3. compilare un barattolo
  4. utilizzare Xbootclasspath:prepend per caricare la classe con l'elenco di curve modificato e ignorare quello di JVM.

e poi c'è la questione di licenza ...

Per esempio, molo-alpn-agente lo sta facendo. Ed è messo sotto l'eccezione GPLv2 + pure. Non sono un avvocato ma penso che potresti creare un progetto open-source, fare la tua cosa, metterlo sotto l'estensione GPLv2 +, quindi usarlo.

6

A partire da Java8 u121 è possibile configurare la curva ellittica da utilizzare.

utilizzare un parametro a VM di avvio del programma cioè .:

-Djdk.tls.namedGroups="secp521r1, secp256r1, secp256k1" 

O se si vuole una politica di vasta JDK/JRE alterano il file java.security e aggiungere la proprietà. cioè:

-jdk.tls.namedGroups="secp521r1, secp256r1, secp256k1" 

come riferimento vedi: http://www.oracle.com/technetwork/java/javase/8u121-relnotes-3315208.html paragrafo "Migliorare la forza di default di CE in JDK"