2009-10-30 33 views
8

Tóm tắt điều hành: làm cách nào để cài đặt chứng chỉ gốc mới vào Java bằng mã Java?Làm cách nào để nhập chứng chỉ Java CA mới mà không sử dụng tiện ích dòng lệnh keytool?

Chúng tôi có ứng dụng dành cho máy tính để bàn truy cập các dịch vụ web khác nhau. Gần đây, một trong số họ đã chuyển chứng chỉ SSL của họ thành chứng chỉ do Trustwave ký. Trong khi các chứng chỉ Trustwave SSL được chấp nhận bởi các trình duyệt internet thường xuyên, Java dường như không đi kèm với chứng chỉ gốc điều kiện tiên quyết, và chúng tôi bị mất quyền truy cập vào các dịch vụ web nhất định với các thông báo lỗi sau:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Chúng tôi đã nhận tạm thời reprieve bằng cách thuyết phục các nhà cung cấp để chuyển trở lại Verisign nhưng khi họ chuyển trở lại chúng ta phải sẵn sàng. Vì vậy, tôi cần phần mềm máy tính để bàn của chúng tôi để tự động cài đặt chứng chỉ gốc Trustwave khi cần thiết. Khách hàng của chúng tôi không đủ hiểu biết để sử dụng lệnh keytool và tôi không muốn viết kịch bản vì nó làm cho tôi trở thành một giải pháp dễ vỡ (triển khai riêng cho Mac và PC). , v.v.)

Tôi tưởng tượng keytool sử dụng Java trong nội bộ. Tôi có thể sử dụng lệnh nào trong Java để tái tạo chức năng của keytool và cài đặt chứng chỉ gốc theo chương trình?

Trả lời

2

Tôi không biết nếu điều đó là có thể, nhưng bạn có thể thực hiện TrustManager của riêng bạn để cho phép kết nối này hoặc CA này. Here là những điều cơ bản.

+0

Điều đó có thể phù hợp với chúng tôi. Liên kết gợi ý một cách để hoàn toàn vô hiệu hóa xác minh mà không phải là những gì chúng tôi muốn chính xác nhưng có lẽ tôi có thể sublcass TrustManager bình thường để làm cho một trong đó cố gắng tất cả các chứng chỉ gốc thường xuyên cộng với một. Cảm ơn, điều này có vẻ đầy hứa hẹn. –

0

Nếu bạn muốn cài đặt chứng chỉ vào kho khóa gốc tin cậy trên máy tính để bàn, bạn sẽ cần quyền để thực hiện điều đó. Điều này tương tự với khóa công cụ , bạn cần có mật khẩu để truy cập kho khóa gốc tin cậy. Nếu bạn muốn trở thành nhanh chóng-n-bẩn, bạn có thể

  • viết giấy chứng nhận vào một tập tin hoặc một dòng byte hoặc bất cứ điều gì
  • nhập khẩu sử dụng KeyTool lớp (sun.security.tools.KeyTool)

Nhưng IMHO nếu chứng chỉ không hợp lệ, sau đó nó không đáng tin cậy. Tôi sẽ nói có một lý do chính đáng cho điều đó.

+0

Nó hợp lệ theo Firefox và Internet Explorer. Java chỉ đi kèm với kho khóa riêng của nó thay vì sử dụng hệ điều hành được cung cấp, và tôi cho rằng phiên bản Java không bao gồm những người mới đến với thị trường SSL. –

+0

Có những trường hợp, điều này là hợp lý: Trong công ty của chúng tôi, chúng tôi sử dụng CA của riêng mình trong nội bộ - tự nhiên nó không được tin cậy theo mặc định (trình duyệt, vv phàn nàn). Việc nhập chứng chỉ CA này dễ dàng hơn nhiều so với thêm ngoại lệ cho các chứng chỉ đơn trên toàn bộ địa điểm. – sfussenegger

1

IMHO, Sun đã không tiếp xúc keytool qua API, chủ yếu để ngăn các nhà phát triển sửa đổi tập hợp các CA đáng tin cậy. Tôi rất có thể tưởng tượng những kẻ tấn công khai thác mã như vậy để chèn chứng chỉ gốc của riêng họ vào cửa hàng tin cậy làm ảnh hưởng đến mô hình rất của cửa hàng tin cậy.

