Điểm:0

Làm cách nào để thêm bộ mật mã bổ sung vào máy chủ ứng dụng Java?

lá cờ kz

Tôi đang gặp một chút rắc rối với lệnh gọi tới API của bên thứ ba từ một ứng dụng java. API bên ngoài yêu cầu ít nhất một trong các mật mã sau:

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

Tôi đã làm theo hướng dẫn ở đây: https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.html để thử nâng cấp các mật mã khả dụng trên máy chủ ứng dụng của tôi. Tuy nhiên, sau khi nâng cấp, tôi vẫn không thấy bất kỳ mật mã tương thích nào được liệt kê.

Tôi nghi ngờ vấn đề là máy chủ của tôi đang chạy jdk 1.7. Đây là một ứng dụng cũ nên rất tiếc là tôi không thể nâng cấp lên jdk mới hơn. Có cách nào để thêm các mật mã đó vào bản cài đặt java hiện tại của tôi không?

Cập nhật: Tôi đã tìm ra cách thêm các mật mã bổ sung nhưng có vẻ như nó không giúp được gì. Trong nhà máy ổ cắm của tôi, tôi đã thêm một số mã như thế này:

ổ cắm riêng acceptOnlyTLS12(Ổ cắm ổ cắm) {
        nếu (!(socket instanceof SSLSocket))
            trở lại ổ cắm;
        SSLSocket sslSocket = (SSLSocket) ổ cắm;
        sslSocket.setEnabledProtocols(new String[] { "TLSv1.2" });
        List<String> ciphers = new ArrayList<String>(Arrays.asList(sslSocket.getEnabledCipherSuites()));
        ciphers.add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256");
        sslSocket.setEnabledCipherSuites(ciphers.toArray(new String[] {}));
        trả về sslSocket;
    }

Có một bước nữa tôi đang thiếu ở đâu đó? Có cách nào để có được thông tin bổ sung về lý do tại sao quá trình bắt tay ssl không thành công không?

lá cờ kz
@Robert bạn có thể giải thích một chút về điều đó không? Máy chủ chấm dứt TLS bên ngoài là gì?
lá cờ in
https://en.wikipedia.org/wiki/TLS_termination_proxy
lá cờ in
Theo như tôi nhớ thì việc di chuyển từ Java 7 sang 8 không phải là vấn đề lớn. Bạn đã thử làm cho nó chạy trên Java 8 chưa? Bên cạnh đó, bạn vẫn có thể sử dụng phương pháp chấm dứt proxy bên ngoài, sử dụng máy chủ web hiện đại như nginx trên cùng một máy chấm dứt kết nối TLS và chuyển tiếp kết nối hiện không được mã hóa tới máy chủ Java thực tế.
lá cờ kz
@Robert Thật không may, tôi có. Ứng dụng đang chạy trên Jboss4 không hoạt động tốt với các phiên bản jdk mới hơn.
lá cờ in
Sau đó, bạn phải chọn tùy chọn máy chủ chấm dứt TLS bên ngoài.
Điểm:1
lá cờ jp

(1) Trang web đó có từ năm 2014; chính sách không giới hạn hoàn toàn không còn được sử dụng cho các phiên bản Oracle Java sau năm 2017 và trước đó (ví dụ: 7u80) nó chỉ quan trọng đối với mã hóa đối xứng hơn 128 bit mà ở đây sẽ chỉ ảnh hưởng đến bộ AES256 chứ không phải bộ AES128. (Đó là chẳng bao giờ áp dụng cho OpenJDK, mặc dù OpenJDK dưới 8 hầu như chỉ khả dụng trên các bản phân phối Linux chính như RedHat và Debian có thể phân bổ nhân viên để xây dựng và đóng gói; bạn không nói bạn đang sử dụng cái gì.)

(2) Java (1.)7 làm hỗ trợ các bộ mật mã CBC mà bạn hiển thị (không phải bộ mã hóa GCM và đối với các phiên bản Oracle dưới 7u171, bộ mã hóa AES256 yêu cầu chính sách không giới hạn) nhưng CHỈ khi TLS1.2 được sử dụng (các bộ mật mã này không tồn tại trong các giao thức phiên bản thấp hơn) và theo mặc định, j7 vô hiệu hóa phía máy khách TLS1.2 (và 1.1).

Nếu bạn rõ ràng đang thực hiện kết nối với API này bằng HttpsURLKết nối (ví dụ. URL mới("https://something").openConnection()) bạn có thể tinh chỉnh socketfactory để sử dụng SSLContext.getInstance("TLSv1.2") và/hoặc rõ ràng setEnabledProtocols trên ổ cắm. Nếu bạn đang sử dụng phần mềm trung gian khác, ví dụ: Apache HttpComponents thường có các phương pháp tương tự nhưng chúng khác nhau về chi tiết; bạn sẽ cần cho chúng tôi xem mã và mã đó có thể thuộc về StackOverflow không có ở đây. Nếu bạn đang gọi một thư viện thực hiện kết nối nội bộ, nó có thể có các tùy chọn hoặc không. Đối với tất cả hoặc nhiều phương thức gọi, bạn có thể thay đổi các giá trị mặc định như SSLContext.setDefault() hoặc HttpsURLConnection.setDefaultSSLSocketFacfory() nếu các giá trị mặc định này không bị ghi đè trong mã có liên quan thực hiện một thay đổi toàn cầu như thế không gây rắc rối cho bất kỳ thứ gì khác đang chạy trong cùng một JVM của bạn.

Ngoài ra (và nhiều chủ đề khác!) nếu bạn có bản cập nhật j7 gần đây, tôi khá chắc chắn rằng họ đã nhập thuộc tính hệ thống jdk.tls.client.protocols mà bạn có thể đặt thành ví dụ: TLSv1,TLSv1.1,TLSv1.2 để thay đổi mặc định mà không thay đổi mã (nhưng chỉ một lần nữa nếu không bị ghi đè và không gây hại cho bất kỳ điều gì khác). Tôi không nhớ chính xác thời điểm này nhưng chắc chắn là sau 7u80, vì vậy bạn sẽ chỉ có nó với sự hỗ trợ của Oracle có trả phí hoặc OpenJDK được hỗ trợ bởi người khác có hoặc không trả tiền. Thật dễ dàng để thử và có thể công việc.

lá cờ kz
@ dave_thompson_085 Tôi đã có thể cài đặt phiên bản jdk7 mới hơn và thêm các lọ JCE độ bền không giới hạn. Một số mật mã bắt buộc ít nhất hiện có sẵn, nhưng chúng không được kích hoạt. Bất kỳ ý tưởng nào về cách định cấu hình mật mã nào được kích hoạt bởi jdk?
Điểm:0
lá cờ kz

Cuối cùng tôi đã tìm thấy một cách giải quyết, nếu hơi xấu xí. Tôi đã tạo một tập lệnh hấp dẫn tạo yêu cầu cURL tới API bên ngoài. Vì cURL có thể sử dụng các chứng chỉ mới nhất nên tôi có thể khắc phục các hạn chế do bị mắc kẹt với một JDK cũ. Đó là kludgy nhưng nó hoạt động.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.