안드로이드 HTTPS WebView 질문드립니다

zsef123의 이미지

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(정확히는 학교 홈페이지에서 사용하는) 인증서 를 적용시킬 방법이 없을까요

zsef123의 이미지

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);
            }

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.