Подпишите запрос с сертификатом X509 от связки ключей - PullRequest
0 голосов
/ 01 мая 2020

У наших пользователей есть Android устройства, управляемые через MobileIron, который устанавливает цепочку сертификатов X509 на устройстве пользователя. У нас также есть экземпляр DataPower, который выдает сертификат для возврата токена SAML. Мы пытаемся сделать запрос к DataPower, используя подписанный запрос SSL с сертификатом X509, но я не смог выяснить, как это сделать. Я могу получить саму цепочку сертификатов:

KeyChainAliasCallback keyChainAliasCallback = new KeyChainAliasCallback() {
  @Override
  public void alias(String s) {
    try {
      X509Certificate[] certChain = KeyChain.getCertificateChain(reactContext, s);
    }
    catch (Exception e) {
      Log.d(TAG, "ERROR GETTING CERTIFICATE CHAIN " + e);
    }
  }
};
KeyChain.choosePrivateKeyAlias(getCurrentActivity(), keyChainAliasCallback,
  null, null, null, -1, null);

Это работает, а certChain - это массив объектов X509Certificate (на моем устройстве его длина 4).

Далее я хотите использовать сертификат, чтобы сделать запрос SSL. Основываясь на документации здесь: https://chariotsolutions.com/blog/post/https-with-client-certificates-on/ мы можем сделать это, если у нас есть файл сертификата. Однако, где я застрял, на самом деле происходит преобразование цепочки X509Certificate в файл или InputStream, которые KeyStore фактически примет:

KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
KeyStore keyStore = KeyStore.getInstance("PKCS12");

keyStore.load(new ByteArrayInputStream(certChain[certChain.length - 1].getEncoded()),
  "test".toCharArray());
kmf.init(keyStore, "test".toCharArray());
KeyManager[] keyManagers = kmf.getKeyManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, null, null);

Я также пробовал с certChain[0], и я также пытался с помощью Base64.encode в байтовом массиве, возвращаемом из getEncoded. Однако это приводит к ошибке: java.io.IOException: illegal object in getInstance: com.android.org.bouncycastle.asn1.DLSequence. Виновным представляется метод .load, который указывает на то, что я не могу пройти сертификацию X509 должным образом. Я также пытался использовать certChain[0] и получаю ту же ошибку.

Есть ли способ заставить KeyStore загрузить цепочку сертификатов X509?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...