2017-01-30 17 views
1

У меня есть приложение Java 8, повышающий следующее исключение при подключении LDAPS или сервер https:Неподдерживаемое кривая: 1.2.840.10045.3.1.7 на Java приложения

Caused by: javax.net.ssl.SSLHandshakeException: 
    Unsupported curve: 1.2.840.10045.3.1.7 

Мой клиент среда является:

Alpine Linux 3.5 on a Docker container 
OpenJDK 1.8.0_111 
Wildfly 10.1.0.Final 

я могу обойти эту проблему, если я подключаю от:

  • Альпийская Linux окно с помощью AES128-SHA шифра (TLSv1)
  • Контейнер с CentOS 7 вместо Alpine Linux 3.5 (все шифры работают)

Но всегда будет терпеть неудачу, если я подключаю от:

  • альпийский Linux ящику с помощью ECDHE-RSA-AES256- Шифрование GCM-SHA384 (TLSv1.2)

Есть ли что-то предлагаемое для решения этой проблемы на моей установке Alpine Linux?

+0

Дополнительная информация: curve: 1.2.840.10045.3.1.7 также известен как "secp256r1" или который также называется "P-256" по NIST. Он ** доступен ** в стандартной среде исполнения Java Java Runtime Environment с Java 7. –

ответ

5

TL, DR: OpenJDK 8 пакет от Alpine не поддерживает шифры, которые используют эллиптическую кривую, например ECDHE. Используйте -Dcom.sun.net.ssl.enableECC=false на Java-вариантах, чтобы любезно попросить OpenJDK не использовать такие шифры.

Это хороший Atlassian paper описывает, как перечислить все по умолчанию и доступные шифры из виртуальной машины Java, используя следующий код:

import java.util.Iterator; 
import java.util.Map; 
import java.util.TreeMap; 
import javax.net.ssl.SSLServerSocketFactory; 

public class Ciphers 
{ 
    public static void main(String[] args) 
     throws Exception 
    { 
     SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); 

     String[] defaultCiphers = ssf.getDefaultCipherSuites(); 
     String[] availableCiphers = ssf.getSupportedCipherSuites(); 

     TreeMap ciphers = new TreeMap(); 

     for(int i=0; i<availableCiphers.length; ++i) 
      ciphers.put(availableCiphers[i], Boolean.FALSE); 

     for(int i=0; i<defaultCiphers.length; ++i) 
      ciphers.put(defaultCiphers[i], Boolean.TRUE); 

     System.out.println("Default\tCipher"); 
     for(Iterator i = ciphers.entrySet().iterator(); i.hasNext();) { 
      Map.Entry cipher=(Map.Entry)i.next(); 

      if(Boolean.TRUE.equals(cipher.getValue())) 
       System.out.print('*'); 
      else 
       System.out.print(' '); 

      System.out.print('\t'); 
      System.out.println(cipher.getKey()); 
     } 
    } 
} 

Запуск этого кода на OpenJDK 8 из Alpine 3.5 не перечислите ECDHE шифра, на другая сторона этого же кода перечисляет несколько таких шифров из OpenJDK 8, установленных в окне CentOS 7.

По какой-то причине шифры, использующие эллиптическую кривую, отправляются клиентом на сервер в виде доступных шифров в приложении Wildfly. Вне Wildfly - например, java SomeClass или java -jar some.jar эти шифры не отправляются и связь работает. Это поведение можно наблюдать, добавляя -Djavax.net.debug=all в вариантах Java.

+0

У вас есть идеи, почему эллиптические кривые не поддерживаются нашей сборкой OpenJDK/IcedTea и как ее исправить? Мы не запретили это намеренно. –

+0

Они, вероятно, добавили поставщика JCA, который включил поддержку ECC, например, провайдера Bouncy Castle. Поставщик «Оракулов» является родным, а ECC является IP-минной зоной, где ** большинство ** патентов ушли в отставку. Но это могут быть причины не включать его. –

+0

@JakubJirutka См. Мой ответ ниже и связанный с ним альпийский дефект. Похоже, это будет разрешено в ближайшее время. –

0

Пакет openjdk8-jre-base Alpine Linux 3.5 8.111.14-r1 не включает библиотеку, которую ищет поставщик SunEC, но Alpine Linux 3.3 (8.92.14-r0) и 3.4 (8.111.14-r0) do (см. this package search). Для этого я открыл Alpine issue #6809.

Самый простой способ обойти это, вероятно, вернуться к Alpine 3.4. Кроме того, вы можете установить версию openjdk8-jre-base версии 3.4 в версии 3.5, но при этом вы можете столкнуться с некоторыми проблемами с зависимостями, если пойдет по этому маршруту.

Если вы хотите использовать пакет Alpine Linux 3.5, вы можете использовать приложение java для альтернативного провайдера JCE, например BouncyCastle.

Если вам не нужна криптография EC, вы можете отключить ее, но предупреждайте, что это не позволит вашему приложению использовать несколько общих наборов шифров PFS.