Openssl 是否在没有导出密码的情况下导出PKCS#12文件?
我正在生成并导出一些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
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加密的文件