Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей 111  
#1 Оставлено : 26 сентября 2012 г. 19:51:03(UTC)
Алексей 111

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Добрый день!

Подскажите, как я могу получить информацию о сертификате по ЭЦП?
Конкретно интересует: Кому выдан, Кем выдан, Действителен с ... по ...

Исходные данные:
Код:
byte[] signature // сформированная ЭЦП


Делаю:
Код:
ContentInfo all = new ContentInfo();
all.decode(new Asn1BerDecodeBuffer(signature));
SignedData cms = (SignedData) all.content;
CertificateChoices сс = cms.certificates.elements[0];


начало правильное? что дальше?

Отредактировано пользователем 26 сентября 2012 г. 19:59:26(UTC)  | Причина: Не указана

Online Евгений Афанасьев  
#2 Оставлено : 27 сентября 2012 г. 15:18:51(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,001
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Здравствуйте.
Рекомендую посмотреть примеры с использованием подписи CMS (пакеты CMS, CMSVerify) в samples-src.jar. В них есть и формирование, и проверка подписи, вывод информации о сертификате и т.д.
Offline Алексей 111  
#3 Оставлено : 27 сентября 2012 г. 17:28:45(UTC)
Алексей 111

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.09.2012(UTC)
Сообщений: 57
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
спасибо за наводку!
(хоть и пришлось помучаться, чтобы вытащить все данные, которые мне были нужны :) )

вот решение (может сэкономит кому-нибудь пару часов работы)


Код:

			final ContentInfo all = new ContentInfo();
			all.decode(new Asn1BerDecodeBuffer(signature));
		
		    final SignedData cms = (SignedData) all.content;
		    final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
		    
	    
		    if (cms.certificates != null) {
		    	
	            // Вложенные сертификаты
	            for (int i = 0; i < cms.certificates.elements.length; i++) {
	            	CertificateChoices cc = cms.certificates.elements[i];
	            	encBuf.reset();
	                cc.encode(encBuf);
	                ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate cert = (ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate) cc.getElement();
	                
	                TBSCertificate tbsCert = cert.tbsCertificate;
	                Asn1UTCTime notBefore = (Asn1UTCTime) tbsCert.validity.notBefore.getElement();
	                Asn1UTCTime notAfter = (Asn1UTCTime) tbsCert.validity.notAfter.getElement();
	                
	                ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Name issuer = (Name) tbsCert.issuer;
	                encBuf.reset();
	                issuer.encode(encBuf);
	                X500Principal issuerPrincipal = new X500Principal(encBuf.getMsgCopy());

	                ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Name name = (Name) tbsCert.subject;
	                encBuf.reset();
	                name.encode(encBuf);
	                X500Principal subjectPrincipal = new X500Principal(encBuf.getMsgCopy());

	                System.out.println("serialNumber=" + tbsCert.serialNumber);
	                
	                System.out.println("issuerName=" + issuerPrincipal.getName());
	                System.out.println("subjectName=" + subjectPrincipal.getName());
	                
	                System.out.println("notBefore=" + notBefore.getYear() + "-" + notBefore.getMonth() + "-" + notBefore.getDay() + " " + notBefore.getHour() + ":" + notBefore.getMinute() + ":" + + notBefore.getSecond());
	                System.out.println("notAfter=" + notAfter.getYear() + "-" + notAfter.getMonth() + "-" + notAfter.getDay() + " " + notAfter.getHour() + ":" + notAfter.getMinute() + ":" + + notAfter.getSecond());
	                
	            }
		    }
		} catch (Throwable e) {
			e.printStackTrace();
		}
Online Евгений Афанасьев  
#4 Оставлено : 27 сентября 2012 г. 18:07:51(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,001
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Можно также извлечь сертификат в бинарном виде, передать его в CertificateFactory.getInstance("X.509").generateCertificate(...) и получить объект типа X509Certificate, а из него - все что нужно:
Код:

final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
cms.certificates.elements[i].encode(encBuf);
final CertificateFactory cf = CertificateFactory.getInstance("X.509");
final X509Certificate cert = (X509Certificate) cf.generateCertificate(encBuf.getInputStream());

Отредактировано пользователем 27 сентября 2012 г. 23:04:50(UTC)  | Причина: Не указана

Offline Aleksawka  
#5 Оставлено : 23 октября 2013 г. 16:32:21(UTC)
Aleksawka

Статус: Участник

Группы: Участники
Зарегистрирован: 13.10.2013(UTC)
Сообщений: 13

Сказал(а) «Спасибо»: 4 раз
А каким образом можно декодировать KeyUsage в строковое представление, как представляет Windows при просмотре сертификата? Если ли специальные класс от КриптоПро, позволяющие это сделать?
Offline Aleksawka  
#6 Оставлено : 24 октября 2013 г. 13:49:06(UTC)
Aleksawka

Статус: Участник

Группы: Участники
Зарегистрирован: 13.10.2013(UTC)
Сообщений: 13

Сказал(а) «Спасибо»: 4 раз
Нет ли примера, показывающего, как из сертификата вытащить, кроме серийного номера, версии, дат - точки распределения списка отзыва, расшифрованное использование ключа?
Online Евгений Афанасьев  
#7 Оставлено : 24 октября 2013 г. 16:39:28(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,001
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Можно как-то так:

Код:

byte[] certEncoded = Array.readFile("path_to_certificate");

Asn1BerDecodeBuffer buffer = new Asn1BerDecodeBuffer(certEncoded);
Certificate cert = new Certificate();
cert.decode(buffer);

TBSCertificate tbsCert = cert.tbsCertificate;
Extensions extensions = tbsCert.extensions;

Extension[] extensionList = extensions.elements;

for (Extension extension : extensionList) {

    Asn1ObjectIdentifier extensionOid = extension.extnID;

    // CRL Distribution Points

    if (Arrays.equals(extensionOid.value,
        ALL_CertificateExtensionsValues.id_ce_cRLDistributionPoints)) {

        Asn1OctetString extensionValue = extension.extnValue;
        buffer = new Asn1BerDecodeBuffer(extensionValue.value);

        CRLDistPointsSyntax dpsSyntax = new CRLDistPointsSyntax();
        dpsSyntax.decode(buffer);

        DistributionPoint[] dps = dpsSyntax.elements;

        if (dps != null) {

            for (DistributionPoint dp : dps) {

                DistributionPointName dpn = dp.distributionPoint;
                GeneralNames dpNames = (GeneralNames) dpn.getElement();

                for (GeneralName dpName : dpNames.elements) {
                    String dpUrl = String.valueOf(dpName.getElement());
                    System.out.println(dpUrl);
                } // for

            } // for

        } // if

    } // if

    // Extended Key Usage

    if (Arrays.equals(extensionOid.value,
        ALL_CertificateExtensionsValues.id_ce_extKeyUsage)) {

        Asn1OctetString extensionValue = extension.extnValue;
        buffer = new Asn1BerDecodeBuffer(extensionValue.value);

        _extKeyUsage_ExtnType extKeyUsage = new _extKeyUsage_ExtnType();
        extKeyUsage.decode(buffer);

        KeyPurposeId[] keyPurposeIds = extKeyUsage.elements;

        if (keyPurposeIds != null) {

            for (KeyPurposeId keyPurposeId : keyPurposeIds) {
                OID purposeOid = new OID(keyPurposeId.value);
                System.out.println(purposeOid);
            } // for

        } // if

    } // if

} // for

Отредактировано пользователем 24 октября 2013 г. 18:17:57(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Aleksawka оставлено 28.10.2013(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.