Android 기기에 신뢰할 수있는 CA 인증서를 설치하는 방법은 무엇입니까?


134

내 자체 CA 인증서를 만들었으며 이제 장치가 내 인증서를 신뢰하도록 Android Froyo 장치 (HTC Desire Z)에 설치하려고합니다.

Android는의 Java 키 저장소에 CA 인증서를 저장 /system/etc/security/cacerts.bks합니다. 파일을 내 컴퓨터에 복사하고 portecle 1.5를 사용하여 인증서를 추가 한 후 다시 장치로 푸시했습니다.

이제 Android는 파일을 자동으로 다시로드하지 않는 것 같습니다. 장치를 다시 시작해야하는 여러 블로그 게시물을 읽었습니다. 그렇게하면 파일이 원래 파일로 다시 덮어 쓰게됩니다.

다음 시도는 SD 카드에서 인증서를 복사하고 설정 메뉴에서 해당 옵션을 사용하여 인증서를 설치하는 것입니다. 장치에서 인증서가 설치되었다고 알려주지 만 인증서를 신뢰하지 않는 것 같습니다. 또한 키 저장소를 컴퓨터에 복사하려고 할 때도 여전히 원본을 찾습니다 cacerts.bks.

그렇다면 자신의 루트 CA 인증서를 Android 2.2 장치에 신뢰할 수있는 인증서로 설치하는 올바른 방법은 무엇입니까? 프로그래밍 방식으로 수행 할 수 있습니까?


여기서 루팅 된 전화를 가정 할 수 있습니다. :)
Björn Marschollek

답변:


116

Android KitKat에 앞서 새로운 인증서를 설치하려면 기기를 루팅해야합니다.

Android KitKat (4.0)에서 Nougat (7.0) 까지 가능하고 쉽습니다. 루트가없는 장치에 Charles Web Debbuging Proxy 인증서를 설치하고 SSL 트래픽을 스니핑 할 수있었습니다.

http://wiki.cacert.org/FAQ/ImportRootCert 에서 추출

Android 버전 Gingerbread & Froyo를 사용하는 Android 버전 4.0 이전에는 기본적으로 모든 CA ( 'system') 인증서를 신뢰하는 신뢰 저장소를 포함하는 단일 읽기 전용 파일 (/system/etc/security/cacerts.bks)이있었습니다. 기계적 인조 인간. 시스템 앱과 Android SDK로 개발 된 모든 애플리케이션이 모두 사용합니다. Android Gingerbread, Froyo, ...에 CAcert 인증서를 설치할 때 다음 지침을 사용하십시오.

Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean'및 Android 4.4 'KitKat')부터 시스템 신뢰 인증서는 '/ system / etc / 폴더의 (읽기 전용) 시스템 파티션에 있습니다. 보안 / '개별 파일로. 그러나 사용자는 이제 '/ data / misc / keychain / certs-added'에 저장 될 자신의 '사용자'인증서를 쉽게 추가 할 수 있습니다.

시스템 설치 인증서는 설정-> 보안-> 인증서-> '시스템'섹션의 Android 장치에서 관리 할 수있는 반면 사용자가 신뢰할 수있는 인증서는 '사용자'섹션에서 관리됩니다. 사용자가 신뢰할 수있는 인증서를 사용하는 경우 Android는 Android 기기 사용자에게 추가적인 안전 조치를 강요하도록합니다. 사용자 제공 인증서를 사용할 때는 PIN 코드, 패턴 잠금 또는 기기 잠금을 해제하기위한 비밀번호를 사용해야합니다.

CAcert 인증서를 '사용자가 신뢰할 수있는'인증서로 설치하는 것은 매우 쉽습니다. '신뢰할 수있는 시스템'인증서로 새 인증서를 설치하려면 더 많은 작업이 필요하고 루트 액세스가 필요하지만 Android 잠금 화면 요구 사항을 피할 수 있다는 장점이 있습니다.

