ฉันเจอปัญหาเล็กน้อยกับการเรียก API บุคคลที่สามจากแอปพลิเคชันจาวา API ภายนอกต้องมีอย่างน้อยหนึ่ง ciphers ต่อไปนี้:

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

ฉันทำตามคำแนะนำที่นี่: https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.htmlเพื่อพยายามอัพเกรด ciphers ที่มีอยู่บนเซิร์ฟเวอร์แอปพลิเคชันของฉัน หลังจากอัปเกรด แต่ฉันยังคงไม่เห็นรหัสที่เข้ากันได้ในรายการ

ฉันสงสัยว่าปัญหาคือเซิร์ฟเวอร์ของฉันใช้งาน jdk 1.7 นี่เป็นแอปพลิเคชันรุ่นเก่า โชคไม่ดีที่ฉันไม่สามารถอัปเกรดเป็น jdk ที่ใหม่กว่าได้ มีวิธีใดในการเพิ่มรหัสเหล่านั้นในการติดตั้งจาวาที่มีอยู่ของฉันหรือไม่?

answer

(1) หน้าเว็บนั้นลงวันที่ 2014; นโยบายไม่ จำกัด ไม่ได้ใช้เลยสำหรับ Oracle Java เวอร์ชันหลังจากปี 2017 และก่อนหน้านั้น (เช่น 7u80 เป็น) มีความสำคัญเฉพาะสำหรับการเข้ารหัสแบบสมมาตรมากกว่า 128 บิตซึ่งจะมีผลกับชุด AES256 เท่านั้น ไม่ใช่ AES128 (มันไม่เคยใช้ได้กับ OpenJDK แม้ว่า OpenJDK ที่ต่ำกว่า 8 ส่วนใหญ่จะใช้ได้เฉพาะบน Linux distros หลักๆ เช่น RedHat และ Debian ที่สามารถจัดสรรพนักงานสำหรับการสร้างและบรรจุภัณฑ์ คุณไม่ได้บอกว่าคุณกำลังใช้อะไรอยู่)

(2) Java (1) วันที่ 7 ไม่สนับสนุน ciphersuites CBC คุณแสดง (ไม่ได้คน GCM และสำหรับรุ่นออราเคิลด้านล่าง 7u171 คน AES256 ไม่จำเป็นต้องมีนโยบายไม่ จำกัด ) แต่เฉพาะเมื่อ TLS1.2ถูกนำมาใช้ (ciphersuites เหล่านี้ไม่ได้อยู่ ในโปรโตคอลเวอร์ชันที่ต่ำกว่า) และโดยค่าเริ่มต้น j7 จะปิดใช้งาน TLS1.2 (และ 1.1) ฝั่งไคลเอ็นต์

หากคุณกำลังเชื่อมต่อกับ API นี้อย่างชัดเจนด้วยHttpsURLConnection(เช่นnew URL("https://something").openConnection()) คุณสามารถปรับแต่ง socketfactory เพื่อใช้SSLContext.getInstance("TLSv1.2")และ/หรือsetEnabledProtocolsบนซ็อกเก็ตได้อย่างชัดเจนหากคุณกำลังใช้มิดเดิลแวร์อื่นๆ เช่น Apache HttpComponents มักจะมีวิธีการที่คล้ายกัน แต่มีรายละเอียดแตกต่างกันออกไป คุณจะต้องแสดงรหัสให้เราดู และนั่นอาจเป็นของ StackOverflow ไม่ใช่ที่นี่ หากคุณกำลังเรียกไลบรารี่ที่ทำการเชื่อมต่อภายใน ไลบรารีนั้นอาจมีตัวเลือกหรือไม่ก็ได้ สำหรับวิธีการโทรทั้งหมดหรือหลายวิธี คุณสามารถเปลี่ยนค่าเริ่มต้นได้ เช่นSSLContext.setDefault()หรือHttpsURLConnection.setDefaultSSLSocketFacfory() หากค่าเริ่มต้นเหล่านี้ไม่ถูกแทนที่ในโค้ดที่เกี่ยวข้องและทำการเปลี่ยนแปลงทั่วโลกในลักษณะที่ไม่ก่อให้เกิดปัญหากับสิ่งอื่นที่ทำงานอยู่ใน JVM เดียวกันของคุณ

อีกทางหนึ่ง (และเพิ่มเติมในหัวข้อ!) หากคุณมีการอัปเดต j7 ล่าสุดเพียงพอ ฉันค่อนข้างแน่ใจว่าพวกเขา backport คุณสมบัติของระบบjdk.tls.client.protocolsซึ่งคุณสามารถตั้งค่าได้ เช่นTLSv1,TLSv1.1,TLSv1.2ให้เปลี่ยนค่าเริ่มต้นโดยไม่มีการเปลี่ยนแปลงโค้ด (แต่อีกครั้งเท่านั้น ถ้าไม่ถูกแทนที่และไม่แทนที่ เสียหายอย่างอื่น) ฉันจำไม่ได้ว่าเมื่อใด แต่หลังจาก 7u80 แน่นอน ดังนั้นคุณจะได้รับมันเฉพาะกับการสนับสนุน Oracle แบบชำระเงินหรือ OpenJDK ที่คนอื่นสนับสนุนโดยมีหรือไม่มีการจ่ายเงิน ง่ายที่จะลองและอาจใช้งานได้