PKCS # 12 (निजी उपयोग) पर निजी कुंजी की विशेषताओं को कैसे सेट करें


1

मैं जावा पर लाइब्रेरी बाउंसी कैसल के साथ एक प्रमाण पत्र X509 बनाता हूं। मुझे निजी कुंजी के लिए एक कुंजी विशेषता सेट करने की आवश्यकता है।

PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1024
Bag Attributes
    friendlyName: ASDF
    localKeyID: XX XX XX XX
    Microsoft CSP Name: Microsoft Software Key Storage Provider  <--- (1)
Key Attributes: <No Attributes>    <--- put HERE X509v3 Key Usage: 80
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

मुझे कुंजी उपयोग सेट करने की आवश्यकता है 80 -> X509v3 मुख्य उपयोग: 80. क्योंकि मैं उन विशेषताओं के नहीं होने पर मायावी वक्र और खिड़कियों के साथ काम नहीं करता हूं।

मैंने इसके साथ प्रयास किया:

X509v3CertificateBuilder builder =  new JcaX509v3CertificateBuilder(
                issuerDNName, 
                serial,
                startDate, 
                endDate, 
                tX500Name, 
                pubKey);

X509KeyUsage usage = new X509KeyUsage(X509KeyUsage.digitalSignature); 
builder.addExtension(Extension.keyUsage, false, usage); 

या

builder.addExtension(
                new ASN1ObjectIdentifier("2.5.29.15"),
                true,
                new X509KeyUsage(
                   X509KeyUsage.digitalSignature));

कोई काम नहीं करते। मैं एक बैग विशेषता (1) सेट कर सकता हूं:

PKCS12BagAttributeCarrier bagAttr = (PKCS12BagAttributeCarrier)privateKey;//pbeWithSHA1And3-KeyTripleDES-CBC
        bagAttr.setBagAttribute(
                MicrosoftObjectIdentifiers.microsoft.branch("17").branch("1"),// this OID corresponds to: 1.3.6.1.4.1.311.17.1
                new DERBMPString("Microsoft Software Key Storage Provider"));

एक PrivateKeyInfo क्लास में मौजूद है, लेकिन मैं इसका इस्तेमाल नहीं करता।

अगर मैं ओप्सनल के साथ बनाता हूं, तो मुझे पुट -गसिग विकल्प की जरूरत है ।

openssl pkcs12 -export -in newcert.pem -inkey newreq.pem -name "MY CERTIFICATE" -certfile demoCA/cacert.pem -out mycert.p12 -keysig

ओपनएसएसएल डॉक्स

-keyex | -keysig निर्दिष्ट करता है कि निजी कुंजी का उपयोग कुंजी विनिमय या सिर्फ हस्ताक्षर करने के लिए किया जाना है। यह विकल्प केवल MSIE और इसी तरह के MS सॉफ़्टवेयर द्वारा व्याख्या किया जाता है। आम तौर पर "निर्यात ग्रेड" सॉफ़्टवेयर केवल 512 बिट आरएसए कुंजी को एन्क्रिप्शन उद्देश्यों के लिए उपयोग करने की अनुमति देगा, लेकिन हस्ताक्षर करने के लिए मनमाने ढंग से लंबाई की चाबियाँ। -Keysig विकल्प केवल हस्ताक्षर करने के लिए कुंजी को चिह्नित करता है। केवल कुंजियों पर हस्ताक्षर करने का उपयोग S / MIME हस्ताक्षर, प्रामाणिक (ActiveX नियंत्रण हस्ताक्षर) और SSL क्लाइंट प्रमाणीकरण के लिए किया जा सकता है, हालाँकि बग केवल MSIE 5.0 के कारण होता है और बाद में SSL ग्राहक प्रमाणीकरण के लिए केवल कुंजियों पर हस्ताक्षर करने के उपयोग का समर्थन करता है।

नतीजा:

PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    localKeyID: XX XX XX XX
    friendlyName: ASDF
    Microsoft CSP Name: ECDSA_P256#Microsoft Software key Service Provider
Key Attributes
    X509v3 Key Usage: 80     <-- This
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

धन्यवाद!

जवाबों:


1

कुंजी अट्रिब के साथ थोड़ा संशोधित pkcs12 सृजन कोड नीचे दिया गया है।

private static void createPKCS12File(String alias, PrivateKey key,
X509Certificate cert, char[] password, OutputStream pfxOut)
throws Exception
{
    PrivateKeyInfo pki = PrivateKeyInfo.getInstance(key.getEncoded());
    X509KeyUsage usage = new X509KeyUsage(X509KeyUsage.digitalSignature);
    DERSet usageSet = new DERSet(usage);
    DERSequence attrib = new DERSequence(new ASN1Encodable[]
        {new ASN1ObjectIdentifier("2.5.29.15"), usageSet});
    pki = new PrivateKeyInfo(pki.getPrivateKeyAlgorithm(),
        pki.parsePrivateKey(), new DLSet(attrib));

    OutputEncryptor encOut = new JcePKCSPBEOutputEncryptorBuilder(
        NISTObjectIdentifiers.id_aes256_CBC).setProvider("BC").build(
        password);
    PKCS12SafeBagBuilder certBuilder = new JcaPKCS12SafeBagBuilder(
        cert);
    certBuilder.addBagAttribute(
        PKCS12SafeBag.friendlyNameAttribute, new DERBMPString(alias));

    JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
    SubjectKeyIdentifier pubKeyId = extUtils.createSubjectKeyIdentifier(
        cert.getPublicKey());
    certBuilder.addBagAttribute(PKCS12SafeBag.localKeyIdAttribute,
        pubKeyId);
    PKCS12SafeBagBuilder keyBagBuilder = new PKCS12SafeBagBuilder(pki,
        encOut);
    keyBagBuilder.addBagAttribute(PKCS12SafeBag.friendlyNameAttribute,
        new DERBMPString(alias));
    keyBagBuilder.addBagAttribute(PKCS12SafeBag.localKeyIdAttribute,
        pubKeyId);
    keyBagBuilder.addBagAttribute(new ASN1ObjectIdentifier(
        "1.3.6.1.4.1.311.17.1"),
        new DERBMPString("Microsoft Software Key Storage Provider"));
    PKCS12PfxPduBuilder builder = new PKCS12PfxPduBuilder();
    builder.addData(keyBagBuilder.build());
    builder.addEncryptedData(new JcePKCSPBEOutputEncryptorBuilder(
        PKCSObjectIdentifiers.pbeWithSHAAnd128BitRC2_CBC).
        setProvider("BC").build(password),
        new PKCS12SafeBag[]{certBuilder.build()});
    PKCS12PfxPdu pfx = builder.build(new JcePKCS12MacCalculatorBuilder(
        NISTObjectIdentifiers.id_sha256), password);
    pfxOut.write(pfx.getEncoded(ASN1Encoding.DL));
    pfxOut.flush();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.