Tôi đang phát triển một ứng dụng web được truy cập bởi ứng dụng ODK Android ( https://opendatakit.org/ ). Công việc tôi đang làm yêu cầu kết nối https. Tuy nhiên, ODK trả lại javax.net.ssl.SSLPeerUnverifiedException
. Làm cách nào để tạo được sự tin tưởng kỳ lạ với localhost
Kết nối SSL?
Thêm mã này để tin cậy tất cả các chứng chỉ -
import java.io.IOException;
import java.net.Socket;
nhập java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
nhập org.apache.http.conn.ssl.SSLSocketFactory;
lớp công khai MySSLSocketFactory mở rộng SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
công khai MySSLSocketFactory(KeyStore Truststore) ném NoSuchAlgorithmException, KeyManagerException, KeyStoreException, UnrecoverableKeyException {
siêu (cửa hàng tin cậy);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) ném Chứng chỉ ngoại lệ {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) ném Chứng chỉ ngoại lệ {
}
công khai X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Ghi đè
public Socket createSocket(Socket socket, String Host, int port, boolean autoClose) ném IOException, UnknownHostException {
trả về sslContext.getSocketFactory().createSocket(socket, Host, port, autoClose);
}
@Ghi đè
Ổ cắm công cộng createSocket() ném IOException {
trả về sslContext.getSocketFactory().createSocket();
}
}
và sử dụng phương pháp này để nhận HTTPClient -
HttpClient getNewHttpClient công khai() {
thử {
KeyStore TrustStore = KeyStore.getInstance(KeyStore.getDefaultType());
TrustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Thông số HttpParams = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
Sổ đăng ký Đề án đăng ký = Đề án mớiRegistry();
register.register(Lược đồ mới("http", PlainSocketFactory.getSocketFactory(), 80));
register.register(Lược đồ mới("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, register);
trả về DefaultHttpClient mới (ccm, thông số);
} catch (Exception e) {
trả về DefaultHttpClient mới();
}
}
Điều này sẽ tin tưởng tất cả các chứng chỉ.
chúc mừng :)
Làm cách nào để tạo một ứng dụng ODK Android (có mã nguồn mà tôi không thể sửa đổi) tin cậy vào chứng chỉ giả từ localhost? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/27706853/
Tôi là một lập trình viên xuất sắc, rất giỏi!