특히이 웹 사이트 ( https://elearning.utp.edu.my/)에 HTTPS 연결을 설정하고 싶었습니다.
SSL 도구에서 웹 사이트가 Entrust_L1K 인증서를 사용했는지 확인한 다음 Chrome 브라우저에서 인증서 파일을 내 보냅니다.
Android 개발자 웹 사이트에서 제공하는 코드를 사용해 보았습니다.
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = mContext.getResources().openRawResource(R.raw.entrust_l1k);
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca = " + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setConnectTimeout(7000);
urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);
urlConnection.connect();
int responseCode = urlConnection.getResponseCode();
switch (responseCode) {
case HttpsURLConnection.HTTP_OK:
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
default:
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
그러나 여전히 다음 오류 코드가 나타납니다.
W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Stack Overflow에서 여러 솔루션을 시도했습니다.
모든 인증서를 신뢰하지 않고 HTTPS에 연결하는 모범 사례를 배우고 싶습니다. 누구든지 나를 안내해 주시면 감사하겠습니다.
수정 1 : Firefox를 사용하여 "로그인"을 클릭하면 "elearning.utp.edu.my가 유효하지 않은 보안 인증서를 사용합니다."라는 경고 메시지가 표시됩니다. 그러나 Chrome을 사용하여 웹 사이트에 "보안"연결을 설정할 수 있습니다. 웹 사이트는 다음과 같습니다 : https://elearning.utp.edu.my/login/index.php
L1K
인증서는에 의해 서명 Root G2
키 저장소 / 신뢰 관리자에게뿐만 아니라 그것을 추가해야하므로, 인증서 :
caInput = mContext.getResources().openRawResource(R.raw.entrust_root_g2);
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca = " + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
// Use the same keystore.
// Mind the different alias.
keyStore.setCertificateEntry("ca2", ca);
을 SSLContext
연결에 연결해야합니다. 연결 개체를 인스턴스화 한 후 바로 수행하고 싶을 것입니다.
urlConnection.setSSLSocketFactory(context.getSocketFactory());
참고 : 특정 웹 사이트에 연결하겠다고했지만이 TLS 구성은 다른 인증서를 거부합니다. 예를 들어 URL을 https://stackoverflow.com/
TLS 핸드 셰이크 로 변경 하면 실패합니다. 사용자 지정 인증서와 기본 인증서를 수락 하려면 https://stackoverflow.com/a/24561444/2657100을 참조 하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다