У наших пользователей есть 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?