Search code examples
javacertificatepdfboxbouncycastlepki

Certificate policies - multiple policy qualifier info


I am generating a certificate that the certificate policy has to have more than one policy qualifier info. The expected result is the one on the left. My current result is the one on the right

The code I am using is the following. That generates two certificate policy

private CertificatePolicies generateCertificatePolicies(Map<String, String> certificateParameters) {
        PolicyQualifierInfo pqInfo = new PolicyQualifierInfo(certificateParameters.get("PolicyQualifierInfo"));
        PolicyInformation policyInfo = new PolicyInformation(new ASN1ObjectIdentifier(certificateParameters.get("PolicyQualifierInfoOID")), new DERSequence(pqInfo));
        PolicyQualifierInfo pqUserNotice = new PolicyQualifierInfo(
                certificateParameters.get("PolicyQualifierUserNotice"));
        PolicyInformation policyInfo2 = new PolicyInformation(PolicyQualifierId.id_qt_unotice,
                new DERSequence(pqUserNotice));
        PolicyInformation[] certificatePolicies = { policyInfo, policyInfo2 };
        return new CertificatePolicies(certificatePolicies);
    }


Solution

  • this code works for me, I hope it helps you:

    String info[] = {"1.1.1.1.1", "General Policy", "https://your.policy.location.com"};
    PolicyInformation pis[] = new PolicyInformation[1]; // Number of certificates policies
    ASN1ObjectIdentifier pid = new ASN1ObjectIdentifier(info[0]);
    final ASN1EncodableVector v1 = new ASN1EncodableVector();
    v1.add(new DERBMPString(info[1]));
    PolicyQualifierInfo pqi1 = new PolicyQualifierInfo(PolicyQualifierId.id_qt_unotice, new DERSequence(v1));   // User Notice
    final ASN1Encodable[] v2 = new ASN1Encodable[2];
    v2[0] = PolicyQualifierId.id_qt_cps;
    v2[1] = new DERIA5String(info[2]);
    PolicyQualifierInfo pqi2 = PolicyQualifierInfo.getInstance(new DERSequence(v2));                            // CPS Pointer
    pi = new PolicyInformation(pid, new DERSequence(new ASN1Encodable[]{pqi2, pqi1}));
    pis[i] = pi;
    CertificatePolicies policies = new CertificatePolicies(pis);