Bir Java uygulamasından üçüncü taraf API'ye yapılan bir çağrıyla biraz sıkıntı yaşıyorum. Harici API, aşağıdaki şifrelerden en az birini gerektirir:

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

Buradaki talimatları takip ettim: https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.html Uygulama sunucumdaki mevcut şifreleri yükseltmeyi denemek için. Ancak yükseltmeden sonra, listelenen uyumlu şifrelerin hiçbirini hala göremiyorum.

Sorunun sunucumun jdk 1.7 çalıştırdığından şüpheleniyorum. Bu eski bir uygulamadır, dolayısıyla ne yazık ki daha yeni bir jdk'ye yükseltemiyorum. Bu şifreleri mevcut Java kurulumuma eklemenin bir yolu var mı?

answer

(1) Söz konusu web sayfası 2014 tarihli; Sınırsız ilke, 2017'den sonra Oracle Java sürümleri için artık hiç kullanılmamaktadır ve bundan önce (örneğin 7u80'di) yalnızca 128 bit üzerindeki simetrik şifreleme için önemliydi ve burada AES128'i değil yalnızca AES256 süitlerini etkilerdi. ( OpenJDK için hiçbir zaman geçerli değildi, ancak 8'in altındaki OpenJDK çoğunlukla yalnızca RedHat ve Debian gibi bina ve paketleme için personel tahsis edebilen büyük Linux dağıtımlarında mevcuttu/mevcuttu; hangisini kullandığınızı söylemiyorsunuz.)

(2) Java (1.)7 , gösterdiğiniz CBC şifre takımlarını destekler (GCM olanları değil ve 7u171'in altındaki Oracle sürümleri için AES256'lar sınırsız politika gerektirir) ancak YALNIZCA TLS1.2 kullanıldığında (bu şifre takımları mevcut değildi) alt sürüm protokollerinde) ve varsayılan olarak j7, istemci tarafında TLS1.2'yi (ve 1.1) devre dışı bırakır.

Bu API'ye bağlantıyı HttpsURLConnection(örneğin new URL("https://something").openConnection()) ile açıkça yapıyorsanız , soketi kullanmak için SSLContext.getInstance("TLSv1.2")ve/veya açıkça setEnabledProtocolssoket üzerinde ayarlayabilirsiniz . Apache HttpComponents gibi başka bir ara katman yazılımı kullanıyorsanız, genellikle benzer yöntemler vardır, ancak bunlar ayrıntılarda farklılık gösterir; bize kodu göstermeniz gerekecek ve bu muhtemelen burada değil StackOverflow'a ait olacaktır. Bağlantıyı dahili olarak yapan bir kitaplığı arıyorsanız, seçenekleri olabilir veya olmayabilir. Gibi tüm veya birçok arama yöntemleri için, sen varsayılan değiştirebilir SSLContext.setDefault()veya HttpsURLConnection.setDefaultSSLSocketFacfory() eğer bu varsayılan ilgili kodunda geçersiz değildir ve yapım böyle küresel bir değişiklik aynı JVM çalışan başka bir şey için bela oldu yapmaz.

Alternatif olarak (ve konuyla ilgili daha fazlası!) Yeterince yeni bir j7 güncellemeniz varsa, jdk.tls.client.protocolsörneğin TLSv1,TLSv1.1,TLSv1.2varsayılanı kod değişikliği olmadan değiştirmek için ayarlayabileceğiniz sistem özelliğini geri yüklediklerinden oldukça eminim (ancak yine yalnızca geçersiz kılınmamışsa ve değiştirilmemişse). başka bir şeye zarar vermek). Bunun tam olarak ne zaman olduğunu hatırlamıyorum ama kesinlikle 7u80'den sonra, bu yüzden sadece ücretli Oracle desteği veya ödemeli veya ödemesiz başka biri tarafından desteklenen OpenJDK ile elde edersiniz. Yani denemek ve kolay olabilir çalışır.