2010-09-23 30 views
6

Tôi sử dụng kết nối SSL để kết nối máy khách web với máy chủ. Nó hoạt động mà không có bất kỳ vấn đề trong một thời gian dài. Nhưng từ ngày hôm qua nó cho lỗi sau đây có thể bất cứ ai cho tôi biết lý do.Ngoại lệ HandShake SSL

javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1172) 
     at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) 
     at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.java:166) 
     at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.java:78) 
     at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241) 
     at java.lang.Thread.run(Thread.java:619) 
clientWriter.ready 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1586) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:865) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:621) 
     at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) 
     at java.io.OutputStream.write(OutputStream.java:58) 
     at net.schubart.fixme.internal.Message.write(Message.java:267) 
     at net.schubart.fixme.internal.MessageOutput.writeMessage(MessageOutput.java:53) 
+0

Bạn có nhật ký máy chủ không? Có phải "SSL một chiều" (không có chứng chỉ người dùng) hay bạn xác thực khách hàng của mình? Bạn có thể kết nối máy chủ này bằng trình duyệt web không? Chứng chỉ máy chủ có hợp lệ không? –

Trả lời

2

Kiểm tra chứng chỉ hợp lệ, bạn có thể thực hiện việc này với trình duyệt của mình.

2

Chứng chỉ do máy chủ cung cấp không đáng tin cậy. Điều này có thể là do chứng chỉ đã hết hạn hoặc người quản lý tin cậy không thể thiết lập một chuỗi tín nhiệm cho bất kỳ chứng chỉ nào trong cửa hàng tin cậy của bạn.

0

Bạn có thể kiểm tra chứng chỉ qua trình duyệt.

Trong Internet Explorer

Right Click >> Properties >> Certificates 

Khi ở trong Giấy chứng nhận Window bạn có thể xem toàn bộ cây giấy chứng nhận là tốt.

Nếu bạn có chứng chỉ không hợp lệ, bạn có thể muốn xem xét giải pháp bằng cách sử dụng lệnh keytool.

Keytool Commands

2

Nếu bạn thực sự thực sự cần, bạn có thể chấp nhận tất cả chứng chỉ. Nhưng hãy nhớ rằng điều này thực sự xấu xí.

Hava xem this.

0

Tôi nghĩ bạn phải thêm kho khóa vào jre1.6 cacert. Sau đó triển khai lại máy chủ của bạn .Bằng cách bạn có thể sử dụng để thêm chương trình keystorePORTECLE. nó rất hữu ích.

5

Tôi đã dành hơn 12 giờ cho vấn đề này. Sau khi tạo chứng chỉ tự ký, bạn phải xuất chứng chỉ đó thành tệp cacert. Trong trường hợp của tôi nó nằm ở /usr/lib/java/jre/lib/security/cacert. Bạn có thể export chứng chỉ bằng keytool (có lẽ bạn phải có quyền truy cập root):

$ sudo keytool -exportcert -alias keyStoreAlias -keystore \ 
     keyStoreKeys.keys -file /usr/local/java/jre/lib/security/cacerts 
2

đầu tiên tôi sẽ kiểm tra để xem nếu các CERT trong câu hỏi đã hết hạn. Đã chạy vào điều này nhiều lần khi làm việc với các nhà cung cấp. Họ có thể cập nhật chứng chỉ của họ mà không cho chúng tôi biết.

4

Sự cố bạn gặp phải là với chứng chỉ. Dưới đây là danh sách những điều bạn có thể cần phải làm quen với trước khi làm việc với một chương trình SSL an toàn. Phải có một truststore, keystore và certs phải được thêm vào. Để thêm khóa vào tệp cacerts của bạn, như trong bước 6, máy tính có thể yêu cầu bạn nhập mật khẩu mà bạn không biết.Đó là "changeit" mostt khả năng

1) Để tạo một keystore mới và chứng chỉ tự ký tương ứng với khóa công khai/riêng:

keytool -genkeypair -alias "username" -keyalg RSA -validity 7 -keystore keystore 

2) Để Kiểm tra keystore:

keytool -list -v -keystore keystore 

3) Xuất và kiểm tra chứng chỉ tự ký:

keytool -export -alias "username" -keystore keystore -rfc -file "username".cer 

4) Import chứng chỉ vào một truststore mới:

keytool -import -alias "username" -file "username".cer -keystore truststore 

5) Kiểm tra truststore:

keytool -list -v -keystore truststore 

6) Thêm vào keystore (đây là những gì bạn đang tìm kiếm):

sudo keytool -import -file "username".cer -alias "username" -keystore "path-to-keystore" 

Trên một số hệ thống được tìm thấy trong

/usr/lib/jvm/<java version folder>/jre/lib/security/cacerts 

và trên các hệ thống khác, nó là một cái gì đó giống như

/etc/ssl/certs/java/cacerts 

Kiểm tra dự án này trên Git-Hub nếu bạn cần làm rõ hơn: https://github.com/rabbitfighter81/JSSLInfoCollectionServer Và đây là một kịch bản shell giúp với các phím. https://github.com/rabbitfighter81/SSLKeytool

0

'certificate_unknown' này là thông báo lỗi rất gây hiểu nhầm. Đây là thông báo lỗi tương tự được ném khi chứng chỉ đã hết hạn ngay cả khi nó nằm trong truststore. Tôi khuyên bạn nên kiểm tra ngày hết hạn của chứng chỉ trước khi bạn lãng phí thời gian của mình vào bất kỳ điều gì khác.

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