Android N부터는 조금 더 어려워집니다. Charles 프록시 웹 사이트 에서이 추출을 참조하십시오 .

Android N부터 Charles SSL 프록시에서 생성 한 SSL 인증서를 신뢰하려면 앱에 구성을 추가해야합니다. 즉, 제어하는 ​​앱에서만 SSL 프록시를 사용할 수 있습니다.

Charles를 신뢰하도록 앱을 구성하려면 앱에 네트워크 보안 구성 파일을 추가해야합니다. 이 파일은 시스템 기본값을 재정 의하여 앱이 사용자가 설치 한 CA 인증서 (예 : Charles Root Certificate)를 신뢰할 수 있도록합니다. 프로덕션 빌드가 기본 신뢰 프로파일을 사용하도록 애플리케이션의 디버그 빌드에만 적용되도록 지정할 수 있습니다.

res / xml / network_security_config.xml 파일을 앱에 추가하십시오 :

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

그런 다음 앱 매니페스트에이 파일에 대한 참조를 다음과 같이 추가하십시오.

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>

1
/system/etc/security/cacerts/*.0AVD를 재부팅 / 다시 시작한 후에도 내 사용자 지정 인증서 파일 ( )이 유지되지 않으므로이 솔루션은 성공하지 못했습니다.
fikr4n

@BornToCode 흥미 롭다 – 나는 AVD를 거의 사용하지 않으므로이 한계를 알지 못했다
Dean Wild

설정 debug-overrides이 표시 network_security_config됩니다. 이는 디버그 변형 만 타겟팅 한다는 의미 입니까? UAT 변형과 같은 다른 변형이 있으면 작동하지 않습니까?
Isaac

1
@Isaac 이것은 debuggable = true 인 모든 변형에 적용됨을 의미합니다
Dean Wild

1
@ DeanWild-정말 고마워요! 나는 이것을 영원히 작동 시키려고 노력했고 내 응용 프로그램을 디버깅 할 때 "잘못된 SSL 인증서"를 계속 얻었습니다. 이 솔루션은 Samsung Note 8의 Android 9에서 실행되는 Android 앱의 매력처럼 작동했습니다.
Dave Black

43

이에 대한 답을 찾으려고 많은 시간을 보냈습니다 (StartSSL 인증서를 보려면 Android가 필요합니다). 결론 : Android 2.1 및 2.2에서는 인증서를 가져올 수 있지만 WiFi 및 VPN에서만 사용할 수 있습니다. 신뢰할 수있는 루트 인증서 목록을 업데이트하기위한 사용자 인터페이스는 없지만 해당 기능 추가에 대한 설명이 있습니다. cacerts.bks 파일을 수동으로 업데이트하고 교체하기위한 안정적인 해결 방법이 있는지 확실하지 않습니다.

세부 사항 및 링크 : http://www.mcbsys.com/techblog/2010/12/android-certificates/ . 이 게시물에서 Android 버그 11231에 대한 링크를 참조하십시오. 해당 버그에 투표 및 쿼리를 추가 할 수 있습니다.


3
Android 개발자가 내 쿼리에 다시 응답했습니다. cacerts.bks 업데이트 : "2.3 이후의 모든 릴리스에서 루팅되지 않은 전화기에서 cacerts.bks를 업데이트하려면 OTA가 필요합니다." code.google.com/p/android/issues/detail?id=11231#c25 . OTA = 무선 으로요? 이것이 휴대폰이 공장 cacerts.bks로 계속 돌아가는 이유 일 수 있습니까? 그러나 루트 액세스 권한이 있으면 소스 코드를 다운로드하고 인증서를 추가 한 다음 certimport.sh 스크립트를 사용하여 cacerts.bks를 빌드 할 수 있어야합니다. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry

감사. 이것은 분명히 듣고 싶었던 대답이 아니지만 올바른 것으로 보입니다. 전체 시스템을 업데이트하지 않고 인증서를 설치하는 방법이 있기를 바랍니다. 물론 새로운 cacerts.bks를 빌드 할 수 있습니다. 루트 액세스 권한으로 이전 버전을 교체 할 수도 있지만 재부팅 할 때마다 원래 버전으로 되돌아갑니다. 재부팅하지 않으면 Android가 신뢰할 수있는 인증서 파일을 다시로드하지 않는 것으로 보입니다.
Björn Marschollek

27
3.X 및 4.X 플랫폼에 CA 인증서를 설치하는 것은 어떻습니까?
Alok Kulkarni


16

HTTPS 연결에 인증서가 필요한 경우 .bks 파일을 응용 프로그램에 원시 리소스로 추가하고 DefaultHttpConnection을 확장하여 인증서가 HTTPS 연결에 사용되도록 할 수 있습니다.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

답장을 보내 주셔서 감사합니다. 실제로 장치의 모든 응용 프로그램이 인증서를 신뢰하는 방식으로 인증서를 설치해야합니다. 기본적으로 인증서를 신뢰하지 않는 CAcert와 같은 일부 소규모 CA에 대해서도 동일한 문제가 발생합니다. 인증서를 어떻게 설치합니까?
Björn Marschollek

당신은 시도해 봤어 : 설정 -> 보안 -> SD 카드에서 설치
알렉산더 에거


2
나는 같은 문제가 있습니다 .Adroid 2.3.3 응용 프로그램을 사용하여 .PDX X509 인증서를로드 한 다음 SSL 연결을 만들어야합니다. 주석이 달린 코드로 누군가 나를 도울 수 있습니까?
AndroidLearner

9

여기에 링크 된 안내서 는 사용자 정의 SSL 커넥터를 프로그래밍 할 필요없이 원래 질문에 대답 할 것입니다.

다른 버전의 Android 기기 (다른 기기 중에서도)에 신뢰할 수있는 CA 인증서를 설치하는 과정을 안내하는 루트 인증서 가져 오기에 대한 자세한 방법 안내서를 찾았습니다.

기본적으로 다음이 필요합니다.

  1. 다운로드 : 휴대 전화에서 cacerts.bks 파일.

    adb 풀 /system/etc/security/cacerts.bks cacerts.bks

  2. 허용하려는 인증 기관에서 .crt 파일을 다운로드하십시오.

  3. BouncyCastle Provider를 사용하여 컴퓨터에서 cacerts.bks 파일을 수정하십시오.

  4. cacerts.bks 파일을 전화기에 다시 업로드하고 재부팅하십시오.

이전 안드로이드 폰을 업데이트하는 단계별 세부 정보는 다음과 같습니다 .Android-4.0 이전 기기에서 HTTPS 보안 인증 기관 키 저장소를 업데이트하는 방법


5

여기 또는 관련 스레드에 게시 된 것보다 훨씬 쉬운 해결책이 있습니다. 웹보기를 사용하는 경우 (있는 그대로) JAVASCRIPT 함수를 실행하여이를 달성 할 수 있습니다. 웹뷰를 사용하지 않는 경우이 목적으로 숨겨진 것을 만들 수 있습니다. 다음은 ca 설치를 시작하기 위해 거의 모든 브라우저 (또는 웹보기)에서 작동하는 기능입니다 (일반적으로 Droid를 포함하여 공유 OS 인증서 저장소를 통해). iFrames와 함께 멋진 트릭을 사용합니다. 이 함수에 URL을 .crt 파일로 전달하십시오.

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

최신 정보:

iframe 트릭은 API 19 이상의 Droid에서 작동하지만 이전 버전의 웹보기는 이와 같이 작동하지 않습니다. 일반적인 아이디어는 여전히 작동합니다-웹보기로 파일을 다운로드 / 연 다음 OS가 인수하도록하십시오. 이것은 더 쉽고 보편적 인 솔루션 일 수 있습니다 (실제 Java에서는).

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

instance_는 활동에 대한 참조입니다. 인증서의 URL을 알고 있으면 완벽하게 작동합니다. 그러나 필자의 경우 서버 측 소프트웨어를 사용하여 동적으로 해결합니다. 리디렉션 URL을 인터셉트하고 스레딩 합병증을 기반으로 충돌을 일으키지 않는 방식으로 이것을 호출하기 위해 상당한 양의 추가 코드를 추가해야했지만 여기에 모든 혼란을 추가하지는 않습니다 ...


3

startssl 인증서를 사용하기 위해 수행 한 작업은 매우 쉽습니다. (내 뿌리 전화에서)

/system/etc/security/cacerts.bks를 내 sdcard에 복사했습니다.

http://www.startssl.com/certs/ca.crthttp://www.startssl.com/certs/sub.class1.server.ca.crt 다운로드

portecle.sourceforge.net으로 이동하여 웹 페이지에서 직접 portecle을 실행했습니다.

내 sdcard에서 cacerts.bks 파일을 열었습니다 (암호를 요청할 때 아무것도 입력되지 않음)

portacle에서 import를 선택하고 sub.class1.server.ca.crt를여십시오. 내 경우에는 이미 ca.crt가 있지만 설치해야 할 수도 있습니다.

키 저장소를 저장하고 baxck를 /system/etc/security/cacerts.bks에 복사했습니다 (필요한 경우를 대비하여 먼저 해당 파일의 백업을 작성했습니다)

휴대 전화를 재부팅하면 이제는 startssl 인증서를 사용하여 오류없이 사이트를 방문 할 수 있습니다.


: 모질라에서 새로운 불신 새로운 WoSign 및 StartCom 인증서 .
jww

cacert.bks를 루트가 아닌 장치에 다시 넣는 방법에 대한 아이디어가 있습니까?
Bob

1

이 단계는 저에게 효과적이었습니다.

  1. 모바일 장치에 Dory Certificate Android 앱을 설치하십시오 : https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=ko
  2. USB 케이블을 사용하여 모바일 장치를 랩톱에 연결하십시오.
  3. 내부 전화 메모리에 루트 폴더를 작성하고 해당 폴더에 인증서 파일을 복사 한 후 케이블을 분리하십시오.
  4. Dory Certificate Android 앱을 열고 둥근 [+] 버튼을 클릭 한 다음 올바른 파일 인증서 가져 오기 옵션을 선택하십시오.
  5. 형식을 선택하고 이름 (파일 이름과 동일하게 입력)을 제공 한 다음 인증서 파일을 찾아 [확인]을 클릭하십시오.
  6. 3 장의 카드가 나옵니다. [SIGN CSR] 버튼 만있는 카드를 무시하고 다른 두 카드에서 [INSTALL] 버튼을 클릭했습니다.
  7. 모바일 Chrome (로컬 IIS 웹 서버에서 호스팅 됨)과 voala를 열지 않은 PWA 웹 앱을 새로 고쳤습니다! 크롬 경고 메시지가 없습니다. 녹색 자물쇠가있었습니다. 작동하고있었습니다.

대안으로, 나는 스스로 시도 할 필요가 없지만 따라하기 쉬운이 옵션을 발견했습니다.

마지막으로 관련성이 없지만 로컬 IIS 웹 서버에서 호스팅되는 PWA 응용 프로그램 (웹 사이트)에 대해 자체 서명 된 인증서 (mkcert 포함)를 만들고 설정하려면이 페이지를 따르십시오.

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

감사하고 도움이되기를 바랍니다! :)


0

다음은 기본 제공 기본 인증서 목록에 실제로 인증서를 추가하는 대체 솔루션입니다. HTTPS를 통한 HttpClient를 사용하여 모든 인증서 신뢰

그러나 응용 프로그램에서만 작동합니다. 보안 상 위험하기 때문에 사용자 장치의 모든 응용 프로그램에 대해 프로그래밍 방식으로이를 수행 할 수있는 방법이 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.