Какие Cipher Suites включить для SSL Socket?

Я использую SSLSocket Java для защиты связи между клиентом и серверной программой. Программа сервера также обслуживает HTTPS-запросы от веб-браузеров.

Согласно « Начало криптографии с Java », страница 371, вы всегда должны вызывать setEnabledCipherSuites на вашем SSLSocket / SSLServerSocket чтобы убедиться, что набор шифров, который заканчивается тем, что обсуждаются, достаточно силен для ваших целей.

При этом вызов метода getDefaultCipherSuites моего SSLSocketFactory дает около 180 опций. Эти параметры варьируются от TLS_RSA_WITH_AES_256_CBC_SHA (что, по моему мнению, достаточно безопасно) до SSL_RSA_WITH_RC4_128_MD5 (не так уверен, если это безопасно, учитывая текущий статус MD5) до SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA (не совсем уверен, что это делает).

Какой разумный список наборов шифров для ограничения сокетов?

Обратите внимание, что клиент и сервер имеют доступ к поставщику услуг Bouncy Castle и что они могут иметь или не иметь неограниченные файлы политики криптографии.

Не используйте ничего с экспортом. Это преступность из-за ограничений экспорта на сильную криптографию.

EDIT: Изменен для использования документа 2009 года.

В рекомендации 2009 года NIST перечислены следующие, включая TLS_RSA_WITH_AES_256_CBC_SHA (который вы упомянули):

TLS_RSA_WITH_NULL_SHA (не используйте это, если вы не уверены, что вам не нужна конфиденциальность / конфиденциальность).

 TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_DH_DSS_WITH_AES_128_CBC_SHA TLS_DH_RSA_WITH_AES_128_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_DH_DSS_WITH_AES_256_CBC_SHA TLS_DH_RSA_WITH_AES_256_CBC_SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA TLS_DHE_RSA_WITH_AES_256_CBC_SHA TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_RSA_WITH_AES_128_CBC_SHA TLS_ECDH_RSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_PSK_WITH_3DES_EDE_CBC_SHA TLS_PSK_WITH_AES_128_CBC_SHA TLS_PSK_WITH_AES_256_CBC_SHA TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA TLS_DHE_PSK_WITH_AES_128_CBC_SHA TLS_DHE_PSK_WITH_AES_256_CBC_SHA TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA TLS_RSA_PSK_WITH_AES_128_CBC_SHA TLS_RSA_PSK_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 

Ниже приведен class Java, который я использую для обеспечения шифрования наборов и протоколов. До SSLSocketFactoryEx я SSLSocketFactoryEx свойства на SSLSocket когда у меня был доступ к ним. Java-ребята из Stack Overflow помогли ему, поэтому его приятно разместить здесь.

SSLSocketFactoryEx предпочитает более сильные SSLSocketFactoryEx сюиты (например, ECDHE и DHE ), и он пропускает слабые и раненые шифрованные сюиты (например, RC4 и MD5 ). Он должен включить четыре транспортных шифрования ключа RSA для взаимодействия с Google и Microsoft, когда TLS 1.2 недоступен. Это TLS_RSA_WITH_AES_256_CBC_SHA256 , TLS_RSA_WITH_AES_256_CBC_SHA и двое друзей. Если возможно, вам следует удалить схемы protractorовки ключей TLS_RSA_* .

Перечислите список наборов шифров как можно меньше. Если вы рекламируете все доступные шифры (аналогично списку Flaschen), тогда ваш список будет 80+. Это занимает 160 байтов в ClientHello , и это может привести к сбою некоторых устройств, поскольку они имеют небольшой буфер фиксированного размера для обработки ClientHello . Сломанные устройства include F5 и Ironport.

На практике список в приведенном ниже коде соединен с 10 или 15 шифровыми наборами, как только предпочтительный список пересекается с поддерживаемыми Java-шифровыми наборами. Например, вот список, который я получаю при подготовке к подключению или на microsoft.com или google.com с неограниченной политикой JCE:

  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
  • TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DHE_DSS_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA

В списке отсутствуют слабые / раненые алгоритмы, такие как RC4 и MD5. Если они включены, тогда вы, вероятно, получите сообщение об устаревших криптографиях от браузера .

Список будет меньше по умолчанию по умолчанию, поскольку политика удаляет AES-256 и некоторые другие. Я думаю, что около 7 наборов шифров с ограниченной политикой.

