Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Здравствуйте. Рекомендую посмотреть примеры с использованием подписи CMS (пакеты CMS, CMSVerify) в samples-src.jar. В них есть и формирование, и проверка подписи, вывод информации о сертификате и т.д. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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();
}
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.10.2013(UTC) Сообщений: 13
Сказал(а) «Спасибо»: 4 раз
|
А каким образом можно декодировать KeyUsage в строковое представление, как представляет Windows при просмотре сертификата? Если ли специальные класс от КриптоПро, позволяющие это сделать?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 13.10.2013(UTC) Сообщений: 13
Сказал(а) «Спасибо»: 4 раз
|
Нет ли примера, показывающего, как из сертификата вытащить, кроме серийного номера, версии, дат - точки распределения списка отзыва, расшифрованное использование ключа?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close