Re:Re: Получение сертификата из файла подписи
От: Вьюга  
Дата: 08.08.06 13:40
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Насчёт сертификатов, так их вроде в подписанные файлы не кладут, обычно только его номер и тип. А как вытащить атрибуты из самого сертификата, так это не проблема, если известен его тип (например 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;
    }



Большое спасибо за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.