Thực tế, nếu bạn nhìn vào nguồn của lớp KeyTool (gói sun.security.tools), không chỉ là cuối cùng, nó còn có một hàm tạo riêng ngăn cản bất kỳ người gọi nào tạo ra một thể hiện của lớp KeyTool từ mã. KeyTool không có một phương thức chính, làm cho dòng lệnh (và do đó một người dùng hệ điều hành) có thể là cách duy nhất mà người ta có thể khởi tạo và giao tiếp với KeyTool.

duy nhất (đơn giản) cách tiếp cận trái sẽ là:

  • Khởi keytool như một quá trình từ các ứng dụng, và vượt qua đối số dòng lệnh để cài đặt chứng chỉ CA gốc. Điều này một mình là một ý tưởng tồi, và tôi sẽ khuyên bạn nên thông báo cho người dùng về những gì đang xảy ra.
  • Tránh sử dụng keytool và thay vào đó cung cấp cho người dùng các hướng dẫn về cách cài đặt CA gốc bằng cách sử dụng Keyman hoặc KeyTool IUI. Nói cho bản thân mình chỉ ở đây, tôi thích cái sau.
+1

Đối với cấp độ kỹ thuật của người dùng của chúng tôi, tự động không có câu hỏi được hỏi là cài đặt duy nhất có thể tha cho chúng tôi từ "ứng dụng của bạn bị hỏng, khắc phục sự cố" loại câu hỏi hỗ trợ. –

+0

Về câu hỏi triết học về việc liệu các ứng dụng có nên được phép sửa đổi kho khóa hay không, câu trả lời phải là dĩ nhiên - nếu không chính công cụ khóa không thể hoạt động. Truy cập vào các hoạt động có thể được kiểm soát bởi một người quản lý an ninh có lẽ. Than ôi, tôi digress. Các quyết định thiết kế đằng sau điều này không quan trọng nhiều như việc tìm kiếm một giải pháp thiết thực. Cảm ơn cho con trỏ một trong hai cách. –

+3

Tôi đã quên đề cập đến một giải pháp thay thế khác - sử dụng kho lưu trữ tin cậy của riêng bạn có thể chứa tất cả các CA gốc mà bạn muốn. Bạn có thể lấy JVM để sử dụng truststore đó thông qua thuộc tính javax.net.ssl.trustStore. –

1

Bạn luôn có thể gọi KeyTool là một quy trình Runtime.exec(...).

0

Command-line solution. Trên máy Mac, nhà Java là/Library/Java/Home. Hãy thử:

$ sudo -i 
# cd /Library/Java/Home 
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts 

Thay thế CAName bằng tên CA của bạn và CA.crt bằng đường dẫn đến tệp chứng chỉ của bạn (PEM hoạt động). Nó sẽ nhắc nhập mật khẩu kho khóa. Mật khẩu mặc định được đưa ra trong bài viết được liên kết.

Tôi phải làm điều này cho một trong các chứng chỉ CA của RapidSSL.

+0

Tôi nghĩ rằng phần yêu thích của tôi là nơi ông nói rằng ông muốn làm điều đó mà không cần sử dụng keytool và bạn nói với anh ta để sử dụng keytool;) –

+0

True. Nhưng tôi không thể tưởng tượng việc viết một Java TrustManager và bằng cách nào đó phân phối ứng dụng đó dễ dàng hơn một giải pháp viết kịch bản bằng cách sử dụng keytool, ngay cả trong một môi trường hỗn hợp. – farcepest

0

Sun công bố mã này để tạo ra một phiên bản cập nhật của file cacerts của bạn dựa trên bất kỳ máy chủ mục tiêu di động https với bất kỳ Certs:

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

cacerts mới của bạn sẽ được đặt tên jssecacerts trong thư mục hiện hành. Chỉ cần sao chép tập tin mới trên tập tin jre/lib/security/cacerts của bạn.

Tôi không nhận xét gì về tính bảo mật của tệp cacerts mới của bạn.

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