วิธีสร้างพารามิเตอร์ Diffie-Hellman ใหม่ 2048 บิตด้วย Java keytool?


9

เราไม่ใช่ผู้เชี่ยวชาญที่พยายามจนถึงการอัปเดตการตั้งค่าเว็บเซิร์ฟเวอร์ของเรา (JBoss-5.1.0.GA) เพื่อให้เป็นไปตามมาตรฐานของ Diffie-Hellman หลังจากทำการทดสอบบนhttps://weakdh.org/sysadmin.htmlเราได้รับแจ้งว่าเราต้อง "สร้างพารามิเตอร์ Diffie-Hellman ใหม่ 2048 บิต" ในอดีตเราได้สร้างคีย์ด้วย Java keytool แต่เราไม่สามารถหาข้อมูลใด ๆ ในการสร้างพารามิเตอร์ Diffie-Hellman ใหม่ 2048 บิตด้วย Java keytool ไม่มีใครรู้วิธีการทำเช่นนี้หรืออาจชี้เราไปในทิศทางที่ถูกต้อง? ขอบคุณ!

คำตอบ:


13

คุณไม่สามารถทำเช่นนั้นกับ keytool ก่อนอื่นkeytoolไม่สนับสนุน DH เลย ประการที่สองkeytoolไม่ได้สร้างพารามิเตอร์ด้วยตนเองสำหรับอัลกอริทึมใด ๆ เพียงคีย์ส่วนตัว / คู่กุญแจ ข้อที่สามเมื่อkeytoolสร้าง keypair มันจะสร้างใบรับรองที่ลงนามด้วยตนเอง (ซึ่งบางครั้งก็ถูกแทนที่ด้วยใบรับรองที่ออกโดย CA จริงของตัวเอง) และเป็นไปไม่ได้ที่จะสร้างใบรับรองที่ลงนามเองสำหรับ DH เพราะ DH ไม่ลงชื่อ คุณสามารถเขียนโปรแกรม Java อย่างง่าย (ประมาณ 10 บรรทัด) เพื่อสร้างพารามิเตอร์ DH แต่มันอาจจะไม่ทำให้คุณดีเพราะ:

Java ไม่ยอมรับพารามิเตอร์ DHE ที่นี่ JbossWS (เว็บเซิร์ฟเวอร์ Jboss ต่อมา Wildfly) เป็นทางแยกของ Tomcat และโดยปกติจะใช้งาน Java ของ SSL / TLS, JSSE จนถึง Java 7 JSSE ใช้พารามิเตอร์ DHE ของตัวเองซึ่งเป็น 768 บิตซึ่งเป็นที่ยอมรับไม่ได้ (ยกเว้นสำหรับ EXPORT suites ที่ JSSE ปฏิบัติตามข้อกำหนด RFC สำหรับ DH-512 ซึ่งใช้งานไม่ได้ แต่จากนั้นชุด EXPORT จะถูกออกแบบโดยสิ้นเชิงโดยสิ้นเชิงและปิดใช้งานตามค่าเริ่มต้นใน Java 7 ขึ้นไป) Java 8 JSSE อนุญาตให้คุณ ควบคุมขนาดของพารามิเตอร์ DHE แต่ไม่ใช่ค่าจริง

ตัวเลือก (บางส่วนที่ทับซ้อนกัน) ของคุณคือ:

ใช้ Java 8 JSSE ใน Java 8 แต่ไม่ใช่ก่อนหน้านี้ใช้ค่าเริ่มต้น DHE ถึง 1024 บิตซึ่งเจ้าหน้าที่ส่วนใหญ่พิจารณาว่าแข็งแรงพอที่ถึงแม้ว่า weakdh.org จะทำไม่ได้และอนุญาตให้คุณระบุเพิ่มเติมดูhttps://docs.oracle.com /javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keysและพื้นหลัง/programming/30352105/how-to-set-custom-dh-group-in-java -sslengine โปรดทราบว่าหากคุณมีไคลเอนต์ Java ก่อน Java 8 พวกเขาจะล้มเหลวหากเซิร์ฟเวอร์ใช้ DHE มากกว่า 1024 บิต ฉันไม่รู้จักลูกค้ารายอื่นที่มีปัญหานี้ แต่ทดสอบลูกค้าของคุณก่อนที่จะยอมรับการเปลี่ยนแปลงนี้

