2010-04-21 38 views
20

Tôi tạo khóa chứng nhận với openssl. Đây là lệnh của tôi:Cửa hàng khóa Java có thể nhập một cặp khóa do OpenSSL tạo ra không?

openssl genrsa -des3 -out enc_key.pem 1024

Tôi xuất thành tệp cer, sau đó với keytool java Tôi nhập vào kho khóa java (jks).

Kho lưu trữ âm thanh tốt. Tôi có thể tải kho khóa từ ứng dụng java của mình.

Vấn đề là khi client kết nối đến máy chủ (Trong trường hợp này là FTP server, không phải máy chủ web, và tôi sử dụng apache mina), ngoại trừ xảy ra:

javax.net.ssl.SSLHandshakeException: SSL handshake failed. at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:433) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$5(DefaultIoFilterChain.java:429)

...

Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source) at javax.net.ssl.SSLEngine.wrap(Unknown Source)

...

Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)

có một vài điều mà tôi muốn hỏi:

  1. Mật mã xác nhận mà tôi tạo bằng openssl là gì? Làm thế nào chúng ta có thể biết? có thể bởi dòng lệnh openssl xxx?
  2. Tôi truy cập http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA. Và tôi đặt SSL_RSA_xxx cho các bộ mã hóa được kích hoạt, nhưng vẫn không thể làm việc (tôi đặt SSL_RSA vì nó là SSL đang sử dụng ssl implisit, và genrsa, chỉ genrsa ý kiến ​​của tôi là tạo RSA). Nó có đúng không?
  3. Bất kỳ ai biết giải pháp?
  4. Hoặc, bất kỳ ai biết cách tạo kho khóa chuẩn từ dòng lệnh openssl cho đến khi có thể được sử dụng trong ứng dụng java (tắt khóa học với mật mã). Bởi vì ngay bây giờ tôi có thể tạo ra các chứng nhận từ openssl và xuất khẩu keystore java, nhưng tôi không biết mật mã mà tôi đã sử dụng là gì và cách tôi sử dụng trong ứng dụng java. Lưu ý: Tôi có thể chạy nếu kho khóa được tạo trực tiếp từ java. Ngay bây giờ vấn đề là nếu keystore được tạo ra bởi keytool java từ chứng nhận như openssl (và có thể khác).

Mọi trợ giúp sẽ được đánh giá cao! Cảm ơn

Trả lời

45

Tại sao bạn sử dụng OpenSSL để tạo cặp khóa? Tại sao không chỉ sử dụng keytool?

Công cụ genrsa chỉ tạo khóa riêng. Bạn tạo một chứng chỉ tương ứng như thế nào? Làm thế nào bạn nhập khóa riêng vào kho khóa Java của bạn? (Tôi hỏi, vì keytool chỉ có thể nhập khóa cá nhân từ một kho khóa chính hiện có và chỉ từ Java 6 trở lên.)

Tôi nghi ngờ rằng vấn đề của bạn là kho khóa không chứa khóa nhập (khóa riêng chứng chỉ tương ứng). Khi bạn liệt kê các nội dung kho khóa với keytool, có bao nhiêu mục nhập? Chúng có phải là các mục nhập chính hoặc mục đáng tin cậy không?


Máy chủ cần truy cập khóa riêng để tự xác thực. Để nhập khóa cá nhân, hãy sử dụng của Java 6 được tăng cường keytool.

Sau khi tạo chìa khóa và giấy chứng nhận với OpenSSL, sử dụng OpenSSL để tạo ra một PKCS # 12 cửa hàng chính:

openssl pkcs12 -export -in cert.pem -inkey key.pem > server.p12 

Sau đó, chuyển đổi cửa hàng này vào một cửa hàng chủ chốt Java:

keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12 

Bây giờ sử dụng server.jks trong máy chủ hỗ trợ SSL của bạn, có chứa chứng chỉ khóa riêng tư.

+0

Về cơ bản, tôi có thể chạy ứng dụng (xem điểm câu hỏi của tôi 4) với kho khóa được tạo bởi keytool java (vâng, như bạn đã nói, chính xác, tôi đã làm). Nó hoạt động tốt nếu tôi tạo keystore trực tiếp (jks) từ keytool java sau đó ứng dụng của tôi (máy chủ FTPS) chỉ sử dụng keystore đó. Không vấn đề gì với điều đó. Câu hỏi của bạn tại sao tôi sử dụng OpenSSL để tạo ra cặp khóa là vì hiện tại khách hàng có giấy chứng nhận giấy phép (verisign) vì vậy tôi phải kiểm tra bằng openssl trước. Btw, keytool có thể nhập từ cert x509 (bằng cách thực hiện lệnh: openssl req -x509 -key key.pem -in req.pem -out cert.pem -days 365) – Jef

+0

Tiếp tục từ trên Tôi đã nhập khóa được tạo bởi openssl để java keystore (jks) và ứng dụng java cho biết keystore đã hợp lệ (tôi thử khóa khác, java có thể xác minh keystore hợp lệ của nó hay không). Vấn đề là khi tôi chạy ứng dụng thông qua kho khóa (được tạo bởi java keytool import từ cert openssl), ứng dụng sẽ ném ngoại lệ lên trên. Kho lưu trữ khóa chứa mục nhập khóa (nó hoạt động trong httpd ssl), khi tôi thực hiện danh sách keytool, mục nhập đã được tin cậy. Tôi thực hiện lệnh này: keytool -import -v -trustcacerts -alias máy chủ-bí danh -file cert.pem -keystore cacerts.jks -keypass x -storepass x – Jef

+0

@Jef - * Không, * không đúng, hoặc chương trình của bạn sẽ hoạt động; chỉ vì kho khóa của bạn có định dạng * hợp lệ * không có nghĩa là * chứa * thông tin cần thiết để xác thực máy chủ. Đặc biệt, tuyên bố của bạn, "khi tôi làm một danh sách keytool, mục nhập đã được tin cậy," làm cho nó âm thanh như đó là một mục tin cậy, không phải là một mục nhập quan trọng. ** Một mục tin cậy sẽ không hoạt động - không có khóa riêng. ** Áp dụng một số lý do đơn giản: bạn có bao giờ cung cấp 'keytool' một tệp chứa khóa riêng không? Làm thế nào để bạn mong đợi để thực hiện xác thực máy chủ mà không làm cho khóa riêng có sẵn? – erickson

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