2012-06-21 29 views
11

Nói rằng tôi có hai ứng dụng Java mà tôi đã viết: Ping.jarPong.jar và họ nhận được triển khai và chạy trên hai máy chủ riêng biệt (Ping.jar triển khai để srv-01.myorg.comPong.jar triển khai để srv-02.myorg.com), và hai ứng dụng này cần phải giao tiếp với nhau (2 chiều) qua SSL. Chúng ta cũng giả định rằng mỗi ứng dụng đều có Chứng chỉ SSL riêng.SSL Certificate xác nhận trong Java

  • Làm cách nào để lập trình viên Java, mã số PingPong để xác minh chứng chỉ SSL của nhau? Mỗi CA có cung cấp một số loại RESTful API mà tôi có thể truy cập, ví dụ: HttpClient? Java có API xác minh chứng chỉ của riêng mình không? Có các JAR hoặc dịch vụ bên thứ ba nguồn mở mà tôi có thể sử dụng không?

Tôi đã rất ngạc nhiên khi bật lên một chút khi tôi tìm kiếm trực tuyến này.

+0

Bạn đang sử dụng máy chủ web nào? Kích hoạt SSL (trong trường hợp của bạn lẫn nhau-ssl) thường là một trường hợp cấu hình máy chủ, không mã hóa. – npe

+0

Vâng, giả sử cả hai trường hợp: (1) một ứng dụng Java thuần túy sử dụng ổ cắm/NIO thô (như trường hợp sử dụng của tôi ở trên ngụ ý), và (2) Oracle GlassFish. Tôi thực sự quan tâm đến cả hai trường hợp sử dụng hiện nay. – IAmYourFaja

+0

Quảng cáo 1. Không bao giờ thử, đây có thể là một nhiệm vụ bắt đầu từ đầu. Quảng cáo 2. Kiểm tra [liên kết này] (http://glassfish.java.net/javaee5/security/faq.html), đặc biệt là hai câu hỏi về SSL và xác thực chứng chỉ ứng dụng khách. Có nhiều hơn nữa để nó đọc tài liệu Glassfish về an ninh, nhưng như tôi đã nói, đó là tất cả về cấu hình, không mã hóa. – npe

Trả lời

21

Nếu bạn đang kết nối bằng cách sử dụng các lớp Java SE SSL/TLS (ví dụ: SSLSocket hoặc SSLEngine), bạn đang sử dụng Java Secure Socket Extension (JSSE).

Nó sẽ xác minh chứng chỉ của bên từ xa theo số SSLContext đã được sử dụng để tạo SSLSocket hoặc SSLEngine này.

SSLContext này sẽ được khởi tạo với TrustManager quyết định cách thiết lập sự tin cậy. Trừ khi bạn cần cấu hình cụ thể, bạn thường có thể dựa vào the default values: điều này sẽ dựa vào thuật toán PKIX (RFC 3280) để xác minh chứng chỉ dựa vào bộ neo tin cậy (theo mặc định là cacerts). cacerts, được giao với JRE của Oracle là kho khóa JKS mà bạn có thể thêm chứng chỉ bổ sung. Bạn có thể thêm chứng chỉ một cách rõ ràng bằng cách sử dụng keytool chẳng hạn.

Bạn cũng có thể tạo X509TrustManager dựa trên kho khóa tùy chỉnh theo chương trình (như được mô tả trong this answer) và sử dụng nó trong một SSLContext cụ thể không ảnh hưởng đến mặc định.

Ngoài ra, nếu bạn đang sử dụng giao thức của riêng mình, bạn sẽ cần xác minh rằng chứng chỉ bạn đã nhận được khớp với tên máy chủ bạn đang tìm kiếm (xem RFC 6125). Thông thường, bạn có thể tìm kiếm tên thay thế chủ đề trong số X509Certificate mà bạn nhận được (lấy chứng chỉ ngang hàng đầu tiên trong chuỗi từ SSLSession), thất bại, tìm RDN CN trong Tên phân biệt chủ đề.

+1

[this] (http://stackoverflow.com/a/6341566/372643). – Bruno

0

Bạn không phải kiểm tra thủ công chứng chỉ của nhau.

Bạn chỉ cần nhập từng chứng chỉ máy chủ vào các cacerts của nhau, theo cách này cả hai máy chủ ứng dụng sẽ tự động tin tưởng lẫn nhau.

+0

Điều gì sẽ xảy ra nếu cả hai thiết bị đầu cuối đều nằm? Tôi đã cung cấp ví dụ Ping/Pong này để minh họa khái niệm cố gắng xác minh một chứng chỉ bằng Java thuần túy. Thực tế là tôi đã viết Ping/Pong không nên ngụ ý rằng họ có thể tin tưởng lẫn nhau! Suy nghĩ trừu tượng hơn: nếu Ping và Pong được viết bởi các cửa hàng phát triển khác nhau và được lưu trữ trên 2 mạng hoàn toàn riêng biệt, họ sẽ phải làm gì để xác minh chứng chỉ của nhau? – IAmYourFaja

+0

Có bạn. SSL cung cấp quyền riêng tư, tính toàn vẹn và xác thực danh tính ngang hàng. Cho dù danh tính ngang hàng đó là một trong những ứng dụng mong đợi, và những gì danh tính được phép làm trong ứng dụng, cần được kiểm tra bởi các ứng dụng nếu cần thiết. Đây là bước 'ủy quyền' và SSL không thể thực hiện điều đó cho bạn. – EJP

1

Bạn có thể nhận được giấy chứng nhận ngang hàng hoặc bằng cách gắn một HandshakeCompletedListener đến SSLSocket và nhận được giấy chứng nhận từ sự kiện này, nếu không bằng cách nhận các SSLSession từ SSLSocket và nhận được giấy chứng nhận đẳng trong phiên làm việc.

SSL cung cấp quyền riêng tư, tính toàn vẹn và xác thực danh tính ngang hàng. Cho dù danh tính ngang hàng đó là một trong những ứng dụng mong đợi, và những gì danh tính được phép làm trong ứng dụng, cần được kiểm tra bởi các ứng dụng nếu cần thiết. Đây là bước 'ủy quyền' và SSL không thể thực hiện điều đó cho bạn.

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