เปิดใช้งาน ECDHE JSSE ใน Java 7 และใหม่กว่าใช้ ECDHE ซึ่งไม่อยู่ภายใต้การประมวลผลล่วงหน้าเช่น DHE (ปกติ) โดยใช้ P-256 ซึ่งแข็งแกร่งกว่าพอสมควร (แม้ว่าบางคนไม่เชื่อในเส้นโค้ง NIST ECC ใด ๆเพราะ NIST โดยทั่วไปได้รับอิทธิพลจาก NSA ถึงแม้ว่าไม่มีโอเพนซอร์สที่ฉันรู้ว่าได้แสดงปัญหาในเส้นโค้ง ECC โดยเฉพาะ) Java 6 มีส่วนของ JSSE สำหรับ ECDHE แต่จะเปิดใช้งานเฉพาะในกรณีที่ JVM มี "ผู้ให้บริการ" crypto สำหรับ primitives ECC ซึ่ง Java 6 ไม่ได้ bcprov - * - jdk15on จากhttp://www.bouncycastle.org/เป็นผู้ให้บริการ JCE สำหรับช่วงของการเข้ารหัสแบบดั้งเดิมของ Java crypto รวมถึง ECC ดังนั้นหากคุณเพิ่ม jar ลงในของคุณJRE/lib/extและเพิ่มลงorg.bouncycastle.jce.provider.BouncyCastleProviderในรายการในJRE/lib/security/java.security(หรือทำตามความเหมาะสมSecurity.add/insertProvider()เร็ว ๆ นี้ในโค้ดของคุณ) Java 6 สามารถทำ ECDHE ได้ แน่นอนว่าคุณควรใช้ Java 6 ใด ๆ ที่ยังใช้งานอยู่เป็นคำถามของตัวเอง

ไม่กี่ปีที่ผ่านมาการสนับสนุน ECDHE ในเบราว์เซอร์และไคลเอนต์อื่น ๆ นั้นไม่แน่นอน แต่วันนี้ AFAIK เบราว์เซอร์ที่ทันสมัยทั้งหมดสนับสนุนและต้องการ DHE - นั่นคือเบราว์เซอร์สวัสดีรายการ ECDHE suites ก่อน DHE suites ดังนั้น ถ้าเซิร์ฟเวอร์ใช้ทั้งสองอย่างก็ควรเลือก ECDHE ลูกค้าที่ไม่ใช่เบราว์เซอร์อาจไม่ได้; ทดสอบให้แน่ใจ

ปิดใช้งาน DHE คุณสามารถกำหนดค่ารายการของเลขศูนย์ในแอตทริบิวต์ตัวเชื่อมต่อเพื่อแยกรหัสแบบ DHE; ในขณะที่คุณอยู่ที่มันยังไม่รวม staticDH และ staticECDH ซึ่งไร้ประโยชน์และ (เดี่ยว) DES และ (ทั้งหมด) "EXPORT" ถ้ามี (Java 6) ซึ่งหมายความว่าเบราว์เซอร์และไคลเอนต์ที่ไม่ได้ทำ ECHDE จะติดอยู่กับ plain-RSA และไม่มีการส่งต่อความลับ แต่อย่างน้อยพวกเขาก็มีความลับ "ปัจจุบัน" ฉันจำไม่ได้แน่นอน แต่ฉันคิดว่า 5.1 ตัวเชื่อมต่อการกำหนดค่ายังคงอยู่ที่$server/deploy/jbossweb/server.xmlอื่น

