2012-11-20 22 views
5

Tôi đang sử dụng Amazon RDS MySQL và kết nối với SSL chứng chỉ (chứng chỉ mặc định có sẵn tại http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem), tôi đang làm các bước sau:RDS Truy cập Với SSL - không được hỗ trợ kỷ lục phiên bản Unknown-0.0

  1. Downloaded các mysql-ssl-ca-cert.pem
  2. Modified tập tin trên để JKS định dạng
  3. và kết nối từ một ứng dụng web thông qua Spring - Hibernate mẫu (org.springframework.beans.factory.config.PropertyPlaceholderConfigurer) và cũng có thể sử dụng c3p0, chúng tôi thiết lập thêm tham số URL như jdbc:URL/DB?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false&requireSSL=true

Nhưng tôi đang phải đối mặt với vấn đề dưới đây ...

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0 

Làm thế nào tôi có thể sửa lỗi này?

Trả lời

4

Về cơ bản, điều đó có nghĩa là trình phân tích cú pháp SSL bị mất. Lớp socket đã truyền cho nó một số byte không phù hợp với giao thức SSL.

Khi bạn truyền bằng cách sử dụng một ổ cắm SSL, nó gọi một thói quen định dạng và mã hóa để tạo gói tin được mã hóa. Sau đó nó gọi lớp đồng bằng ổ cắm để truyền gói được mã hóa tới máy chủ. Tầng socket của máy chủ nhận gói và sau đó gọi gói SSL để giải mã gói tin. Nếu gói không phù hợp với định dạng SSL, bạn sẽ nhận được ngoại lệ phiên bản không hỗ trợ.

Tất cả các byte đến lớp ổ cắm đều được gửi đến gói SSL. Vì vậy, cách đơn giản nhất để có được lỗi đó là sử dụng lớp ổ cắm đơn giản để truyền một tin nhắn văn bản thuần túy sau khi thiết lập kết nối SSL.

Trong trường hợp cụ thể của tôi, tôi đã chạy vào thông báo lỗi này vì tôi đang truyền các byte thừa. Hãy xem nếu tôi có thể giải thích sai lầm của tôi một cách rõ ràng.

Tôi đã có bộ đệm (ví dụ) 100 byte. Tôi đóng gói bộ đệm với thông báo 50 byte của tôi và được gọi là thường trình mã hóa SSL. Gói kết quả dài 75 byte. Tôi gọi send() để truyền bộ đệm. Đây là một ổ cắm đơn giản gửi; nó đã làm những gì tôi nói với nó để làm, đó là truyền toàn bộ bộ đệm 100 byte.

Tại máy chủ, toàn bộ 100 byte đã được nhận. Gói SSL đã cố gắng giải mã gói. Nó tìm thấy một thông điệp SSL hoàn toàn tốt được đóng gói vào 75 byte đầu tiên đã được nhận. Càng xa càng tốt. Sau đó, nó đã cố gắng tìm ra những gì còn lại 25 byte có nghĩa là. Nó cho rằng đó là một thông điệp SSL SECOND và đã cố gắng giải mã nó. Đó là khi nó nghẹt thở và đá ra ngoại lệ khó chịu đó.

Tôi hy vọng cung cấp cho bạn một số manh mối về nội dung cần tìm trong mã của bạn.

1

Tôi đã tìm thấy lỗi này nếu tôi trình bày chứng chỉ ứng dụng khách không được hỗ trợ. Xóa "-Djavax.net.ssl.keyStore" và kết nối không có chứng chỉ ứng dụng khách.

Xem thêm http://feed.askmaclean.com/archives/secure-java-connections-by-default.html:

Hỗ trợ cho các phiên bản khác nhau TLS khác dựa trên phiên bản JRE sử dụng. Đảm bảo bạn biết khả năng của JDK bạn đang sử dụng trước khi hạn chế các phiên bản TLS cụ thể. Khi lần đầu tiên chạy thử nghiệm ở trên, Eclipse đã sử dụng JRE 1.6.0_45 thay vì JRE 1.8.0_65 mà tôi mong đợi và đang kết nối bằng cách sử dụng mật mã TLSv1.0.Khi Máy chủ MySQL được định cấu hình để chỉ cho phép TLSv1.1 và TLSv1.2, tôi đã nhận được Ngoại lệ sau:

Gây ra bởi: javax.net.ssl.SSLException: Phiên bản bản ghi không được hỗ trợ Unknown-0.0 tại com.sun.net .ssl.internal.ssl.InputRecord.readV3Record (InputRecord.java:504)

Việc sử dụng các JRE cũ hơn cần được đánh giá trước khi tắt TLSv1.0 - may mắn thay, PERFORMANCE_SCHEMA giúp bạn dễ dàng khảo sát các ứng dụng khách JRE mà không phải kiểm tra mọi ứng dụng máy chủ.