在安卓系统中安装pcks12证书 "密码错误 "的问题

2 人关注

当我试图将pkcs12证书文件导入android以用于openvpn connect应用程序时,我被提示输入一个密码。这是与这个pkcs12文件有关的密码。我继续输入正确的密码,但却收到了 "密码不正确 "的信息。

为了确认不是文件出了问题,我又试着在一台windows电脑上安装同样的证书,同样的密码被接受,证书也被顺利安装。

这是在两个运行安卓11安全更新2022-02-05的不同智能手机上测试的。

以前有人见过这个问题吗?我只能在网上找到类似的问题,但没有解决办法。

android
client-certificates
openvpn
pkcs#12
incompatibility
MagnumUrsus
MagnumUrsus
发布于 2022-04-14
4 个回答
V13
V13
发布于 2022-11-22
已采纳
0 人赞同

我也有同样的问题。我花了大约一个月时间才搞清楚。

The tl;dr is this:

$ openssl pkcs12 -nodes < your.p12 > /tmp/certbag.pem
$ openssl pkcs12 -export -legacy -in /tmp/certbag.pem > /tmp/legacy.p12

Then use legacy.p12.

显然,安卓无法导入较新的pkcs12文件。我在安卓12和安卓13上试了一下。这是man openssl-pkcs12-legacy所说的。

在传统模式下,证书加密的默认算法是RC2_CBC或3DES_CBC,取决于在构建中是否启用了RC2密码。私钥加密的默认算法是3DES_CBC。 如果没有指定遗留选项,则不加载遗留提供程序,证书和私钥的默认加密算法为AES_256_CBC,密钥推导为PBKDF2。

在我的案例中使用openssl pkcs12 -info,我在原始的.p12文件上看到了这个,这个文件是用Python的PyCryptography PKCS12支持创建的。

MAC: sha256, Iteration 1
MAC length: 32, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 20000

在转换后的.p12文件上使用openssl pkcs12 -info -legacy,我看到了这个。

MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048

原有的那个无法导入,而转换后的(传统的)则导入得很好。

谢谢你,你拯救了我。我正在使用XCA导出PKCS#12文件,在安卓设备上导入突然失败了。看来是OpenSSL升级到3.0.x在我这边引发的,而且应用程序不允许以传统格式导出。如果还有人遇到这种情况,请向XCA提出功能请求。 #383 .
Robert
Robert
发布于 2022-11-22
0 人赞同

PKCS12是一种用于证书和密码钥匙的加密容器格式。对于加密所包含的数据,存在多种算法。不幸的是,并非所有处理PKCS#12文件的系统都支持所有可能的加密算法。

当系统/程序读取一个PKCS#12文件时,如果遇到不支持的加密算法,你会期待一个错误信息,如 "无法读取文件:未知或不支持的算法"。不幸的是,在现实中,大多数的实现只是输出 "密码不正确 "这样的通用错误信息。

Detecting the used encryption algorithm:

为了检测所使用的加密算法,执行

openssl pkcs12 -info -in example.p12

输入密码后,你会看到PKCS12文件的解码数据,加密类型可以从输出的某些行中看到。

如果你发现有这样一行,就会使用最新的加密格式(还不是所有程序都支持)。

Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256

如果你发现有这样一行,就会使用较老的通常称为 "传统 "的加密格式。

Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1

还有第三种更古老的算法存在。我没有找到一个PKCS#12文件的例子,但它应该被输出为pbeWithSHA1And40BitRC2-CBC

Converting a PKCS#12 file to the old encryption format

改变PKCS#12文件使用的加密类型是相当复杂的,因为你必须提取所有包含的密钥和证书,并将所有东西重新组合到一个新文件中。这里表示了必要的openssl命令。

https://help.globalscape.com/help/archive/secureserver3/Converting_an_incompatible_PKCS_12_format_file_to_a_compatible_PKCS_12_.htm

flow4629
flow4629
发布于 2022-11-22
0 人赞同

我遇到的问题是,上述带有-legacy选项的解决方案在实际的ubuntu/openssl和我的新电子邮件证书上不起作用。 还有一个小问题:我有一个.pfx文件,而不是.p12,不知道这是否与其他结局的容器格式相同?

下面的工作流程是成功的。

$ openssl pkcs12 -nodes < your.pfx > /home/ubuntu/certbag.pem
$ openssl pkcs12 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in /home/ubuntu/certbag.pem -out /home/ubuntu/new.pfx -name "SMIME-Cert"

事后删除certbag.pem!它包含你的私钥without encryption!

现在证书导入在安卓10上完美无缺。

感谢上述解决方案和所提供的链接!

limilaw
limilaw
发布于 2022-11-22
0 人赞同

如果有谁在纠结于 GnuTLS certtool ...

TL;DR this should work with both Android 9 & Android 12:

certtool --load-privkey client.key --load-certificate client.crt \
    --load-ca-certificate ca.crt \
    --to-p12 --outder --outfile client.p12 \
    --p12-name "A Friendly Name" \
    --hash SHA1 --pkcs-cipher 3des-pkcs12 --password YourPassword

Explanation

在创建PKCS#12文件时,你必须选择MAC哈希算法(--hash=xxx)和密码算法(--pkcs-cipher=xxx)。根据我的测试,安卓系统的支持情况如下。

从上面可以看出,安卓9实际上同时支持SHA256和SHA1作为MAC,但安卓12不知为何只支持SHA1。
在certtool中,即使你选择--pkcs-cipher=3des-pkcs12,默认的MAC哈希算法也是SHA256。因此,你必须明确指定--hash=SHA1,否则p12文件将不能用于Android 12。