解決 Java PKCS12 AES 加密問題的方法 parseAlgParameters failed: ObjectiveIdentifier() — data isn’t an object ID (tag = 48)

在使用 Java 開發應用程式時,我們可能會遇到一些奇怪的錯誤,其中之一是

java.io.IOException: parseAlgParameters failed: ObjectiveIdentifier() -- data isn't an object ID (tag = 48)

的錯誤。這是一個與 PKCS12 憑證格式和 AES 加密相關的問題。

問題描述

當我們嘗試使用 Java 可能會遇到錯誤消息 java.io.IOException: parseAlgParameters failed: ObjectiveIdentifier() -- data isn't an object ID (tag = 48)。這個錯誤的發生與 Java 11 之前的版本中的 PKCS12 憑證格式不支援 AES 加密算法有關。這是一個已知問題,相關討論可以在這個連結中找到:https://bugs.openjdk.java.net/browse/JDK-8220734

問題解決

我們可以使用 OpenSSL 工具來解決這個問題。在這個情境下,我們可以使用以下的指令:

openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile intermediate.crt -password pass:yourpassword -legacy

在這個指令中,private.key 是私鑰文件的路徑,certificate.crt 是 CRT 憑證文件的路徑,intermediate.crt 是中繼憑證文件的路徑,而 yourpassword 則是您希望設定的 PFX 文件的密碼。使用 -legacy 參數,我們可以使用較舊版本的加密算法(例如3DES),這樣就可以避免 Java 11 之前版本中的錯誤。