안드로이드 SSL인증서 오류 

 

참조사이트 : https://developer.android.com/training/articles/security-ssl

 

에러내용 : 

 E Conscrypt: ------------------Untrusted chain: ----------------------

 E Conscrypt: == Chain0 ==
 E Conscrypt: Version: 3
 E Conscrypt: Serial Number: 1

 

원인 : 

 

중개(체인) 인증서를 정상적으로 확인 하지 못해 신뢰하지 못하는 인증기관으로 인식

웹상에서는 문제없이 동작하나 모바일단말에서는 

서버 인증서의 발급자를 확인하지 못하는 경우가많아 중개(체인) 인증서가 필요함.

 

해결방법

1. 인증서 재발행 

>https://www.ibm.com/support/knowledgecenter/ko/SSHS8R_7.1.0/com.ibm.worklight.installconfig.doc/admin/c_ssl_config.html#c_ssl_config__self-signed_certs_vs_self-signed_CAs

 

위의 링크를 참조하여 제시된 해결방법에 따라 적용.

 

 

위과 수정전 아래가 수정 후
 
 

2. 앱상에서 해당 인증서를 가지고 직접 인증 

CertificateFactory cf = CertificateFactory.getInstance("X.509");

Certificate ca;

 

String certificateString = "-----BEGIN CERTIFICATE-----\n" +

                            "MIIG3DCCBcSgAwIBAgIMCtlb/Nurv8TlrjaNMA0GCSqGSIb3DQEBCwUAMGYxCzAJ\n" +

                            "BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTwwOgYDVQQDEzNH\n" +

                            "nlc/e3o5NtzmUPuuEnfbxPunmNX9w6v0WWppv8kkT3s=\n" +

                            "-----END CERTIFICATE-----";

ByteArrayInputStream derInputStream = new ByteArrayInputStream(certificateString.getBytes());

ca = cf.generateCertificate(derInputStream);

 

String keyStoreType = KeyStore.getDefaultType();

KeyStore keyStore = KeyStore.getInstance(keyStoreType);

keyStore.load(null, null);

keyStore.setCertificateEntry("ca", ca);

 

registry.register(new Scheme("https", new MySSLSocketFactory(keyStore), httpSport));

 

---------MysslSocketFactory------

 

class MySSLSocketFactory extends SSLSocketFactory {

    SSLContext sslContext = SSLContext.getInstance("TLS");

 

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {

        super(truststore);

 

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");

        tmf.init(truststore);

 

        sslContext.init(null, tmf.getTrustManagers(), null);

    }

 

    @Override

    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {

        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);

    }

 

    @Override

    public Socket createSocket() throws IOException {

        return sslContext.getSocketFactory().createSocket();

    }

}

 

일반적으로 인증서 파일을 저장하여 파일로 읽어서 사용하는데, 별 차이는 없어 보여 String을 직접 넣었네요. 

2번째 방법 보단 인증서교체를 통한 방법이 좋습니다. 

 

그럼 도움이 됐길. !