안드로이드 HTTPS WebView 질문드립니다
public class NewSSLSocketFactory extends SSLSocketFactory {
private SSLContext sslContext=SSLContext.getInstance("TLS");;
private X509Certificate cert;
private PrivateKey privateKey;
public PrivateKey getPrivateKey() {
return privateKey;
}
public X509Certificate getCert() {
return cert;
}
private KeyStore setCert(){
String skuCertBin ="-----BEGIN CERTIFICATE-----\n"+
"SOMETHING CODE"+
"-----END CERTIFICATE-----";
KeyStore trustStore=null;
try {
ByteArrayInputStream derInputStream = new ByteArrayInputStream(skuCertBin.getBytes());
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
String alias = cert.getSubjectX500Principal().getName();
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
trustStore.setCertificateEntry(alias, cert);
Key key = trustStore.getKey(alias, null);
if ( key instanceof PrivateKey)
privateKey = (PrivateKey)key;
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
}
return trustStore;
}
public NewSSLSocketFactory() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
super();
KeyStore trustStore = setCert();
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trustStore);
sslContext.init(null, tmf.getTrustManagers(), null);
}
// UNDER DEFAULT METHODS
}
클래스를 만들어 HttpsURLConnection.setDefaultSSLSocketFactory(new NewSSLSocketFactory()); 를 호출하는 식으로
Jsoup를 통해 안드로이드 앱에서 파싱을 하고 있습니다.
자바스크립트 사용때문에 WebView를 활용하고자 하는데 WebView에 인증서를 적용 시키는 방법이 아무리 찾아도 안나와서 질문 드립니다.
@Override
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
Log.d("WebViewCheck", "onReceivedClientCertRequest Call");
request.proceed(privateKey, cert);
}
위의 method는 Log가 찍히질 않는걸로 보아 진입이 안되고
가장 많이 보이는 해결책인 onReceivedSslError method의 경우에는 경고창이 떠서 사용을 하지못합니다.
WebView에 self-signed(정확히는 학교 홈페이지에서 사용하는) 인증서 를 적용시킬 방법이 없을까요


수정이 안되네요;;
public class NewSSLSocketFactory extends SSLSocketFactory { private SSLContext sslContext=SSLContext.getInstance("TLS");; private X509Certificate cert; private PrivateKey privateKey; public PrivateKey getPrivateKey() { return privateKey; } public X509Certificate getCert() { return cert; } private KeyStore setCert(){ String skuCertBin ="-----BEGIN CERTIFICATE-----\n"+ "MIIE/DCCA+SgAwIBAgIQUwJ6D9WOZsKmCXsEdk/waTANBgkqhkiG9w0BAQsFADBE\n"+ "MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMU\n"+ "R2VvVHJ1c3QgU1NMIENBIC0gRzMwHhcNMTUwNDE0MDAwMDAwWhcNMTcwNDEzMjM1\n"+ "OTU5WjB+MQswCQYDVQQGEwJLUjEOMAwGA1UECBMFU2VvdWwxFDASBgNVBAcUC1Nl\n"+ "b25nYnVrLWd1MR0wGwYDVQQKFBRTRU9LWUVPTkcgVU5JVkVSU0lUWTERMA8GA1UE\n"+ "CxQIRGV2IFRlYW0xFzAVBgNVBAMUDiouc2t1bml2LmFjLmtyMIIBIjANBgkqhkiG\n"+ "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzIDsm/zYGvJ4CLBJDhOd5w6X93InwxZVCp9C\n"+ "9JHXISNQi/cPG1qJZDt8uyKR+FJ8VsidMHm3oO4gsXr69hix1zNphJ7W9kFEV0kj\n"+ "gLxoA5LgNeByf3OCbYNB1WMW+tF94i6/CnTVI42V3MgJewyJ7GOtlwuOl+vppw6a\n"+ "Y6zJaKdcxpw2qkJXgJrT18fg/gC6nSUprWs676DxZvcO1SvvAhuO7nd6iSUEySdZ\n"+ "W5vE5sogUXbGiaQD+/reLgufcunX1y+ZQAqoNJt85LSs4v5J5sLLuv1/mpDQEyBo\n"+ "c6/WdAnXytYYQVV4fz95XujWZPMsi3lT2spO+kYAJo23bXn1OQIDAQABo4IBrjCC\n"+ "AaowJwYDVR0RBCAwHoIOKi5za3VuaXYuYWMua3KCDHNrdW5pdi5hYy5rcjAJBgNV\n"+ "HRMEAjAAMA4GA1UdDwEB/wQEAwIFoDArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8v\n"+ "Z24uc3ltY2IuY29tL2duLmNybDCBnQYDVR0gBIGVMIGSMIGPBgZngQwBAgIwgYQw\n"+ "PwYIKwYBBQUHAgEWM2h0dHBzOi8vd3d3Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMv\n"+ "cmVwb3NpdG9yeS9sZWdhbDBBBggrBgEFBQcCAjA1DDNodHRwczovL3d3dy5nZW90\n"+ "cnVzdC5jb20vcmVzb3VyY2VzL3JlcG9zaXRvcnkvbGVnYWwwHQYDVR0lBBYwFAYI\n"+ "KwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFNJv95b0hT9yPDB9I9qFeJuj\n"+ "fFp8MFcGCCsGAQUFBwEBBEswSTAfBggrBgEFBQcwAYYTaHR0cDovL2duLnN5bWNk\n"+ "LmNvbTAmBggrBgEFBQcwAoYaaHR0cDovL2duLnN5bWNiLmNvbS9nbi5jcnQwDQYJ\n"+ "KoZIhvcNAQELBQADggEBAMbyjW60yINSiCgt+4OVC3Md3riCg0NWfAb02zs0KdgN\n"+ "px7qtTQkqb5WhbiDauU9RjicXShT3noYnkvfFuagknWbbSl/ks3OvdKh/VXQEZjM\n"+ "PGcgsjDyg8EiGOXRjmG+q7UmkgS6YjBS9b6QC93J0rHKe3DqNHl7c+I917rJiAbh\n"+ "twL561RhibAiQybRUqO5CoAukMga6u1ozZfGwWs3KxtAcyPHi+cCkLSGbrzvGx0n\n"+ "kOIjonO8GIEJX1FPSeBh4X2amK4f7IluvfZ7l9zLVMw9OV3Dhmju68/gNBr4X8AU\n"+ "h1V4RRxYnl7UqZu710ps4f3KPPaFgNDBk5q9VOGkE5Y=\n"+ "-----END CERTIFICATE-----"; KeyStore trustStore=null; try { ByteArrayInputStream derInputStream = new ByteArrayInputStream(skuCertBin.getBytes()); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream); String alias = cert.getSubjectX500Principal().getName(); trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); trustStore.setCertificateEntry(alias, cert); Key key = trustStore.getKey(alias, null); if ( key instanceof PrivateKey) privateKey = (PrivateKey)key; } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } return trustStore; } public NewSSLSocketFactory() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { super(); KeyStore trustStore = setCert(); TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); tmf.init(trustStore); sslContext.init(null, tmf.getTrustManagers(), null); } }@Override public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) { Log.d("WebViewCheck", "onReceivedClientCertRequest Call"); request.proceed(privateKey, cert); }댓글 달기