Здравствуйте, Аноним, Вы писали:
А>Насчёт сертификатов, так их вроде в подписанные файлы не кладут, обычно только его номер и тип. А как вытащить атрибуты из самого сертификата, так это не проблема, если известен его тип (например X.509), это всё описано и доступно.
Совершенно верно, обычно не кладут, в этом-то и была проблема. Из сертификатов все очень неплохо вытаскивается.
Здравствуйте, C0s, Вы писали:
C0s>посмотри библиотеку bouncycastle, в ней класс PKCS7SignedData (и его тестирующий класс PKCS7SignedDataTest как пример использования)
Спасибо, воспользовалась этой библиотечкой, все получилось. =)
На всякий случай.. вдруг кто-нибудь, когда-нибудь сталкнется с подобным, выкладываю вариант решения
public static List<X509Certificate> getCertificates(String filename) {
List<X509Certificate> certs = new ArrayList<X509Certificate>();
try {
Security.addProvider(new BouncyCastleProvider());
File p7s = new File(filename);
InputStream fis = new FileInputStream(p7s);
int size = ((int) p7s.length());
byte[] bytessig = new byte[size];
fis.read(bytessig, 0, size);
sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
byte[] bdecoded = dec.decodeBuffer(new String(bytessig));
CMSSignedData pkcs7 = new CMSSignedData(bdecoded);
CertStore certStore = pkcs7.getCertificatesAndCRLs("Collection", "BC");
SignerInformationStore signers = pkcs7.getSignerInfos();
Collection c = signers.getSigners();
for (Object aC : c) {
SignerInformation signer = (SignerInformation) aC;
Collection certCollection = certStore.getCertificates(signer.getSID());
Iterator certIt = certCollection.iterator();
if (certIt.hasNext()) {
certs.add((X509Certificate) certIt.next());
}
}
fis.close();
return certs;
} catch (IOException e) {
e.printStackTrace();
} catch (CMSException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (CertStoreException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return certs;
}
Большое спасибо за помощь!