2013-09-16 1 views
1

Android версии:SSLContext и PKCS12 хранилище ключей - работает на JVM, но не на Android

final SSLContext context = SSLContext.getInstance("TLS"); 
    final KeyStore keystore = KeyStore.getInstance("PKCS12"); 
    keystore.load(ctx.getAssets().open("ca_cli.pkcs12"), "password".toCharArray()); 
    final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    keyManagerFactory.init(keystore, "password".toCharArray()); 
    context.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { new X509TrustManager() { 
     @Override 
     public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } 

     @Override 
     public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException { 
      // TODO Auto-generated method stub 
     } 
    } }, new SecureRandom()); 

версия JVM:

final SSLContext context = SSLContext.getInstance("TLS"); 
final KeyStore keystore = KeyStore.getInstance("pkcs12"); 
keystore.load(new FileInputStream(new File("ca-cli.pkcs12")), "password".toCharArray()); 
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
keyManagerFactory.init(keystore, "password".toCharArray()); 
context.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { 
    new X509TrustManager() { 
    @Override 
    public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } 
    @Override 
    public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) throws CertificateException { 
     // TODO Auto-generated method stub 
    } 
    } 
}, new SecureRandom()); 

код довольно же, но JVM версия работает отлично и Android версии производит:

09-16 12:24:17.024: E/AuthByPasswordLoader(14580): Got unexpected error 
09-16 12:24:17.024: E/AuthByPasswordLoader(14580): 
    javax.net.ssl.SSLHandshakeException: 
    javax.net.ssl.SSLProtocolException: SSL handshake terminated: 
    ssl=0x656b0148: Failure in SSL library, usually a protocol error 
09-16 12:24:17.024: E/AuthByPasswordLoader(14580): error:14094410:SSL 
    routines:SSL3_READ_BYTES:sslv3 alert handshake failure 
    (external/openssl/ssl/s3_pkt.c:1290 0x40086500:0x00000003) 

Я пытался конвертировать PKCS12 -> BKS, но это не помогло ...

+0

вы проверили, вы добавили разрешение Интернет в манифесте? –

+0

решение здесь - http://stackoverflow.com/questions/18994108/android-4-0-x509keymanager-chooseclientalias-behaves-strange – Oleksandr

+0

@Olexandr deleted :( –

ответ

0

Итак, в случае, если кто-то сталкивается с той же проблемой - оказалось, что это ошибка, которая была представлена ​​в Android 3.0.

Цитирование Kenny Root (Android Security Discussion thread):

Спасибо, это похоже на ошибку, которая была введена в Android 3.0. Это потребует, чтобы типы ключей клиента имели один и тот же тип CA. Вы видите это, потому что ваш сертификат клиента - RSA, а CA - EC.

Вы можете обойти эту ошибку для своей ситуации, обернув KeyManager и перехватив вызовы selectClientAlias, чтобы добавить «RSA_EC» в keyTypes.

Если вы заинтересованы в частности исправления, которые будут в будущем выпуске: https://android-review.googlesource.com/66581

Смежные вопросы