я, наконец, тестировал себя на андроид симулятор и получил окончательный ответ. На самом деле не сложно понять, как только я понял, что PKCS7 - это просто форма хранилища или, скорее, контейнер для разных типов подписей.
В приложении
Вызов возвращает первую подпись в файле CERT.RSA
. Это файл PKCS7, в который входит X.509-сертификат, и из того, что я прочитал, это всегда одна подпись для приложений для Android.
Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), GET_SIGNATURES).signatures[0];
Это Signature
полученный из выше, может быть непосредственно использован для создания рабочего X.509-сертификат, как это (взятое из here):
byte[] rawCert = sig.toByteArray();
InputStream certStream = new ByteArrayInputStream(rawCert);
CertificateFactory certFactory;
X509Certificate x509Cert;
try {
certFactory = CertificateFactory.getInstance("X509");
x509Cert = (X509Certificate) certFactory.generateCertificate(certStream);
//do stuff with your certificate
} catch(Exception ex) {
//handle exception
}
В любом другом месте
Если вы иметь сертификат вне вашего собственного приложения для Android и желать того же байтового потока, который предоставляется функцией выше, вы можете сделать то же самое с простой Java-программой, например:
FileInputStream is = new FileInputStream("CERT.RSA");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate c = (X509Certificate) cf.generateCertificates(is).toArray()[0];
byte[] rawCert = c.getEncoded();
Этот код сначала считывает файл, создает CertificateFactory
, а затем важный шаг это изолировать первый сертификат в pkcs7-контейнере. И тогда c.getEncoded()
, наконец, дает то же представление, что и метод выше.
OpenSSL
И последнее, но не в последнюю очередь openssl
-command для него (из here):
openssl pkcs7 -inform DER -in CERT.RSA -print_certs -text
Это даст вам довольно обзор информации, содержащейся и в конце
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
блок. Он содержит те же данные, что и выше. Если вы проанализируете содержимое этого блока и декодируете его с помощью base64, он даст вам тот же самый массив байтов, что и в двух верхних примерах.
«Я не очень разбираюсь в структуре сертификатов и данных, которые они содержат, поэтому у меня нет никакой подсказки». возможно, настало время для вас разобраться в opensl и понять, как создаются сертификаты. – t0mm13b
Я действительно попытался сначала немного понять это и найти «очевидное» решение, но это не сработало. Я решил спросить, потому что мне сейчас не нужны эти знания, и у меня нет стимула копать глубже в этом вопросе. Я просто хочу знать ответ и более или менее краткое объяснение этого материала и, возможно, ссылку на лучшее объяснение. – SkryptX