Как вы читаете объект CertificatePolicy из сертификата X509 в Java?
Я могу использовать такой метод для этого для SKID (Subject Key Identifier). Каков аналогичный способ сделать это в JAVA изначально (без использования сторонних библиотек, таких как надувной замок)?
У меня есть сертификат x509, в котором есть что-то, и я хочу иметь возможность прочитать это из сертификата:
"....
[3]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [5.6.7.8.9.1.2.3.4]
[] ]
]
...
"
...
import sun.security.util.DerInputStream;
import sun.security.util.DerValue;
import sun.security.x509.AuthorityKeyIdentifierExtension;
import sun.security.x509.CertificatePolicyMap;
import sun.security.x509.CertificatePolicySet;
import sun.security.x509.KeyIdentifier;
import sun.security.x509.SubjectKeyIdentifierExtension;
....
private static final String SUBJECT_KEY_ID = "2.5.29.14";
.....
/**
* Get the Subject Key Identifier of the PKI Certificate
*
* @return A String containing the SKID
* @throws CertificateParsingException
*/
public String getSubjectKeyIdentifier()
throws IllegalStateException, CertificateParsingException
{
logger.debug("entered");
// if the variable hasn't yet been initialized with a value, initialize it, else return the existing one.
if (subjectKeyIDString == null)
{
if (cert == null)
{
IllegalStateException ise = new IllegalStateException(ERROR_MSG_NOT_INITIALIZED);
logger.error(ise);
throw ise;
}
byte[] skidCertBytes = cert.getExtensionValue(SUBJECT_KEY_ID);
if (skidCertBytes == null)
{
return null;
}
String skidByteString = null;
try
{
DerValue skidDer = new DerValue(skidCertBytes);
byte[] skidDerBytes = skidDer.getDataBytes();
// create a SubjectKeyIdentifierExtension object
SubjectKeyIdentifierExtension skid = new SubjectKeyIdentifierExtension(Boolean.FALSE, skidDerBytes);
boolean isCritical = skid.isCritical();
logger.debug("isCritical: [" + isCritical + "]");
byte[] skidValueBytes = skid.getExtensionValue();
// go inside the SKID object and get the KID (KeyIdentifier) object
KeyIdentifier kid = new KeyIdentifier(skidValueBytes);
// get the bytes of the object (strips off the first two bytes, type & length bytes)
byte[] kidBytes = kid.getIdentifier();
// convert the KID bytes to a DerValue object
DerValue kidDerValue = new DerValue(kidBytes);
byte[] kidByteValue = kidDerValue.getOctetString();
// get the SKID->KID->string value
skidByteString = byteArrayToHexString(kidByteValue, true);
}
catch (IOException e)
{
logger.error(e);
}
logger.debug(skidByteString);
return skidByteString;
}
else
{
return subjectKeyIDString;
}
}