Làm cách nào để tạo các tham số Diffie-Hellman mới, 2048 bit với keytool Java?


9

Chúng tôi không phải là chuyên gia đang cố gắng - không thành công cho đến nay - để cập nhật cài đặt máy chủ web (JBoss-5.1.0.GA) để đáp ứng các tiêu chuẩn Diffie-Hellman. Sau khi chạy thử nghiệm trên https://weakdh.org/sysadmin.html , chúng tôi được thông báo rằng chúng tôi cần "tạo các tham số Diffie-Hellman mới, 2048 bit". Trước đây, chúng tôi đã tạo các khóa bằng Java keytool, nhưng chúng tôi không thể tìm thấy bất kỳ thông tin nào về việc tạo tham số Diffie-Hellman mới, 2048 bit với keytool Java. Có ai biết làm thế nào để làm điều này hoặc có thể chỉ cho chúng ta đi đúng hướng? Cảm ơn bạn!

Câu trả lời:


13

Bạn không thể làm điều đó với keytool. Đầu tiên, keytoolkhông hỗ trợ DH chút nào. Thứ hai, keytoolkhông tự tạo các tham số cho bất kỳ thuật toán nào, chỉ có khóa riêng / khóa riêng. Thứ ba, khi keytooltạo ra một cặp khóa, nó cũng tạo ra một chứng chỉ tự ký ( đôi khi sau đó được thay thế bằng một chứng chỉ do CA thực sự cấp) và không thể tạo chứng chỉ tự ký cho DH vì DH không ký. Bạn có thể viết một chương trình Java rất đơn giản (khoảng 10 dòng) để tạo các tham số DH. Nhưng nó có thể sẽ không làm bạn tốt bởi vì:

Java không chấp nhận các tham số DHE ở đây. JbossWS (máy chủ web Jboss, sau này là Wildfly) là một nhánh của Tomcat và thường sử dụng triển khai Java của SSL / TLS, JSSE. Cho đến Java 7, JSSE sử dụng các tham số DHE của riêng nó là 768 bit, yếu đến mức không thể chấp nhận được. . kiểm soát kích thước của các tham số DHE, nhưng không phải giá trị thực.

Các tùy chọn (một số chồng chéo) của bạn là:

Sử dụng Java 8. JSSE trong Java 8, nhưng không sớm hơn, mặc định DHE thành 1024 bit, điều mà hầu hết các cơ quan chức năng xem xét đủ mạnh mặc dù yếu thế không, và cho phép bạn chỉ định thêm, xem https://docs.oracle.com /javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keys và cho nền /programming/30352105/how-to-set-custom-dh-group-in-java -sslengine-to-ngăn chặn-logjam-tấn công . Lưu ý rằng nếu bạn có bất kỳ máy khách Java nào trước Java 8, chúng sẽ thất bại nếu máy chủ sử dụng DHE trên 1024 bit. Tôi không biết bất kỳ khách hàng nào khác có vấn đề này, nhưng hãy kiểm tra khách hàng của bạn trước khi cam kết thay đổi này.

Kích hoạt ECDHE. JSSE trong Java 7 trở lên thực hiện ECDHE, không chịu sự tính toán trước như DHE, (thông thường) sử dụng P-256, đủ mạnh hơn. (Mặc dù một số người không tin tưởng bất kỳ đường cong NIST ECC nào vì NIST nói chung bị ảnh hưởng bởi NSA, mặc dù không có nguồn mở nào tôi biết đã cho thấy một vấn đề trong các đường cong ECC cụ thể.) Java 6 thực sự có phần JSSE cho ECDHE nhưng nó chỉ được kích hoạt nếu JVM có "nhà cung cấp" tiền điện tử cho các nguyên hàm ECC, mà Java 6 không có. bcprov - * - jdk15on từ http://www.bouncycastle.org/ là nhà cung cấp JCE cho một loạt các nguyên hàm mã hóa Java bao gồm ECC, vì vậy, nếu bạn thêm bình vào JRE/lib/extvà thêm org.bouncycastle.jce.provider.BouncyCastleProvidervào danh sách JRE/lib/security/java.security(hoặc thực hiện một cách phù hợpSecurity.add/insertProvider()ở đâu đó sớm trong mã của bạn) Java 6 có thể thực hiện ECDHE. Tất nhiên, liệu bạn có nên sử dụng bất kỳ Java 6 nào hay không là một câu hỏi.

Vài năm trước, hỗ trợ cho ECDHE trong trình duyệt và các máy khách khác là iffy, nhưng ngày nay AFAIK tất cả các trình duyệt cập nhật đều hỗ trợ nó và thích nó hơn với DHE - nghĩa là trình duyệt xin chào liệt kê các bộ ECDHE trước các bộ DHE rằng nếu máy chủ thực hiện cả hai thì nên chọn ECDHE. Khách hàng không có trình duyệt có thể không; kiểm tra để chắc chắn