ลองของพื้นเมือง Tomcat ซึ่งผมได้บอกว่า JbossWS เริ่มต้นมาจากมีตัวเลือกในการติดตั้ง HTTPS (SSL / TLS) โดยใช้ "native" aka "APR" ซึ่งจริงๆแล้วเป็น OpenSSL ภายในแทนที่จะเป็น JSSE ฉันประสบความสำเร็จในการนำตัวเลือกนี้ไปใช้กับ JbossWS และไม่จำประมาณ 5.1 หาก JbossWS ของคุณมีตัวเลือก TC-native ที่สามารถใช้งานได้และหากสามารถจัดการการกำหนดค่าพารามิเตอร์ DH ให้ใช้ openssl เพื่อสร้างพารามิเตอร์ DH และคำแนะนำ JbossWS แบบเนทีฟเพื่อตั้งค่า


ขอบคุณสำหรับข้อมูลที่ดีนี้ คำตอบสำหรับเราในท้ายที่สุดไม่เกี่ยวข้องกับ keytool เพียงการเปลี่ยนแปลงไปยังไฟล์ server.xml ของเรา แต่ฉันกำลังจะไปตรวจสอบคำตอบนี้
user2072931

4

ที่จริงคุณสามารถระบุพารามิเตอร์ที่กำหนดเอง DHE กับล่าสุด Java 8 รุ่น นั่นคืออิสระของแอ็พพลิเคชัน (ตราบใดที่มันใช้การประยุกต์ใช้ JSSE TLS)

ก่อนอื่นคุณต้องระบุขนาดของคีย์ DHE ที่จะใช้ ( -Djdk.tls.ephemeralDHKeySize=1024หรือ-Djdk.tls.ephemeralDHKeySize=2048) บนเซิร์ฟเวอร์จะใช้ตัวสร้าง / ชุดค่าผสมที่กำหนดไว้ล่วงหน้าสำหรับ DHE ด้วย Java 8 สามารถใช้ 1024 หรือ 2048 เท่านั้นJDK 9 จะรองรับขนาดที่ใหญ่ขึ้น

หากคุณต้องการจัดทำชุดค่าผสมที่แตกต่างกันคุณสามารถระบุค่าเหล่านั้นใน jre / lib / security / Java.security ด้วยjdk.tls.server.defaultDHEParametersคุณสมบัติความปลอดภัย (ตั้งแต่ 8u51) ต้องใช้รายการพารามิเตอร์ (หนึ่งรายการสำหรับแต่ละคีย์ที่ใช้) และจะต้องมีนายกและตัวสร้าง (โดยทั่วไปคือ 2 หรือ 5) เป็นเลขฐานสิบหก

หากคุณเคยopenssl dhparam -out dhparam2048.pem 2048สร้างคู่ใหม่คุณสามารถใช้openssl dhparam -noout -text -check -in dhparam2048.pemอ่านและพิมพ์ไฟล์นั้นในโหมดข้อความ คุณจะต้องคัดลอกและวางข้อความในคุณสมบัติความปลอดภัย Java (ใช้tr -d ':'เพื่อลบ:ระหว่างการเป็นตัวแทนของ openssl hex)

นี่คือตัวอย่าง (1024 bis เท่านั้น):

>openssl dhparam -in p -check -text -noout | tr -d ':'
PKCS#3 DH Parameters: (1024 bit)
    prime:
       00f7a63b59edcc43a43df12077f0e9
        14129c20a73cef95f919896e608ebc
        8722776c948765bbbf61542e118329
        6c6ea74ecbded3a93aff77a062aba4
        fcf04fc01030e65077f5a802605058
        65b836368dd5ea389d77691fac0f2c
        f7a161c51c8e97ddecb3cf7f872b0c
        cfaf54373d5203edcabc575e871bb1
        107ec2f30c78ebf403
    generator: 2 (0x2)
DH parameters appear to be ok.

และผลลัพธ์นี้ใน

jdk.tls.server.defaultDHEParameters= \
    { \
        00f7a63b59edcc43a43df12077f0e9 \
        14129c20a73cef95f919896e608ebc \
        8722776c948765bbbf61542e118329 \
        6c6ea74ecbded3a93aff77a062aba4 \
        fcf04fc01030e65077f5a802605058 \
        65b836368dd5ea389d77691fac0f2c \
        f7a161c51c8e97ddecb3cf7f872b0c \
        cfaf54373d5203edcabc575e871bb1 \
        107ec2f30c78ebf403, 2 }

