Bạn không thể làm điều đó với keytool. Đầu tiên, keytool
không hỗ trợ DH chút nào. Thứ hai, keytool
khô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 keytool
tạ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/ext
và thêm org.bouncycastle.jce.provider.BouncyCastleProvider
và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.