Tôi đang sử dụng HttpClient trên Android để kết nối với https://someUrl.com/somePath. Vấn đề là chứng chỉ của trang web là dành cho * .someUrl.com, không phải someUrl.com, vì vậy tôi nhận được một SSLException. Lame trên một phần của trang web, có, nhưng trừ khi tôi có thể làm cho nó cố định, tôi bị mắc kẹt. Có cách nào tôi có thể nhận HttpClient để thư giãn và chấp nhận chứng chỉ?Android HttpClient - tên máy chủ trong chứng chỉ không khớp với <example.com>! = <*. Example.com>
Trả lời
Đây là của tôi (chỉnh sửa) giải pháp:
class MyVerifier extends AbstractVerifier {
private final X509HostnameVerifier delegate;
public MyVerifier(final X509HostnameVerifier delegate) {
this.delegate = delegate;
}
@Override
public void verify(String host, String[] cns, String[] subjectAlts)
throws SSLException {
boolean ok = false;
try {
delegate.verify(host, cns, subjectAlts);
} catch (SSLException e) {
for (String cn : cns) {
if (cn.startsWith("*.")) {
try {
delegate.verify(host, new String[] {
cn.substring(2) }, subjectAlts);
ok = true;
} catch (Exception e1) { }
}
}
if(!ok) throw e;
}
}
}
public DefaultHttpClient getTolerantClient() {
DefaultHttpClient client = new DefaultHttpClient();
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client
.getConnectionManager().getSchemeRegistry().getScheme("https")
.getSocketFactory();
final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();
if(!(delegate instanceof MyVerifier)) {
sslSocketFactory.setHostnameVerifier(new MyVerifier(delegate));
}
return client;
}
Nó có lợi thế là không thay đổi hành vi mặc định trừ khi có một miền ký tự đại diện, và trong trường hợp đó nó xác nhận lại như miền 2 phần (ví dụ: someUrl.com) là một phần của chứng chỉ, nếu không thì ngoại lệ ban đầu sẽ bị thu hồi. Điều đó có nghĩa là các chứng chỉ thực sự không hợp lệ sẽ vẫn thất bại.
Nếu muốn *.someUrl.com
, thì có vẻ như bạn chỉ có thể cung cấp cho nó www.someUrl.com/somePath
thay vì someUrl.com/somePath
.
Nope. www.someUrl.com chuyển hướng đến một sốUrl.com – noah
Tôi cho rằng đó là vô ích, sau đó. Bạn có thực sự cần https không? Tôi đoán vậy, nhưng điều đó sẽ làm cho cuộc sống dễ dàng hơn nhiều. –
Đây là giải pháp tạm thời tuyệt vời khi trang web KHÔNG thực hiện chuyển hướng! –
BouncyCastle trên Android quá cũ và không nhận dạng được chứng chỉ ký tự đại diện.
Bạn có thể viết X509TrustManager của riêng mình để kiểm tra ký tự đại diện.
hoặc bạn có thể tắt kiểm tra chứng chỉ hoàn toàn nếu bạn có thể chấp nhận rủi ro. Xem câu hỏi này,
Trên thực tế ZZ, nếu OP là chính xác về tên của trang web và cấu trúc của chứng chỉ thì thông báo lỗi là chính xác: **. SomeUrl.com * được cho là khớp với www.someUrl.com và anything.someUrl. com, nhưng * không * someUrl.com hoặc this.that.someUrl.com. –
nếu bạn sử dụng một WebView chỉ cần gọi
webview.clearSslPreferences();
để bỏ qua lỗi SSL
- 1. Tên máy chủ trong chứng chỉ không khớp?
- 2. tên máy chủ không khớp với chứng chỉ máy chủ - không thể gửi email
- 3. Amazon S3 - tên máy chủ không khớp với chứng chỉ máy chủ (OpenSSL :: SSL :: SSLError) + đường ray
- 4. Địa chỉ IP làm tên máy chủ (CN) khi tạo chứng chỉ? (HTTPS hostname sai: nên <ipAddress>)
- 5. Máy chủ SQL không thể tìm thấy Chứng chỉ
- 6. "javax.net.ssl.SSLException: Không đáng tin cậy chứng chỉ máy chủ" ngoại lệ trong Android
- 7. Chứng chỉ SSL Máy chủ Tự động/Máy chủ Tomcat
- 8. Tệp chứng chỉ Apache HttpClient và PEM
- 9. svn: URL <foo> của dierctory <foo> hiện không khớp với URL mong muốn <foo>
- 10. Android HttpClient gửi yêu cầu tới máy chủ qua USB
- 11. sendmail: OpenSSL :: SSL :: SSLError: tên máy chủ không khớp
- 12. Java Sign jars với chứng chỉ máy chủ
- 13. Chứng chỉ SSL có bị ràng buộc với địa chỉ IP của máy chủ không?
- 14. Thẻ máy chủ không được chứa <% ... %> cấu trúc
- 15. Chứng chỉ SSL không khớp trong IE 7+, OK trong Firefox 3.6+
- 16. SSL-Chứng chỉ máy chủ có liên kết với một máy cụ thể không?
- 17. Chứng chỉ SSL đơn trên nhiều máy chủ
- 18. Chỉ dẫn tên máy chủ (SNI) trên Java
- 19. EJS: <% = so với <% -
- 20. Thay thế không được chấp nhận <: <Chứng thực loại khai man trong Scala 2.10
- 21. Gọi điện thoại đến máy chủ HTTPS với chứng chỉ tự ký không thành công
- 22. nhận dạng mã số <name> không khớp với bất kỳ chứng chỉ ký mã hợp lệ, không hết hạn hợp lệ
- 23. Sử dụng cURL với SNI (Chỉ dẫn tên máy chủ)
- 24. Chứng thực lẫn nhau với chứng chỉ x509 bằng cách sử dụng HttpClient 4.0.1
- 25. javax.net.ssl.sslpeerunverifiedexception không có chứng chỉ ngang hàng
- 26. Lỗi IE8 với Chứng chỉ
- 27. Sử dụng chứng chỉ Wcf SSl trên Tcp mà không có chứng chỉ ứng dụng khách (chỉ phía máy chủ)
- 28. Lỗi Java HttpClient không tìm thấy chứng chỉ SSL, sử dụng chứng chỉ dưới dạng Chuỗi trong mã?
- 29. ZeroMQ, Máy khách <-> Máy chủ, truyền thông hai hướng có thể với chỉ có khách hàng kết nối với máy chủ lưu trữ?
- 30. Thiết lập Netty với SSL Hand-2 chiều (chứng chỉ máy khách và máy chủ)
Tôi đã thử sử dụng ở trên, nhưng đôi khi có được các ngoại lệ tràn ngăn xếp - phương thức verify() không bao giờ ngừng đệ quy. Trong số hàng trăm nghìn lượt cài đặt, nó xảy ra khoảng 80 lần một tuần. Bạn đã thấy bất kỳ vấn đề với điều này? – user291701
@ user291701 Tôi đã chỉnh sửa mã để thử và khắc phục sự cố của bạn. Tôi đoán rằng vấn đề là bạn sẽ thiết lập trình xác minh trên cùng một nhà máy một lần nữa, do đó, nó kết thúc bằng cách ủy quyền cho chính nó bằng cách nào đó ... Hãy tự do chỉnh sửa câu trả lời của tôi nếu bạn tìm thấy một cách tốt hơn. – noah
Trong mọi trường hợp, tôi đang đối mặt 'máy chủ không thể phục vụ yêu cầu vì lỗi loại phương tiện không được hỗ trợ'. Không nhận được bất kỳ đầu mối về lý do này. –