Vô hiệu hóa DHE. Bạn có thể định cấu hình danh sách các mật mã trong thuộc tính Trình kết nối để loại trừ các mật mã DHE; trong khi bạn đang ở đó cũng loại trừ staticDH và staticECDH vô dụng và (đơn) DES và (tất cả) "XUẤT" nếu có (Java 6). Điều này có nghĩa là các trình duyệt và ứng dụng khách không làm ECHDE sẽ bị kẹt với RSA đơn giản và không có bí mật chuyển tiếp, nhưng ít nhất chúng có bảo mật "hiện tại". Tôi không nhớ là chắc chắn, nhưng tôi nghĩ cấu hình Trình kết nối 5.1 vẫn ở đâu đó như thế nào $server/deploy/jbossweb/server.xml.

Hãy thử bản địa. Tomcat, như tôi đã nói JbossWS bắt đầu từ, có một tùy chọn để triển khai HTTPS (SSL / TLS) bằng cách sử dụng "bản địa" hay còn gọi là "APR" thực sự là OpenSSL bên trong chứ không phải JSSE. Tôi đã thành công hỗn hợp trong việc đưa tùy chọn này hoạt động trên JbossWS và không nhớ lại về 5.1. Nếu JbossWS của bạn có tùy chọn gốc TC khả thi và nếu nó có thể xử lý cấu hình các tham số DH, thì hãy sử dụng openssl để tạo các tham số DH và hướng dẫn gốc JbossWS để định cấu hình chúng.


Cảm ơn vì thông tin hữu ích này. Câu trả lời cho chúng tôi cuối cùng không liên quan đến keytool, chỉ thay đổi tệp máy chủ của chúng tôi, nhưng tôi sẽ kiểm tra câu trả lời này.
dùng2072931

4

Trên thực tế, bạn có thể chỉ định Tham số DHE tùy chỉnh với các phiên bản Java 8 gần đây . Đó là độc lập của ứng dụng (miễn là nó sử dụng triển khai JSSE TLS).

Trước tiên bạn cần chỉ định kích thước của khóa DHE để sử dụng ( -Djdk.tls.ephemeralDHKeySize=1024hoặc -Djdk.tls.ephemeralDHKeySize=2048). Trên máy chủ, điều này sẽ sử dụng kết hợp trình tạo / nguyên tố được xác định trước cho DHE. Với Java 8 chỉ có thể sử dụng 1024 hoặc 2048, JDK 9 sẽ hỗ trợ các kích thước lớn hơn .

Nếu bạn muốn cung cấp một kết hợp khác, bạn có thể chỉ định chúng trong jre / lib / security / Java.security với thuộc tính jdk.tls.server.defaultDHEParametersbảo mật (kể từ 8u51). Nó lấy một danh sách các Tham số (một cho mỗi keyize được sử dụng) và nó phải chứa số nguyên tố và Trình tạo (thường là 2 hoặc 5) dưới dạng hex.

Nếu bạn đã sử dụng openssl dhparam -out dhparam2048.pem 2048để tạo một cặp mới, bạn có thể sử dụng openssl dhparam -noout -text -check -in dhparam2048.pemđể đọc và in tệp đó ở chế độ văn bản. Bạn sẽ phải sao chép và dán văn bản vào các thuộc tính bảo mật Java (sử dụng tr -d ':'để loại bỏ :giữa biểu diễn hex openssl)

Đây là một mẫu (chỉ 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.

Và điều này dẫn đến

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

Bạn nên khởi động lại Máy chủ và xác minh rằng nó thực sự sử dụng nguyên tố này (chứ không phải mặc định) vì quy trình không chuyển tiếp thẳng, vì vậy rất nhiều điều có thể sai. Mặc định được xác định trong nguồn , trong 2048 bit, số nguyên tố là từ bản nháp TLS FFDHE.

Ví dụ: khi chạy openssl s_client, tôi có thể thấy số nguyên tố 1024bit ( ffffff ffffffffffc90f ... 5381ffffffffffffffff ) khi kết nối với Máy chủ JSSE Java 8:

>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 ...

Thay vì điều này, bạn phải xem Thông số tùy chỉnh của mình khi cài đặt.

Các tham số mặc định cho Java 7 (768bit) sẽ là "e9e642 ... 7a3daf" với một trình tạo dài "30470ad..529252" như được định nghĩa trong ParameterCache .


3

Tôi đã trải qua vấn đề tương tự, nhưng từ Glassfish.

Đầu tiên, tôi khuyên bạn (nếu bạn có thể) nên đặt một số proxy ngược trước máy chủ JBoss của bạn vì nó sẽ xóa liên kết giữa bảo mật mật mã / chứng chỉ và phiên bản Java bạn đang chạy.

Để có được độ dài khóa Ephemeral DH lớn hơn 768 bit, bạn cần chạy trên Java 8. 1024 là mặc định mới và bạn có thể lên tới 2048 bằng cách sử dụng jdk.tls.ephemeralDHKeySize(chi tiết: tùy chỉnh các phím DH ). Từ những gì tôi có thể tìm thấy, không có khái niệm tái tạo các tham số chính riêng biệt trong Java.


Cảm ơn đề nghị này của một sự thay thế. Chúng tôi có thể xem xét điều này trong tương lai.
dùng2072931

Hiện tại, hãy xem serverfault.com/a/798036/4591
eckes

đối với cá thủy tinh / payara / payara-micro để vô hiệu hóa các mật mã DHE thêm <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>vào trình <protocol name="http-listener-2" security-enabled="true">kết nối SSL
Markus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.