Класс SSLSocketFactoryEx также обеспечивает протоколы TLS 1.0 и выше. Java-клиенты до Java 8 отключают TLS 1.1 и 1.2. SSLContext.getInstance("TLS") также будет скрываться в SSLv3 (даже в Java 8), поэтому необходимо предпринять шаги для его удаления.

Наконец, ниже приведен class TLS 1.3, поэтому он должен работать, когда поставщик делает их доступными. *_CHACHA20_POLY1305 предпочтительнее, если они доступны, потому что они намного быстрее, чем некоторые из существующих наборов, и у них лучшие свойства безопасности. Google уже развернул его на своих серверах. Я не уверен, когда Oracle предоставит их. OpenSSL предоставит им OpenSSL 1.0.2 1.1.0 .

Вы можете использовать его так:

 URL url = new URL("https://www.google.com:443"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); SSLSocketFactoryEx factory = new SSLSocketFactoryEx(); connection.setSSLSocketFactory(factory); connection.setRequestProperty("charset", "utf-8"); InputStream input = connection.getInputStream(); InputStreamReader reader = new InputStreamReader(input, "utf-8"); BufferedReader buffer = new BufferedReader(reader); ... 

 class SSLSocketFactoryEx extends SSLSocketFactory { public SSLSocketFactoryEx() throws NoSuchAlgorithmException, KeyManagementException { initSSLSocketFactoryEx(null,null,null); } public SSLSocketFactoryEx(KeyManager[] km, TrustManager[] tm, SecureRandom random) throws NoSuchAlgorithmException, KeyManagementException { initSSLSocketFactoryEx(km, tm, random); } public SSLSocketFactoryEx(SSLContext ctx) throws NoSuchAlgorithmException, KeyManagementException { initSSLSocketFactoryEx(ctx); } public String[] getDefaultCipherSuites() { return m_ciphers; } public String[] getSupportedCipherSuites() { return m_ciphers; } public String[] getDefaultProtocols() { return m_protocols; } public String[] getSupportedProtocols() { return m_protocols; } public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { SSLSocketFactory factory = m_ctx.getSocketFactory(); SSLSocket ss = (SSLSocket)factory.createSocket(s, host, port, autoClose); ss.setEnabledProtocols(m_protocols); ss.setEnabledCipherSuites(m_ciphers); return ss; } public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { SSLSocketFactory factory = m_ctx.getSocketFactory(); SSLSocket ss = (SSLSocket)factory.createSocket(address, port, localAddress, localPort); ss.setEnabledProtocols(m_protocols); ss.setEnabledCipherSuites(m_ciphers); return ss; } public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { SSLSocketFactory factory = m_ctx.getSocketFactory(); SSLSocket ss = (SSLSocket)factory.createSocket(host, port, localHost, localPort); ss.setEnabledProtocols(m_protocols); ss.setEnabledCipherSuites(m_ciphers); return ss; } public Socket createSocket(InetAddress host, int port) throws IOException { SSLSocketFactory factory = m_ctx.getSocketFactory(); SSLSocket ss = (SSLSocket)factory.createSocket(host, port); ss.setEnabledProtocols(m_protocols); ss.setEnabledCipherSuites(m_ciphers); return ss; } public Socket createSocket(String host, int port) throws IOException { SSLSocketFactory factory = m_ctx.getSocketFactory(); SSLSocket ss = (SSLSocket)factory.createSocket(host, port); ss.setEnabledProtocols(m_protocols); ss.setEnabledCipherSuites(m_ciphers); return ss; } private void initSSLSocketFactoryEx(KeyManager[] km, TrustManager[] tm, SecureRandom random) throws NoSuchAlgorithmException, KeyManagementException { m_ctx = SSLContext.getInstance("TLS"); m_ctx.init(km, tm, random); m_protocols = GetProtocolList(); m_ciphers = GetCipherList(); } private void initSSLSocketFactoryEx(SSLContext ctx) throws NoSuchAlgorithmException, KeyManagementException { m_ctx = ctx; m_protocols = GetProtocolList(); m_ciphers = GetCipherList(); } protected String[] GetProtocolList() { String[] preferredProtocols = { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" }; String[] availableProtocols = null; SSLSocket socket = null; try { SSLSocketFactory factory = m_ctx.getSocketFactory(); socket = (SSLSocket)factory.createSocket(); availableProtocols = socket.getSupportedProtocols(); Arrays.sort(availableProtocols); } catch(Exception e) { return new String[]{ "TLSv1" }; } finally { if(socket != null) socket.close(); } List aa = new ArrayList(); for(int i = 0; i < preferredProtocols.length; i++) { int idx = Arrays.binarySearch(availableProtocols, preferredProtocols[i]); if(idx >= 0) aa.add(preferredProtocols[i]); } return aa.toArray(new String[0]); } protected String[] GetCipherList() { String[] preferredCiphers = { // *_CHACHA20_POLY1305 are 3x to 4x faster than existing cipher suites. // http://googleonlinesecurity.blogspot.com/2014/04/speeding-up-and-strengthening-https.html // Use them if available. Normative names can be found at (TLS spec depends on IPSec spec): // http://tools.ietf.org/html/draft-nir-ipsecme-chacha20-poly1305-01 // http://tools.ietf.org/html/draft-mavrogiannopoulos-chacha-tls-02 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", "TLS_ECDHE_ECDSA_WITH_CHACHA20_SHA", "TLS_ECDHE_RSA_WITH_CHACHA20_SHA", "TLS_DHE_RSA_WITH_CHACHA20_POLY1305", "TLS_RSA_WITH_CHACHA20_POLY1305", "TLS_DHE_RSA_WITH_CHACHA20_SHA", "TLS_RSA_WITH_CHACHA20_SHA", // Done with bleeding edge, back to TLS v1.2 and below "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", // TLS v1.0 (with some SSLv3 interop) "TLS_DHE_RSA_WITH_AES_256_CBC_SHA384", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA", // RSA key transport sucks, but they are needed as a fallback. // For example, microsoft.com fails under all versions of TLS // if they are not included. If only TLS 1.0 is available at // the client, then google.com will fail too. TLS v1.3 is // trying to deprecate them, so it will be interesteng to see // what happens. "TLS_RSA_WITH_AES_256_CBC_SHA256", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA" }; String[] availableCiphers = null; try { SSLSocketFactory factory = m_ctx.getSocketFactory(); availableCiphers = factory.getSupportedCipherSuites(); Arrays.sort(availableCiphers); } catch(Exception e) { return new String[] { "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA256", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV" }; } List aa = new ArrayList(); for(int i = 0; i < preferredCiphers.length; i++) { int idx = Arrays.binarySearch(availableCiphers, preferredCiphers[i]); if(idx >= 0) aa.add(preferredCiphers[i]); } aa.add("TLS_EMPTY_RENEGOTIATION_INFO_SCSV"); return aa.toArray(new String[0]); } private SSLContext m_ctx; private String[] m_ciphers; private String[] m_protocols; } 
  • Heroku NodeJS http to https ssl принудительное redirect
  • Что происходит на проводе при настройке соединения TLS / LDAP или TLS / HTTP?
  • Как создать самозаверяющий сертификат для доменного имени для разработки?
  • Firefox: это соединение не доверено + За корпоративным брандмауэром
  • Установите сертификат SSL с ненадежного веб-сайта в оснастку «Сертификаты», используя IE
  • Как восстановить отсутствующий сертификат IIS Express SSL?
  • Предупреждение о соединении SSL при подключении к базе данных MySQL
  • Как проверяются сертификаты ssl?
  • Правильное закрытие SSLSocket
  • ssl.SSLError: версия протокола предупреждения tlsv1
  • Как узнать, был ли запрос на сервлет выполнен с использованием HTTP или HTTPS?
  • Interesting Posts

    Windows 7 Блокировка исполняемых файлов

    Почему в магазине Google Play говорится, что мое приложение для Android несовместимо с моим собственным устройством?

    Как изменить изображение плитки приложения современного интерфейса?

    Почему Тандерберд регулярно висит в течение 10 секунд

    Каковы рекомендации по созданию защищенных паролей?

    Измените файл, помеченный как «системный файл», на «нормальное» состояние в Windows 7

    Как загрузить и сохранить изображение с помощью Google App Engine (java)

    Настройка порта демона Docker для включения API-интерфейсов Docker

    Что заставляет Android ContentResolver.query () вернуть null?

    Удаление шпионских / вредоносных программ Delta – Невозможно установить / запустить что-либо

    Могу ли я загрузить UIImage из URL-адреса?

    CSS3 Цепная анимация

    Разница между ‘struct’ и ‘typedef struct’ в C ++?

    Обнаружить версию целевой рамок во время компиляции

    Как я должен писать стандартные стандартные и удаленные операторы ISO C ++ Standard?

    Давайте будем гением компьютера.