2015-03-10 6 views
1

Мы пытаемся заставить TLS1.2 работать в режиме FIPS в следующей среде. При попытке записи в SSLSocket, созданный с помощью SSLContext для протокола «TLSv1.2», он выходит из строя с ошибкой java.security.NoSuchAlgorithmException: нет такого алгоритма: SunTls12RsaPremasterSecret для поставщика SunPKCS11-NSS.Работает ли TLS1.2 с NSS в режиме FIPS с использованием JSSE, настроенного с помощью поставщика SunPKCS11-NSS?

Среда:

  • Java: OpenJDK 1.8.0_25-b17 (клиент и сервер)
  • ОС: CentOS версии 6.5 (Final)
  • NSS: NSS-3.16.2.3-3. el6_6.x86_64
  • Режим FIPS включен в хранилище ключей с использованием modutil.

Я считаю, что ответ НЕТ, TLS1.2 не работает с NSS 3.16+ в режиме FIPS. Мне нужно, чтобы определить, решительно:

  • это, как ожидается, работать ли, и поэтому я должен продолжать копать, чтобы выяснить, что мы делаем неправильно (в этом случае указатели и идеи, чтобы сделать эту работу запрашиваются) или
  • она не поддерживается, и поэтому я должен ожидать, что она будет поддерживаться в будущем, которые NSS версия

Вот доказательства, собранные до сих пор:

  1. ошибка, которая происходит ш При попытке использовать TLS1.2 есть java.security.NoSuchAlgorithmException: нет такого алгоритма: SunTls12RsaPremasterSecret для провайдера SunPKCS11-NSS. Аналогичное сообщение об ошибке отключено in this post, с указанием, что это означает, что TLS 1.2 не поддерживается.
  2. Проверка FIPS NSS в последний раз была выполнена в 2010 году по версии NSS 3.12.14. Поддержка TLS1.2 не упоминается ни в каких выпусках NSS до 3.15.1. A related question is posted here, но нет особого упоминания о TLSv1.2.
  3. CentOS 6.5 release notes указывает, что поддерживаются режим FIPS и TLS1.2, но не упоминается, поддерживаются ли оба одновременно.
  4. Наши тесты с использованием TLS1.2 SSLContext (клиент и сервер) работают, когда система НЕ находится в режиме FIPS. Выполнение одного и того же теста после запуска modutil -fips истинно приводит к описанной ошибке и выход консоли, представленным ниже.

Соответствующий выход javax.net.debug следующим образом:

 
*** ClientHello, TLSv1.2 
RandomCookie: GMT: 1409235389 bytes = { 122, 104, 164, 187, 130, 152, 6, 95, 250, 230, 146, 99, 164, 228, 116, 203, 188, 51, 48, 140, 196, 35, 87, 33, 228, 67, 15, 120 } 
Session ID: {} 
Cipher Suites: [TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 
Compression Methods: { 0 } 
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA 
*** 

TRIMMED 

%% Negotiating: [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA256] 
*** ServerHello, TLSv1.2 
RandomCookie: GMT: 1409235389 bytes = { 217, 13, 11, 142, 204, 139, 77, 178, 239, 246, 177, 116, 225, 208, 217, 77, 128, 106, 206, 72, 40, 229, 46, 232, 54, 172, 74, 41 } 
Session ID: {84, 255, 58, 189, 125, 207, 159, 166, 144, 6, 19, 157, 173, 113, 80, 88, 204, 69, 101, 231, 227, 242, 144, 59, 174, 147, 158, 65, 14, 78, 182, 52} 
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 
Compression Method: 0 
Extension renegotiation_info, renegotiated_connection: 
*** 
Cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 

TRIMMED 

*** ServerHelloDone 
[read] MD5 and SHA1 hashes: len = 4 
0000: 0E 00 00 00          .... 
Thread-0, handling exception: javax.net.ssl.SSLKeyException: RSA premaster secret error 
%% Invalidated: [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA256] 

12:41:01.684 [Thread-0] ERROR c.p.p.c.i.SslContextTestContainer - unexpected Exception 
javax.net.ssl.SSLKeyException: RSA premaster secret error 
    at sun.security.ssl.RSAClientKeyExchange.(RSAClientKeyExchange.java:86) ~[na:1.8.0_25] 
    at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:880) ~[na:1.8.0_25] 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:344) ~[na:1.8.0_25] 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:936) ~[na:1.8.0_25] 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:871) ~[na:1.8.0_25] 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1043) ~[na:1.8.0_25] 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343) ~[na:1.8.0_25] 
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:728) ~[na:1.8.0_25] 
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) ~[na:1.8.0_25] 
    at java.io.OutputStream.write(OutputStream.java:75) ~[na:1.8.0_25] 
    at com.polycom.pillars.certificate.internal.SslContextTestContainer$ClientThread.doit(SslContextTestContainer.java:193) ~[bin/:na] 
    at com.polycom.pillars.certificate.internal.SslContextTestContainer$SslConnectionThread.run(SslContextTestContainer.java:127) ~[bin/:na] 
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: SunTls12RsaPremasterSecret for provider SunPKCS11-NSS 
    at sun.security.jca.GetInstance.getService(GetInstance.java:101) ~[na:1.8.0_25] 
    at javax.crypto.JceSecurity.getInstance(JceSecurity.java:109) ~[na:1.8.0_25] 
    at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:287) ~[na:1.8.0_25] 
    at sun.security.ssl.JsseJce.getKeyGenerator(JsseJce.java:274) ~[na:1.8.0_25] 
    at sun.security.ssl.RSAClientKeyExchange.(RSAClientKeyExchange.java:77) ~[na:1.8.0_25] 

ответ

0

Исключение приходят, так как сервер все еще пытается вести переговоры в TLS1.2 даже если он не поддерживается поставщиком NSS. Чтобы избежать этого исключения и приступить к использованию TLS1.1, добавьте следующие строки в java.security.

jdk.tls.disabledAlgorithms = SSLv3, TLSv1.2