Sample code for 30+ languages & platforms
Java Requires Chilkat v11.0.0+

Rewrite PFX using AES256-SHA256

See more PFX/P12 Examples

Demonstrates how to load a .pfx/.p12, examine the encryption algorithm used, and rewrite using aes256-sha256.

Chilkat Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.JsonObject;
import com.chilkatsoft.chilkat2.Pfx;

public class ChilkatExample {

    public static void main(String[] args) {
        Pfx pfx = new Pfx();

        // Let's load a .pfx and examine the encryption algorithms used to protect the private key:
        try {
            pfx.loadPfxFile("qa_data/pfx/test_secret.pfx", "secret");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // Examine the algorithms:

        // "pbeWithSHAAnd3_KeyTripleDES_CBC" or "pbes2"?
        System.out.println("Algorithm: " + pfx.getAlgorithmId());

        // If the algorithm is "pbes2" then examine the actual encryption and HMAC algorithms used within pbes2.
        // (If the algorithm is NOT "pbes2", then the following properties are meaningless and will not be modified from their previous values prior to loading the PFX.)
        System.out.println("Pbes2CryptAlg: " + pfx.getPbes2CryptAlg());
        System.out.println("Pbes2HmacAlg: " + pfx.getPbes2HmacAlg());

        // Our output so far:

        // Algorithm: pbeWithSHAAnd3_KeyTripleDES_CBC
        // Pbes2CryptAlg: aes256-cbc
        // Pbes2HmacAlg: hmacWithSha256

        // This tells us that the PFX we loaded was protected using triple-DES with SHA1.
        // (Most existing .pfx/.p12 files use 3DES w/ SHA1.)
        // The Pbes2CryptAlg and Pbes2HmacAlg properties do not apply here because the AlgorithmId is not equal to "pbes2".  We can ignore those values.

        // Examine the last JSON data collected in the call to LoadPfxFile.  This gives us information about what is contained in the PFX, including extended attributes.
        JsonObject json = new JsonObject();
        pfx.getLastJsonData(json);

        json.setEmitCompact(false);
        System.out.println(json.emit());

        // Sample output

        // Use this online tool to generate parsing code from sample JSON:
        // Generate Parsing Code from JSON

        // {
        //   "authenticatedSafe": {
        //     "contentInfo": [
        //       {
        //         "type": "Data",
        //         "safeBag": [
        //           {
        //             "type": "pkcs8ShroudedKeyBag",
        //             "attrs": {
        //               "localKeyId": "16444216",
        //               "keyContainerName": "{F09B755A-1E90-444D-9851-02B86CA14961}",
        //               "msStorageProvider": "Microsoft Enhanced Cryptographic Provider v1.0"
        //             }
        //           }
        //         ]
        //       },
        //       {
        //         "type": "EncryptedData",
        //         "safeBag": [
        //           {
        //             "type": "certBag",
        //             "attrs": {
        //               "localKeyId": "16444216"
        //             },
        //             "subject": "....",
        //             "serialNumber": "9999999999999999999999999999"
        //           },
        //           {
        //             "type": "certBag",
        //             "attrs": {
        //               "authRootSha256Hash": "0vkOXTXKxNQffUTOZq/4heGBX7M5GFhTqH5mwFyb7x4=",
        //               "friendlyName": "XYZ",
        //               "enhKeyUsage": [
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.2",
        //                   "usage": "clientAuth"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.4",
        //                   "usage": "emailProtection"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.3",
        //                   "usage": "codeSigning"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.8",
        //                   "usage": "timeStamping"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.4.1.311.10.3.4",
        //                   "usage": "encryptedFileSystem"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.5.5.8.2.2",
        //                   "usage": "iKEIntermediate"
        //                 },
        //
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.6",
        //                   "usage": "ipsecTunnel"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.7",
        //                   "usage": "ipsecUser"
        //                 },
        //                 {
        //                   "oid": "1.3.6.1.5.5.7.3.5",
        //                   "usage": "ipsecEndSystem"
        //                 }
        //               ]
        //             },
        //             "subject": "...",
        //             "serialNumber": "8888888888888888888888888888"
        //           },
        //           {
        //             "type": "certBag",
        //             "subject": "...",
        //             "serialNumber": "777777777777777777777777777"
        //           }
        //         ]
        //       }
        //     ]
        //   }
        // }

        // ------------------------------------------------------------------------------------------
        // OK... now let's change the AlgorithmId to "pbes2"

        pfx.setAlgorithmId("pbes2");

        // We already know from above that the PBES2 crypt and HMAC algorithms are "aes256-cbc" and "hmacWithSha256".
        // Let's set them anyway just for the example...
        pfx.setPbes2CryptAlg("aes256-cbc");
        pfx.setPbes2HmacAlg("hmacWithSha256");

        // Rewrite the PFX using pbes2/aes256 + sha256
        try {
            pfx.toFile("secret", "qa_output/test_secret_aes256.pfx");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        System.out.println("Success.");
    }
}