คุณควรรีสตาร์ทเซิร์ฟเวอร์และตรวจสอบว่ามันใช้งานไพรม์นี้จริง ๆ (ไม่ใช่ที่เป็นค่าเริ่มต้น) เนื่องจากกระบวนการไม่ตรงไปข้างหน้าดังนั้นจึงมีข้อผิดพลาดเกิดขึ้นมากมาย ค่าเริ่มต้นถูกกำหนดไว้ในแหล่งที่มาสำหรับ 2048 บิตที่สำคัญมาจากร่าง TLS FFDHE

ตัวอย่างเช่นเมื่อใช้ openssl s_client ฉันสามารถเห็น 1024bit prime ( ffffff ffffffffffc90f ... 5381ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffice ) ตัวอย่างเช่นเมื่อเรียกใช้ openssl s_client ฉันสามารถดู 1024bit เฉพาะ ( ffffff ffffffffffc90f ... 5381ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffice ) ตัวอย่างเช่นเมื่อเรียกใช้ openssl s_client ฉันสามารถดู 1024bit เฉพาะ

>openssl s_client -msg -cipher DHE-RSA-AES128-SHA256 -connect localhost:1234
...
<<< TLS 1.2 Handshake [length 018f], ServerKeyExchange
0c 00 01 8b 00 80 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
08 79 8e 34 04 dd ef 95 19 b3 cd 3a 43 1b 30 2b
0a 6d f2 5f 14 37 4f e1 35 6d 6d 51 c2 45 e4 85
b5 76 62 5e 7e c6 f4 4c 42 e9 a6 37 ed 6b 0b ff
5c b6 f4 06 b7 ed ee 38 6b fb 5a 89 9f a5 ae 9f
24 11 7c 4b 1f e6 49 28 66 51 ec e6 53 81 ff ff
ff ff ff ff ff ff 00 01 02 ...

แทนที่จะเป็นเช่นนี้คุณต้องเห็นพารามิเตอร์ที่กำหนดเองเมื่อติดตั้ง

พารามิเตอร์เริ่มต้นสำหรับ Java 7 (768bit) จะเป็น "e9e642 ... 7a3daf" ปัญญากำเนิดยาว "30470ad..529252" ตามที่กำหนดไว้ใน ParameterCache


3

ฉันเคยผ่านปัญหาเดียวกันนี้ แต่จาก Glassfish

ก่อนอื่นฉันขอแนะนำ (ถ้าคุณสามารถทำได้) วาง reverse proxy บางส่วนไว้หน้าเซิร์ฟเวอร์ JBoss ของคุณเพราะมันจะลบลิงค์ระหว่างการรักษาความปลอดภัยการเข้ารหัส / ใบรับรองและ Java รุ่นที่คุณใช้อยู่

ในการรับ Ephemeral DH ที่มีขนาดใหญ่กว่าความยาวคีย์ 768 บิตคุณจำเป็นต้องรันบน Java 8 1024 เป็นค่าเริ่มต้นใหม่และคุณสามารถไปได้ถึง 2048 โดยใช้jdk.tls.ephemeralDHKeySize(รายละเอียด: การ ปรับแต่งปุ่ม DH ) จากสิ่งที่ฉันพบไม่มีแนวคิดของการสร้างพารามิเตอร์ที่สำคัญแยกต่างหากใน Java


ขอบคุณสำหรับคำแนะนำทางเลือกนี้ เราอาจพิจารณาเรื่องนี้ในอนาคต
user2072931

ขณะนี้มีให้ดูที่serverfault.com/a/798036/4591
eckes

สำหรับ glassfish / payara / payara-micro เพื่อปิดการใช้งานรหัส DHE เพิ่ม<ssl tls-enabled="false" classname="com.sun.enterprise.security.ssl.GlassfishSSLImpl" tls11-enabled="false" cert-nickname="s1as" ssl3-tls-ciphers="+TLS_RSA_WITH_AES_256_CBC_SHA,+TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA256,+TLS_ECDH_RSA_WITH_AES_256_GCM_SHA256"></ssl>ไปยัง<protocol name="http-listener-2" security-enabled="true">ตัวเชื่อมต่อ SSL
Markus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.