2017-10-20 5 views
2

내 네트워크 코드는 NDK (cURL + OpenSSL)로 작성되었으며 안드로이드의 인증서 저장소에있는 인증서를 SSL 연결을위한 클라이언트 인증서로 사용하고 싶습니다. 또한 사용자에게 사용 가능한 인증서 목록을 제공하여 연결 인증서를 선택할 수 있습니다. 아쉽게도 키 저장소에서 인증서를 가져올 수 없습니다."자격증 명 저장소"에서 인증서를로드하는 방법은 무엇입니까?

Android 기기 (5.0.2)에서 "자격증 명 저장소"(설정 -> 보안 -> ...)에 클라이언트 인증서를 설치했지만 Java에서 액세스 할 수 없습니다. 나는 다음 코드를 호출하려고했으나 인증서가 자격 증명 저장 장치에 설치되어있는 수치를 입력받은 키 저장, empy입니다 : 내가 잘못 뭐하는 거지

//KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 

Enumeration<String> aliases = ks.aliases(); 
while(aliases.hasMoreElements()) { 
    String alias = (String)aliases.nextElement(); 
    Log.i("app", "alias name: " + alias); 
    Certificate certificate = ks.getCertificate(alias); 
    Log.i("app", certificate.toString()); 
} 

? 이 같은

답변

0

사용자 자격 증명 안드로이드 KeyChain를 통해 제공하지 안드로이드 키 스토어는

키 체인 클래스는 개인 키와 해당 인증서 체인에 대한 액세스를 제공합니다 자격증 명 저장소

choosePrivateKeyAlias을 사용하여 사용자에게 인증서 선택을 요청하십시오. 시스템은 사용자가 별칭을 선택하고 콜백을 통해 사용자에게 전송할 활동을 시작합니다. 그러면 키 및 대응하는 인증 체인을 복구하고 getPrivateKeygetCertificate를 사용

KeyChain.choosePrivateKeyAlias(activity, new KeyChainAliasCallback() { 
      public void alias(String alias) {    
       //do something with the selected alias      
      }    
     }, 
     new String[] { KeyProperties.KEY_ALGORITHM_RSA, "DSA"}, // List of acceptable key types. null for any 
     null,      // issuer, null for any 
     null,      // host name of server requesting the cert, null if unavailable 
     -1,       // port of server requesting the cert, -1 if unavailable 
     "");       // alias to preselect, null if unavailable 

PrivateKey privateKey = KeyChain.getPrivateKey(activity, alias); 
X509Certificate chain[] = KeyChain.getCertificateChain(activity, alias); 
0

시도 뭔가 : 장치에 설치

X509TrustManager manager = null; 
FileInputStream fs = null; 

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 

try 
{ 
    fs = new FileInputStream(System.getProperty("javax.net.ssl.trustStore")); 
    keyStore.load(fs, null); 
} 
finally 
{ 
    if (fs != null) { fs.close(); } 
} 

trustManagerFactory.init(keyStore); 
TrustManager[] managers = trustManagerFactory.getTrustManagers(); 

for (TrustManager tm : managers) 
{ 
    if (tm instanceof X509TrustManager) 
    { 
     manager = (X509TrustManager) tm; 
     break; 
    } 
}