Score:0

จะเพิ่ม Cipher Suites ให้กับ Java Application Server ได้อย่างไร?

ธง kz

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

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 เพื่อพยายามอัปเกรดรหัสที่มีอยู่บนเซิร์ฟเวอร์แอปพลิเคชันของฉัน หลังจากการอัปเกรด แต่ฉันยังไม่เห็นรายการรหัสที่เข้ากันได้

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

อัปเดต: ฉันรู้วิธีเพิ่มรหัสลับเพิ่มเติม แต่ดูเหมือนจะไม่ได้ช่วยอะไร ในโรงงานซ็อกเก็ตของฉันฉันได้เพิ่มโค้ดดังนี้:

ซ็อกเก็ตส่วนตัวยอมรับเฉพาะ TLS12 (ซ็อกเก็ตซ็อกเก็ต) {
        ถ้า (!(อินสแตนซ์ของซ็อกเก็ต SSLSocket))
            ซ็อกเก็ตกลับ
        SSLSocket sslSocket = ซ็อกเก็ต (SSLSocket);
        sslSocket.setEnabledProtocols (สตริงใหม่ [] { "TLSv1.2" });
        รายการ<String> รหัส = ใหม่ ArrayList<String>(Arrays.asList(sslSocket.getEnabledCipherSuites()));
        ciphers.add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256");
        sslSocket.setEnabledCipherSuites(ciphers.toArray(สตริงใหม่[] {}));
        กลับ sslSocket;
    }

มีขั้นตอนอื่นที่ฉันขาดหายไปหรือไม่? มีวิธีใดบ้างในการรับข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่การจับมือ ssl ล้มเหลว

kz flag
@Robert คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหม? เซิร์ฟเวอร์การยกเลิก TLS ภายนอกคืออะไร
in flag
https://en.wikipedia.org/wiki/TLS_termination_proxy
in flag
การย้ายจาก Java 7 เป็น 8 ไม่ใช่เรื่องใหญ่เท่าที่ฉันจำได้ คุณได้ลองทำให้มันทำงานบน Java 8 แล้วหรือยัง? นอกจากนั้น คุณยังสามารถใช้วิธีการยกเลิกพร็อกซีภายนอกได้ ให้ใช้เว็บเซิร์ฟเวอร์ที่ทันสมัย ​​เช่น nginx บนเครื่องเดียวกันที่ยุติการเชื่อมต่อ TLS และส่งต่อการเชื่อมต่อที่ไม่ได้เข้ารหัสไปยังเซิร์ฟเวอร์ Java จริง
kz flag
@Robert น่าเสียดายที่ฉันมี แอปพลิเคชันทำงานบน Jboss4 ซึ่งเล่นได้ไม่ดีกับ jdk เวอร์ชันใหม่กว่า
in flag
จากนั้นคุณต้องใช้ตัวเลือกเซิร์ฟเวอร์การยกเลิก TLS ภายนอก
Score:1
ธง jp

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

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

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

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

kz flag
@ dave_thompson_085 ฉันสามารถติดตั้งเวอร์ชันที่ใหม่กว่าของ jdk7 และเพิ่ม JCE jars ที่ไม่จำกัดความแรงได้ การเข้ารหัสที่จำเป็นบางส่วนมีให้บริการอย่างน้อยในขณะนี้ แต่ไม่ได้เปิดใช้งาน มีความคิดใดที่จะกำหนดค่ารหัสที่เปิดใช้งานโดย jdk?
Score:0
ธง kz

ในที่สุดฉันก็พบวิธีแก้ปัญหา ถ้าน่าเกลียดไปหน่อย ฉันสร้างสคริปต์ Groovy ที่สร้างคำขอ cURL ไปยัง API ภายนอก เนื่องจาก cURL สามารถใช้ใบรับรองล่าสุดได้ ฉันจึงสามารถหลีกเลี่ยงข้อจำกัดที่กำหนดโดยการติดอยู่กับ JDK แบบเก่า มันน่าเบื่อ แต่ก็ใช้งานได้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา