После того, как вы поделились своим кодом для доступа к сертификату, я смог его сохранить и проверить.
Как уже было ясно из вопроса, расширение проблематики c является альтернативным именем субъекта. Его значение указывается (RF C 5280) как экземпляр GeneralNames
, который является SEQUENCE
из GeneralName
, который является CHOICE
:
SubjectAltName ::= GeneralNames
GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
GeneralName ::= CHOICE {
otherName [0] AnotherName,
rfc822Name [1] IA5String,
dNSName [2] IA5String,
x400Address [3] ORAddress,
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING,
registeredID [8] OBJECT IDENTIFIER }
Это дамп рассматриваемого расширения вашего сертификата:
<30 41>
676 65: . . . . SEQUENCE {
<06 03>
678 3: . . . . . OBJECT IDENTIFIER subjectAltName (2 5 29 17)
: . . . . . . (X.509 extension)
<04 3A>
683 58: . . . . . OCTET STRING, encapsulates {
<30 38>
685 56: . . . . . . SEQUENCE {
<86 36>
687 54: . . . . . . . [6]
: . . . . . . . . 'DNS:*.cetrel.lu, DNS:mail.cetrel.lu, DNS:www.cet'
: . . . . . . . . 'rel.lu'
: . . . . . . . }
: . . . . . . }
: . . . . . }
Значение помечено 6 ([6]
). Таким образом, выбор uniformResourceIdentifier
используется. RF C 5280 в контексте альтернативных имен субъекта требует для значения этого выбора:
Имя НЕ ДОЛЖНО быть относительным URI, и оно ДОЛЖНО следовать синтаксису URI и правилам кодирования, указанным в [RFC3986]. Имя ДОЛЖНО включать в себя как схему (например, «http» или «ftp»), так и спецификацию схемы c -part.
Таким образом, sun.security.x509.X509CertImpl
пытается проанализировать значение как URI. Это, очевидно, должно завершиться сбоем, поскольку значение просто не является URI:
java.io.IOException: invalid URI name:DNS:*.cetrel.lu, DNS:mail.cetrel.lu, DNS:www.cetrel.lu
at sun.security.x509.URIName.<init>(URIName.java:109)
at sun.security.x509.URIName.<init>(URIName.java:96)
at sun.security.x509.GeneralName.<init>(GeneralName.java:122)
at sun.security.x509.GeneralName.<init>(GeneralName.java:76)
at sun.security.x509.GeneralNames.<init>(GeneralNames.java:68)
at sun.security.x509.SubjectAlternativeNameExtension.<init>(SubjectAlternativeNameExtension.java:141)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at sun.security.x509.CertificateExtensions.parseExtension(CertificateExtensions.java:113)
at sun.security.x509.CertificateExtensions.init(CertificateExtensions.java:88)
at sun.security.x509.CertificateExtensions.<init>(CertificateExtensions.java:78)
at sun.security.x509.X509CertInfo.parse(X509CertInfo.java:702)
at sun.security.x509.X509CertInfo.<init>(X509CertInfo.java:167)
at sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1804)
at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:195)
at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:102)
at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
Caused by: java.net.URISyntaxException: Illegal character in opaque part at index 16: DNS:*.cetrel.lu, DNS:mail.cetrel.lu, DNS:www.cetrel.lu
at java.net.URI$Parser.fail(URI.java:2848)
at java.net.URI$Parser.checkChars(URI.java:3021)
at java.net.URI$Parser.parse(URI.java:3058)
at java.net.URI.<init>(URI.java:588)
at sun.security.x509.URIName.<init>(URIName.java:107)
... 46 more
Если вы все же хотите получить доступ к значению, просто извлеките его и проанализируйте с карты UnparseableExtensions
, которая у вас выглядит следующим образом:
Map<String, Extension> unparseables = ((CertificateExtensions)((X509CertInfo)cert.get("x509.info")).get("extensions")).getUnparseableExtensions();
Extension extension = unparseables.get("2.5.29.17");
byte[] value = extension.getValue();
DerValue derValue = new DerValue(value);
while (derValue.data.available() > 0) {
DerValue encName = derValue.data.getDerValue();
if ((encName.tag & 0x1f) == 6) {
encName.resetTag(DerValue.tag_IA5String);
System.out.printf("IA5String value from URI GeneralName value: %s\n", encName.getIA5String());
}
}
для sun.security.x509.Extension
и sun.security.util.DerValue
.
Выход:
IA5String value from URI GeneralName value: DNS:*.cetrel.lu, DNS:mail.cetrel.lu, DNS:www.cetrel.lu