안드로이드 사설 인증서 설치 - andeuloideu saseol injeungseo seolchi

Laonbud-Notice

Tech

사설 SSL 인증서를 모바일에서 사용하기

developers 2013. 10. 28. 17:59

사설 SSL의 경우 웹에서는 뭔가 문제가 되는 느낌이 들지만, Mobile에서는 자체 제작한 앱을 사용하게 하는 경우 문제가 되지 않을 수 있습니다. 

Mobile에서 사설 SSL을 사용하려면 먼저 서버에서 생성한 keystore로 부터 cert파일을 생성해야 합니다.

1. Key Store 생성

- 유효한 인증을 가진 private keystore를 생성해야 합니다. 

keytool은 자바에서 제공하는 기본 keystore 생성 프로그램으로 $JAVA_HOME/bin 디렉토리에 위치하고 있습니다.

이때

keytool -export -alias KeystoreAlias -keystore /home/laonbud/test.keystore -file <생성될파일명:ex)cert.cer> 

-storepass keystore패스워드

2. 생성된 certificate 파일을 bouncy castle format으로 변경

-  Bouncy Castle Format은 Android에 기본으로 포함되어 있습니다.

keytool -import -alias KeystoreAlias -file <생성된파일명:ex)cert.cer -keypass "안드로이드인증에서사용할패스워드"

-keystore keystore.bks -storetype BKS -storepass keystore패스워드 

-providerClass org.bouncycastle.jce.provider.BouncyCastleProvider 

-providerpath $PATH_TO_BC/bcprov-jdk16-1.46.jar

이때 중요한 것은 android tool에서 사용하는 bouncy castle format과 맞춰야 한다는 점입니다.

3. DefaultHttpClient를 생성한 certificate에 맞도록 수정

public class CustomHttpClient extends DefaultHttpClient
{
    final Context context;
 
    public CustomHttpClient(Context context)
    {
        this.context = context;
    }
 
    @Override
    protected ClientConnectionManager createClientConnectionManager()
    {
        try
        {
            String defaultType = KeyStore.getDefaultType();
            KeyStore trustedStore = KeyStore.getInstance(defaultType);
            InputStream certificateStream = context.getResources().openRawResource(R.raw.keystore);
            trustedStore.load(certificateStream, "password".toCharArray());
            certificateStream.close();
 
            SSLSocketFactory sslSocketFactory = new SSLSocketFactory(trustedStore);
            sslSocketFactory.setHostnameVerifier((X509HostnameVerifier) SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
 
            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 8080));
            registry.register(new Scheme("https", sslSocketFactory, 8443));
 
            return new SingleClientConnManager(getParams(), registry);
        }
        catch (Exception e)
        {
            throw new AssertionError(e);
        }
    }
}

<참조 : http://ricston.com/blog/tls-apache-tomcat-android/>

*내용 추가

Android 7.0 이상부터는 시스템에 인증서를 설치해야합니다. OpenSSL을 이용하여 인증서를 만드는 방법 인터넷에 많이 있습니다! 그 방법 사용하시면 됩니다!

=========================================

테스트 기기 : Galay S9 (android 9.0)

android에서 proxy를 설정해서 패킷을 burpsuite로 보기위해서는 CA인증서를 설치해야한다.

모바일에서 Proxy를 설정하는 건 iOS 할때 글이 있긴하다. (Andoroid 7.0 이전 버전일 경우는 아래 링크대로 진행하면 된다)

2019/10/21 - [Mobile/iOS] - [iOS] BurpSuite를 이용한 Proxy 설정 (response, SSL 포함)

Android에서 이쪽으로 삽질할 일이 좀 있었어서.. 이런저런 내용들을 좀 정리하고자 한다.

일단 안드로이드 Nougat (Android 7.0) 이후로는 자체 SSL Pinning 기능이 생겼다고 한다. 사용자가 사설 인증서를 설치하면 루트인증서가 아니라 사용자 인증서로 인식한다고 한다.

그래서 1) 시스템인증서로 설치하는 방법이 존재한다. (Burp인증서는 기본적으로 20년 이상 짜리가 생성되는데, 구글에서 Android System Root인증서의 경우 최장 39개월로 정했기 때문이라고 한다. or 권한차이? // 시스템 인증서로 설치하는 방법 참고 블로그 : https://hackcatml.tistory.com/m/37 ) 나는 이 방법이 잘 되지 않아서 사용하지 않았다.

2) PC와 모바일에 같은 버프인증서 설치(?) & frida

음.. 일단 나는 폰에만 인증서를 설치해서 진행했던것 같은데, PC에도 동일한 인증서가 설치되어 있어야한다고 한다. (사실 인가요..?) PC의 인증서와 모바일의 인증서가 같은지 확인할 때는 인증서의 Hash 값을 확인하면 된다.

우선 PC에서 인증서를 받는데는, IE에서 받을 수도 있고, Burp Suite에서도 받을 수 있다. 근데 burp에서 받지말고 IE에서 받는걸 더 추천한다고 한다. (왜일까)

IE에서 인증서를 받고 PC에 설치하는건 아래 블로그에 잘 정리해 두신것 같아서 링크 첨부! ㅎㅎ 

https://darksoulstory.tistory.com/471

Burp Suite CA 인증서 설치

Burp Suite를 통해 HTTPS 웹 사이트를 탐색 할 때, 기본적으로 프록시는 자신의 인증 기관 (CA) 인증서로 서명 된 각 호스트에 대한 SSL 인증서를 생성한다. 이 CA 인증서는 처음 Burp Suite를 실행 할 때 생성되..

darksoulstory.tistory.com

안드로이드 사설 인증서 설치 - andeuloideu saseol injeungseo seolchi

chrome에서는 여기(https://blogger.pe.kr/731) 참고 @.@

아래 사진은 burpsuite 툴에서 받는 방법인데.. 추천하지 않는다고하니.. 알아만 둡시당 구냥..

안드로이드 사설 인증서 설치 - andeuloideu saseol injeungseo seolchi

PC에 설치한 인증서를 모바일에 설치해주는 방법은!!! adb push 인증서이름.cer /sdcard/ 로 넣어주고 내파일 > 내장메모리 > push한 인증서 클릭하여 설치 해주면 설정 > 생체 인식 및 보안 > 기타보안설정 > 인증서 확인 > 사용자 에서 PortSwigger CA 라는 이름의 인증서를 확인할 수 있습니다. 근데 android 7.0부터 사용자 인증서로 인식되면 안된다고들 하는데.. 나는 패킷이 잘 잡혔다. 근데 나중에보니, 시스템 인증서로 인증서가 옮겨갔던데.. frida 코드를 사용했어서 그런건가..?

SSL pinning bypass는 https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/ 이렇게 codeshare에 스크립트들이 잘 공유되어 있다. 이걸로 안되는 앱들도 많지만 ㅠ 이 코드외에도 몇몇 코드들이 있으니 참조하면 된당. 

사실 목적은 SSL pinning bypass 인데 네트워크 문제인지도 모르고 이렇게 인증서를 몇번이나 설치했다가 지웠다가~..~

그리고 BurpSuite도 되도록이면 최신으로 업데이트해서 사용합시다 ㅎㅎ