Как вы читаете объект 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;
    }
}

0 ответов

Другие вопросы по тегам