Puncte:0

Cum să adăugați suite de criptare suplimentare la un server de aplicații Java?

drapel kz

Mă întâlnesc puțin cu un apel către un API terță parte dintr-o aplicație java. API-ul extern necesită cel puțin unul dintre următoarele cifruri:

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
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

Am urmat instructiunile de aici: https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.html pentru a încerca să actualizez cifrurile disponibile pe serverul meu de aplicații. După actualizare, totuși, încă nu văd niciunul dintre cifrurile compatibile listate.

Bănuiesc că problema este că serverul meu rulează jdk 1.7. Aceasta este o aplicație moștenită, așa că, din păcate, nu pot face upgrade la un jdk mai nou. Există vreo modalitate de a adăuga acele cifruri la instalarea mea java existentă?

Actualizați: Mi-am dat seama cum să adaug cifruri suplimentare, dar nu pare să fi ajutat. În fabrica mea de prize am adăugat un cod ca acesta:

private Socket acceptOnlyTLS12(Socket socket) {
        dacă (!(instanță socket a SSLSocket))
            priză de retur;
        SSLSocket sslSocket = (SSLSocket) soclu;
        sslSocket.setEnabledProtocols(New String[] { "TLSv1.2" });
        List<String> cifruri = nou ArrayList<String>(Arrays.asList(sslSocket.getEnabledCipherSuites()));
        ciphers.add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256");
        sslSocket.setEnabledCipherSuites(ciphers.toArray(new String[] {}));
        returnează sslSocket;
    }

Mai este un pas pe care îl scapă undeva? Există vreo modalitate de a obține informații suplimentare despre motivul pentru care strângerea de mână ssl eșuează?

drapel kz
@Robert, poți detalia puțin despre asta? Ce este un server de terminare TLS extern?
drapel in
https://en.wikipedia.org/wiki/TLS_termination_proxy
drapel in
Migrarea de la Java 7 la 8 nu a fost mare lucru din câte îmi amintesc. Ai încercat să-l faci să ruleze pe Java 8? Pe lângă faptul că puteți utiliza în continuare metoda de terminare a proxy extern, utilizați un server web modern, cum ar fi nginx, pe aceeași mașină care încheie conexiunea TLS și transmite conexiunea acum necriptată către serverul Java real.
drapel kz
@Robert Din păcate, am. Aplicația rulează pe Jboss4, care nu se joacă bine cu versiunile mai noi ale jdk.
drapel in
Apoi trebuie să luați opțiunea serverului de terminare TLS extern.
Puncte:1
drapel jp

(1) Pagina web este datată 2014; politica nelimitată nu mai este folosită deloc pentru versiunile Oracle Java după 2017 și înainte de aceasta (care era de exemplu 7u80) conta doar pentru criptarea simetrică peste 128 de biți care aici ar afecta doar suitele AES256 nu pe cele AES128. (Era nu aplicabil la OpenJDK, deși OpenJDK sub 8 a fost/este disponibil în cea mai mare parte numai pe distribuțiile Linux majore, cum ar fi RedHat și Debian, care ar putea aloca personal pentru construirea și ambalarea; nu spui ce folosești.)

(2) Java (1.)7 face a sustine suitele de cifrare CBC pe care le afișați (nu cele GCM, iar pentru versiunile Oracle sub 7u171 cele AES256 necesită politică nelimitată), dar NUMAI când TLS1.2 este utilizat (aceste ciphersuites nu existau în protocoalele versiunii inferioare) și implicit j7 dezactivează TLS1.2 (și 1.1) client.

Dacă realizați în mod explicit conexiunea la acest API cu HttpsURLConnection (de exemplu. URL nouă ("https://ceva").openConnection()) puteți modifica socketfactory pentru a fi utilizat SSLContext.getInstance("TLSv1.2") și/sau în mod explicit setEnabledProtocols pe priză. Dacă utilizați alt middleware, de ex. Apache HttpComponents există de obicei metode similare, dar variază în detaliu; ar trebui să ne arăți codul și probabil că acesta ar aparține StackOverflow, nu aici. Dacă apelați o bibliotecă care face conexiunea intern, aceasta poate avea opțiuni sau nu. Pentru toate sau multe metode de apelare, puteți modifica valorile implicite, cum ar fi SSLContext.setDefault() sau HttpsURLConnection.setDefaultSSLSocketFacfory() dacă aceste valori implicite nu sunt suprascrise în codul relevant și efectuarea unei astfel de schimbări globale nu cauzează probleme pentru nimic altceva care rulează în același JVM.

Alternativ (și mai multe despre subiect!), dacă aveți o actualizare j7 suficient de recentă, sunt destul de sigur că au retroportat proprietatea sistemului jdk.tls.client.protocols pe care le-ați putea seta de ex. TLSv1,TLSv1.1,TLSv1.2 pentru a schimba valoarea implicită fără modificarea codului (dar din nou numai dacă nu este suprascris și nu dăunează la nimic altceva). Nu-mi amintesc exact când a fost asta, dar cu siguranță după 7u80, așa că l-ai avea doar cu suport Oracle plătit sau OpenJDK susținut de altcineva cu sau fără plată. Este ușor de încercat și Mai muncă.

drapel kz
@ dave_thompson_085 Am putut instala o versiune mai nouă a jdk7 și am adăugat borcanele JCE cu putere nelimitată. Unele dintre cifrurile necesare sunt cel puțin disponibile acum, dar nu sunt activate. Aveți idee cum să configurați ce cifruri sunt activate de jdk?
Puncte:0
drapel kz

Am găsit în sfârșit o soluție, chiar dacă puțin urâtă. Am creat un script groovy care face o solicitare cURL către API-ul extern. Deoarece cURL poate folosi cele mai recente certificate, pot ocoli limitările impuse de a fi blocat cu un vechi JDK. E neplăcut, dar funcționează.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.