Как разобрать AuthoritiyInformation из объекта X509Certificate
Я хочу получить информацию OCSP из данного объекта X509Certificate
. Поскольку я не знаю, как анализировать эту информацию, я задаю этот вопрос здесь.
Вот что я получил до сих пор:
X509Certificate x509cert = ... //The Certificate
ASN1Primitive obj = ASN1Primitive.fromByteArray(x509cert
.getExtensionValue(Extension.authorityInfoAccess
.getId()));
AuthorityInformationAccess aia = AuthorityInformationAccess.getInstance(obj);
Выбрасывается исключение:
java.security.cert.CertificateParsingException: java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DEROctetString
Как я разбираю ASN1Primitive
в действительный DEROctetString
, чтобы прогрессировать?
Значение ASN1Primitive
в Примере равно:
3032303006082b060105050730018624687474703a2f2f6f6373702e616368656c6f732e64653a383038302f6f6373702f65676b
И кажется мне допустимым значением.
2 ответа:
Вы можете построить
DEROctetString
, используяASN1InputStream
byte[] authInfoAccessExtensionValue = x509cert.getExtensionValue(X509Extension.authorityInfoAccess.getId()); ASN1InputStream ais1 = new ASN1InputStream(new ByteArrayInputStream(authInfoAccessExtensionValue )); DEROctetString oct = (DEROctetString) (ais1.readObject()); ASN1InputStream ais2 = new ASN1InputStream(oct.getOctets()); AuthorityInformationAccess authorityInformationAccess = AuthorityInformationAccess.getInstance(ais2.readObject());
Попробуйте этот код, чтобы получить метаданные URI OCSP в X509Certificate. Код извлечен из класса OnlineOCSPSource проекта SD-DSS (и слегка модифицирован)
public String getAccessLocation(X509Certificate certificate) throws IOException { final ASN1ObjectIdentifier ocspAccessMethod = X509ObjectIdentifiers.ocspAccessMethod; final byte[] authInfoAccessExtensionValue = certificate.getExtensionValue(X509Extension.authorityInfoAccess.getId()); if (null == authInfoAccessExtensionValue) { return null; } ASN1InputStream ais1 = null; ASN1InputStream ais2 = null; try { final ByteArrayInputStream bais = new ByteArrayInputStream(authInfoAccessExtensionValue); ais1 = new ASN1InputStream(bais); final DEROctetString oct = (DEROctetString) (ais1.readObject()); ais2 = new ASN1InputStream(oct.getOctets()); final AuthorityInformationAccess authorityInformationAccess = AuthorityInformationAccess.getInstance(ais2.readObject()); final AccessDescription[] accessDescriptions = authorityInformationAccess.getAccessDescriptions(); for (AccessDescription accessDescription : accessDescriptions) { final boolean correctAccessMethod = accessDescription.getAccessMethod().equals(ocspAccessMethod); if (!correctAccessMethod) { continue; } final GeneralName gn = accessDescription.getAccessLocation(); if (gn.getTagNo() != GeneralName.uniformResourceIdentifier) { //Not a uniform resource identifier continue; } final DERIA5String str = (DERIA5String) ((DERTaggedObject) gn.toASN1Primitive()).getObject(); final String accessLocation = str.getString(); return accessLocation; } return null; } finally { ais1.close(); ais2.close(); } }
В надувном замке 1.57 нет необходимости создавать посредника
ASN1Primitive
. Вы можете получить расширение, просто используя классыorg.bouncycastle.asn1.x509.Extension
иorg.bouncycastle.x509.extension.X509ExtensionUtil
:X509Certificate cert = // the certificate // get Authority Information Access extension byte[] extVal = cert.getExtensionValue(Extension.authorityInfoAccess.getId()); AuthorityInformationAccess aia = AuthorityInformationAccess.getInstance(X509ExtensionUtil.fromExtensionValue(extVal));
Тогда вы можете использовать объект
aia
:AccessDescription[] descriptions = aia.getAccessDescriptions(); for (AccessDescription ad : descriptions) { // ... }
Вы можете сделать это и в предыдущих версиях, но для версии Extension класс не существует, и вы должны использовать
org.bouncycastle.asn1.x509.X509Extension
вместо этого (я думаю, чтоorg.bouncycastle.x509.extension.X509ExtensionUtil
то же самое).