Openssl 是否在没有导出密码的情况下导出PKCS#12文件?

Openssl 是否在没有导出密码的情况下导出PKCS#12文件?,openssl,command,pkcs#12,Openssl,Command,Pkcs#12,我正在生成并导出一些pkcs#12文件以用于测试。这些文件未在生产中使用,仅在自动测试期间临时存在 我正在使用以下命令: openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt $ openssl pkcs12 -export -keypbe NONE -certpbe NONE -nomaciter -passout pass: -out

我正在生成并导出一些pkcs#12文件以用于测试。这些文件未在生产中使用,仅在自动测试期间临时存在

我正在使用以下命令:

openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt
$ openssl pkcs12 -export -keypbe NONE -certpbe NONE -nomaciter -passout pass: -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt
当我包含
-节点时,为什么它坚持使用导出密码


我的OpenSSL版本是2014年1月6日在Ubuntu服务器14.10 64位上的
OpenSSL 1.0.1f

在交互模式下,当提示输入密码时,只需按enter键,将不会设置密码

如果要自动执行该操作(例如作为ansible命令),请使用
-passout
参数。它希望参数的格式为
pass:mypassword
。因为我们不需要密码:

openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key \
    -in certificate.crt -certfile ca-cert.crt \
    -passout pass:

tl;dr使用OpenSSL命令行实用程序无法完成您正在尝试的操作。它只能使用libcrypto(OpenSSL的加密库)以编程方式完成

详细答复:
-nodes
表示“不加密私钥”,但在PKCS#12文件中,证书也是加密的,因此即使使用
-nodes
也需要导出密码

请参阅
-descert
的文档,其中说明:

使用三重DES加密证书;这可能会导致PKCS#12文件 某些“出口级”软件无法读取。默认情况下,私钥是 使用三重DES加密,证书使用40位RC2

因此,除非使用此选项,否则证书将使用RC2加密。您可以使用选项
-keypbe
-certpbe
更改密钥或证书的算法

此外,对于
openssl pkcs12
-nodes
选项仅在以下部分列出:

解析PKCS12文件的选项如下:

但您不是在解析这样一个文件,而是在创建它,如果您查看

PKCS12文件创建的选项如下:


甚至没有列出选项
-nodes

当提示输入密码时,仅仅点击回车键并不意味着“没有密码”,而是意味着“空密码”(您的密码是一个空字符串),这是合法的。在某些情况下,这样做就像没有密码一样有效,原因是一些软件会首先尝试使用空字符串密码读取PKCS#12文件,并且只有在失败时,才会提示用户输入实际密码,因此如果密码为空,在这些情况下,用户将永远不会得到提示,使其看起来好像没有设置“密码”

这可能会导致macOS和iOS出现问题,因为苹果假定PKCS#12总是有一个密码集,并且它不允许您输入“空密码”,因此如果文件有一个空密码集,就无法在这些系统上导入它。Firefox在一开始也有这个问题,但是

在读取PKCS#12文件时,OpenSSL本身试图仅通过猜测来区分“无密码”和“空密码”。以下是项目的原始代码:

/*如果输入空密码,请先尝试不输入密码*/
如果(!mpass[0]&&PKCS12\u verify\u mac(p12,NULL,0)){
/*如果mac和crypto通过相同的密码,则也将其设置为NULL*/
如果(!twopass)cpass=NULL;
}否则如果(!PKCS12\u验证\u mac(p12,mpass,-1)){
BIO_printf(BIO_err,“Mac验证错误:无效密码?\n”);
错误打印错误(bio错误);
转到终点;
}
第一次为密码传递
NULL
,第二次为密码解析空字符串。现在让我们看看创建P12文件时的代码:

p12=PKCS12\u创建(CPAS、名称、密钥、ucert、证书、,
国际热核聚变实验堆(iter)证书-1,钥匙类型);
理论上,当且仅当
cpass
NULL时,此调用将创建一个不带密码的PKCS#12文件,但是,当进行此调用时,它不能为NULL,因为如果遵循从函数开始到上述调用的代码路径,没有任何代码路径最终会导致
cpas
NULL

if(!cpass){
如果(导出证书)cpass=passout;
else-cpass=passin;
}
国际单项体育联合会(注册会计师){
mpass=cpass;
noprompt=1;
}否则{
cpass=通过;
mpass=macpass;
}
如果
cpass
在最后一次
时仍为
NULL
,如果
,则将其设置为
pass
,并且
pass
为:

charpass[50],macpass[50];

这是一个静态变量,当存储到指针时,该指针不能为
NULL
。没有其他代码会为
cpass
指定不同的值,因此
cpass
可以是空字符串,但肯定不能是
NULL
,因此OpenSSL不会在命令行上创建PKCS 12文件作为无密码。它可能有一个空密码,但肯定有一个密码。

在需要为
openconnect

需要额外的步骤,使它没有密码

openssl rsa-in-private.key-out-private.nopwd.key

要仅使用OpenSSL命令行实用程序生成未加密的PKCS12文件,请调用以下命令:

openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt
$ openssl pkcs12 -export -keypbe NONE -certpbe NONE -nomaciter -passout pass: -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt
当私钥(
-keypbe
)和证书(
-certpbe
)的加密算法设置为
NONE
时,openssl的pkcs12库忽略密码参数,不加密私钥和证书

这可以通过以下命令进行验证:

$ openssl pkcs12 -info -in bundle.pfx -noout -passin pass:
MAC: sha1, Iteration 1
MAC length: 20, salt length: 8
PKCS7 Data
Certificate bag
Certificate bag
PKCS7 Data
Key bag
请注意,使用openssl命令行工具读取现有PKCS12文件时,即使数据未加密,也需要指定
-passin pass:
参数。这是因为openssl命令行工具无法检测PKCS12文件是否加密。当指定空密码时,openssl首先尝试将文件读取为未加密。如果失败,openssl将尝试读取使用emp加密的文件