2012-07-16 21 views
10

Tôi đang xem hướng dẫn tham khảo JSSE, tôi cần lấy một phiên bản SSLContext để tạo SSLEngine, vì vậy tôi có thể sử dụng nó với Netty để kích hoạt bảo mật.SSLContext initialization

Để có được phiên bản SSLContext, tôi sử dụng SSLContext.getInstance(). Tôi thấy rằng phương pháp này bị ghi đè nhiều lần, vì vậy tôi có thể chọn giao thức và nhà cung cấp bảo mật để sử dụng.

Here, tôi có thể xem danh sách các thuật toán có thể được sử dụng. Tôi nên sử dụng thuật toán nào để cho phép giao tiếp an toàn?

Ngoài ra, vì có thể chỉ định nhà cung cấp bảo mật để sử dụng, tôi nên sử dụng nhà cung cấp nào?

Cảm ơn

Trả lời

3

Không có mặc định cho giao thức, vì vậy tôi sẽ sử dụng một mới nhất được hỗ trợ bởi JDK của bạn, đó là một trong hai TLSv1, TLSv1.1 hoặc TLSv1.2: xem mà làm việc, hoặc có một cái nhìn tại getSupportedProtocols(). Nhà cung cấp bảo mật mặc định được sử dụng bằng cách tránh tất cả các API mà bạn chỉ định, hoặc ví dụ: KeyStore.getDefaultType().

Và khi bạn đến để nhận SSLEngines của bạn, hãy đảm bảo bạn sử dụng phương thức có tên máy chủ và cổng. Nếu không, bạn sẽ không nhận được phiên chia sẻ SSL.

+0

Xin chào EJP, ý bạn là sử dụng 'SSLContext.getDefault()'? Ngoài ra, các giá trị mặc định là gì? –

+0

@MickaelMarrache Xem chỉnh sửa. – EJP

21

Như bạn có thể thấy trong standard names documentation, tất cả các mục nhập (SSLv3, TLSv1.0, TLSv1.1, ...) nói rằng chúng có thể hỗ trợ các phiên bản khác.

Trong thực tế, trong Oracle JDK (và OpenJDK), tất cả đều làm. Nếu bạn nhìn vào số source code, lớp TLS10Context là những gì được sử dụng cho TLS, SSL, SSLv3 và TLS10, TLS11Context được sử dụng cho TLSv1.1 và TLS12Context cho TLSv1.2. Tất cả hỗ trợ tất cả các phiên bản của SSL/TLS, đó là những gì được kích hoạt theo mặc định khác nhau.

Điều này có thể khác với nhà cung cấp khác hoặc nhà cung cấp JRE. Tất nhiên bạn nên chọn một trong số đó ít nhất là sẽ hỗ trợ phiên bản giao thức mà bạn muốn sử dụng.

Lưu ý rằng giao thức được sử dụng được xác định sau bằng cách sử dụng SSLSocket.setEnabledProtocols(...) hoặc tương đương SSLEngine tương đương.

Như quy tắc chung, hãy sử dụng số phiên bản cao nhất bạn có thể (SSLv3 < TLSv1.0 < TLSv1.1 ...), có thể phụ thuộc vào những bên mà bạn muốn liên lạc với bộ phận hỗ trợ.


Giao thức nào được bật theo mặc định khác nhau tùy thuộc vào phiên bản chính xác của JRE Oracle.

Khi nhìn vào the source code for sun.security.ssl.SunJSSE in OpenJDK 7u40-b43, TLS chỉ đơn giản là một bí danh cho TLSv1 (và như vậy là SSLSSLv3), về mặt SSLContext giao thức. Nhìn vào hình implementations of SSLContextImpl (là lớp bên trong của SSLContextImpl tự):

  • Tất cả hỗ trợ tất cả các giao thức.
  • Tất cả giao thức được bật ở phía máy chủ theo mặc định.
  • các giao thức client-side được kích hoạt theo mặc định khác nhau:
    • TLS10Context (sử dụng cho các giao thức SSL, SSLv3, TLS, TLSv1) cho phép SSLv3 để TLSv1.0 theo mặc định trên các mặt hàng.
    • TLS11Context (được sử dụng cho giao thức TLSv1.1) cũng cho phép TLSv1.1 theo mặc định.
    • TLS12Context (được sử dụng cho giao thức TLSv1.2) cũng bật TLSv1.2 theo mặc định.
  • Nếu FIPS được bật, SSL không được hỗ trợ (do đó không được bật theo mặc định).

Thay đổi này trong Java 8, kết hợp với thuộc tính hệ thống the new jdk.tls.client.protocols.

Một lần nữa, khi nhìn vào the source code for sun.security.ssl.SunJSSE in OpenJDK 8u40-b25, SSLContext giao thức TLSv1, TLSv1.1, và TLSv1.2 cũng tận dụng TLS10Context, TLS11ContextTLS12Context, mà theo logic tương tự như trong Java 7.

Tuy nhiên, giao thức TLS không còn đặt biệt hiệu cho bất kỳ người trong số họ. Thay vào đó, nó sử dụng TLSContext dựa trên các giá trị trong thuộc tính hệ thống jdk.tls.client.protocols. Từ số JSSE Reference guide:

Để bật giao thức SunJSSE cụ thể trên máy khách, hãy chỉ định chúng trong danh sách được phân cách bằng dấu phẩy trong dấu ngoặc kép; tất cả các giao thức được hỗ trợ khác sau đó được tắt trên máy khách. Ví dụ: nếu giá trị của thuộc tính này là "TLSv1, TLSv1.1" thì cài đặt giao thức mặc định trên máy khách cho TLSv1 và TLSv1.1 được bật trên máy khách, trong khi SSLv3, TLSv1.2 và SSLv2Hello bị tắt trên khách hàng.

Nếu thuộc tính này trống, tất cả giao thức được bật theo mặc định trên cả máy khách và phía máy chủ.

Tất nhiên, trong recent versions of Oracle JRE 8, SSL is also completely disabled by default (để xóa khỏi danh sách đó).

Lưu ý rằng trong cả hai trường hợp (JRE 7 và 8), các SSLContext bạn nhận được theo mặc định thông qua SSLContext.getDefault() ra khỏi hộp được ít nhiều tương đương với một SSLContext thu được với giao thức TLS và khởi tạo với các thông số truststore mặc định và vân vân .

+0

Bạn có thể viết lại câu trả lời của mình về những gì xảy ra khi bạn nói getInstance ("SSL") so với getInstance ("TLS") hoặc getInstance ("TLSv1") không? Các giao thức được hỗ trợ cho mỗi giao thức là gì? Các giao thức mặc định cho mỗi và theo thứ tự ưu tiên là gì? Các tài liệu java là vô cùng không rõ ràng về những điểm này. Ví dụ: việc chọn "TLSv1" có thể làm cho 1.0, 1.1 và 1.2 có sẵn. Điều đó có nghĩa là SSLv3 không khả dụng? Còn nếu bạn chọn "TLS", điều đó có làm cho SSLv3 không khả dụng không? – KyleM

+1

@KyleM Tôi đã thêm một số chi tiết. Việc chọn giao thức có phiên bản cao hơn sẽ không tắt giao thức có phiên bản thấp hơn (trừ khi bạn làm điều đó một cách rõ ràng). Tuy nhiên, có một ngoại lệ cho SSL, thường bị tắt trong các phiên bản gần đây. – Bruno

+0

@KyleM bạn thực sự phải có một câu hỏi cho mỗi chủ đề ... và câu trả lời/chủ đề này là từ 2012 anyway – eis

Các vấn đề liên quan