2012-07-31 10 views
17

Tôi đang xây dựng một màn hình ứng dụng đơn giản để thăm dò một trong các URL API của chúng tôi và gửi email cho chúng tôi nếu nó không nhận được mã trạng thái HTTP 200 từ phản hồi (điều này cho biết API của chúng tôi là vì lý do nào đó).Lỗi "Peer Not Authenticated" SSL với HttpClient 4.1

Tôi đang sử dụng HttpClient 4.1 (điều này quan trọng vì API của nó khác rất nhiều từ 3.x).

API của chúng tôi là an toàn với SSL, tuy nhiên bước vào:

http://example.com/our-api

vào trình duyệt web chuyển hướng bạn đến

https://example.com/our-api

không gây bất kỳ lỗi.

Khi HttpClient cố gắng để đạt URL này (http://example.com/our-api), nó không thành công với một ngoại lệ javax.net.ssl.SSLPeerUnverifiedException với một thông báo nói:

ngang hàng không được xác thực

Tôi thấy điều này xảy ra rất nhiều cho người khác như được chứng minh bằng this bài đăng (cũng cung cấp một số cách để vượt qua vấn đề này - một giải pháp mà tôi sẽ cố gắng thực hiện tối nay trên thực tế).

Bài đăng nào khác (và những bài đăng tương tự khác với bài đăng này) không làm là giải thích lý do tại sao điều này xảy ra ngay từ đầu! Vì vậy, thay vì hỏi "làm thế nào để sửa lỗi này?" Tôi nghĩ rằng tôi sẽ hỏi "lý do tại sao điều này xảy ra?" Trước khi tôi đi trước với một trong các giải pháp được đề xuất, tôi muốn biết vấn đề là tôi đang cố sửa ;-)

+1

Bạn có thể đăng stack trace đầy đủ? –

+0

Cần lưu ý rằng thông báo này phải do lập trình lạ trong HttpClient. Đã có một sự thất bại bắt tay trước khi bị mất hiệu lực của SSLException, và đây là điều đáng lẽ nên bị ném ra. Thực hiện rõ ràng tiếp tục một cuộc gọi SSLSession.getPeerCertificate(), là API duy nhất ném ngoại lệ trong tiêu đề. – EJP

Trả lời

24

Nếu chứng chỉ của máy chủ là tự ký, thì điều này đang hoạt động như được thiết kế và bạn sẽ phải nhập chứng chỉ của máy chủ vào kho khóa của bạn.

Giả sử chứng chỉ máy chủ được ký bởi một CA nổi tiếng, điều này xảy ra vì tập hợp chứng chỉ CA có sẵn cho trình duyệt hiện đại lớn hơn nhiều so với bộ giới hạn được vận chuyển với JDK/JRE.

Giải pháp EasySSL được cung cấp trong một trong các bài đăng mà bạn đề cập chỉ khắc phục lỗi và bạn sẽ không biết máy chủ có chứng chỉ hợp lệ hay không.

Bạn phải nhập đúng CA gốc vào kho khóa của mình để xác thực chứng chỉ. Có một lý do khiến bạn không thể giải quyết vấn đề này với mã chứng khoán SSL, và đó là để ngăn bạn viết các chương trình hoạt động như thể chúng an toàn nhưng không.

+0

Hầu hết thời gian máy chủ SSL sẽ gửi chuỗi đến nhưng không bao gồm chứng chỉ gốc. Vì vậy, hầu hết thời gian bạn sẽ không phải nhập toàn bộ chuỗi vào kho khóa. Tuy nhiên, bạn nên tin tưởng một cách rõ ràng chứng chỉ gốc. –

+0

@owlstead có, thông thường bạn chỉ cần nhập Root CA; câu trả lời đã được chỉnh sửa. –

+0

Tôi đã nhập chứng chỉ (phiên bản base64) vào lưu trữ khóa trong 'lib \ security \ cacerts' nhưng java vẫn cho cùng một lỗi. Khi tôi nhập nó vào cửa sổ chứng chỉ đáng tin cậy cửa hàng, chrome đã ngừng đưa ra lỗi. Nhưng khi tôi đã làm nó với keytool java nó vẫn không thể kết nối. – nurettin

6

này được ném khi

... peer đã không thể xác định bản thân (ví dụ, không có giấy chứng nhận , bộ ứng dụng mật mã đặc biệt được sử dụng không hỗ trợ xác thực, hoặc không xác thực ngang hàng là được thiết lập trong khi SSL bắt tay) ngoại lệ này được ném.

Có thể nguyên nhân của ngoại lệ này (ở đâu là ngăn xếp ngăn xếp) sẽ cho bạn thấy lý do ngoại lệ này bị ném. Nhiều khả năng kho khóa mặc định được gửi kèm với Java không chứa (và tin tưởng) chứng chỉ gốc của TTP đang được sử dụng.

Câu trả lời là truy xuất chứng chỉ gốc (ví dụ: từ kết nối SSL của trình duyệt), nhập tệp đó vào tệp cacerts và tin tưởng nó bằng cách sử dụng keytool được JDK Java vận chuyển. Nếu không, bạn sẽ phải chỉ định một kho lưu trữ tin cậy khác theo lập trình.

0

Im không phải là nhà phát triển java nhưng đã sử dụng ứng dụng java để kiểm tra API RESTful. Để tôi sửa lỗi, tôi phải cài đặt chứng chỉ trung gian trong máy chủ web để làm cho lỗi bị biến mất. Tôi đã sử dụng lighttpd, chứng chỉ gốc đã được cài đặt trên máy chủ IIS. Hy vọng nó giúp. Đây là những chứng chỉ tôi đã thiếu trên máy chủ.

  • ca.crt
  • UTNAddTrustServer_CA.crt
  • AddTrustExternalCARoot.crt
0
keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer