Extraia informações da cadeia de certificados do certificado X509 assinado (resposta CSR) no Android/BouncyCastle
-
12-12-2019 - |
Pergunta
Posso extrair informações da cadeia de certificados de um certificado de cliente X509 assinado pela CA usando bibliotecas Android ou BouncyCastle?
Tenho um cliente Android que recebe um certificado X509 assinado por uma CA de um servidor confiável.Quero salvar o certificado de cliente assinado e minha chave privada em um arquivo PKCS12 (.p12).Atualmente estou fazendo isso criando um KeyStore
objeto e adicionando o certificado e a chave privada.Quando eu adiciono o cliente PrivateKey
com o KeyStore.setKeyEntry()
método, um Certificate[] chain
é o último argumento, que atualmente contém apenas o certificado do cliente. Isso impedirá que meu certificado seja verificável porque não tenho o certificado CA no Certificate[] chain
? E se sim, é possível preencher uma cadeia de certificados com informações extraídas do certificado assinado X509Certificate
?
A maioria dos exemplos parece carregar a cadeia de CA de um arquivo PEM, armazenamento confiável BKS ou já ter acesso a uma lista de certificados.
Aqui está o que eu tenho:
X509Certificate cert; // signed client cert
PrivateKey pkey; // client private key
String password;
KeyStore store;
store = KeyStore.getInstance("PKCS12", "BC");
store.load(null, null);
// adding the signed cert
store.setCertificateEntry("Client certificate", cert);
// creating the cert chain
X509Certificate[] chain = new X509Certificate[1];
chain[0] = cert;
// add rest of the certs in the chain here
// adding the private key
store.setKeyEntry("Client private key", pkey, password.toCharArray(), chain);
FileOutputStream fos;
fos = openFileOutput("clientCredentials.p12", Context.MODE_PRIVATE);
store.store(fos, password.toCharArray());
fos.flush();
fos.close();
Desde já, obrigado!
Solução
Os certificados CA não estão incluídos no seu certificado assinado.Você precisa obtê-los de algum lugar (pré-instalar, baixar de um servidor confiável, etc.).Quanto a não instalar a cadeia completa, se o verificador já tiver acesso aos certificados CA necessários, ele sempre poderá verificar o certificado da sua entidade final.Como você pretende usar sua chave e certificado?
Aliás, sua ligação para setCertificateEntry()
cria uma entrada de certificado confiável que provavelmente não é o que você deseja com um certificado de entidade final.