我正在尝试使用使用椭圆曲线密钥 BrainpoolP384t1 签名的自签名证书在 CentOS 7.6 上运行 apache httpd 2.4.6,但 apache 不接受此作为有效密钥。我确保所有指令都指向正确的地方。唯一的问题是 apache 无法识别该密钥是否有效。密钥未加密。
当我到达 ssl_error_log 文件时,我得到这个(使用 pkcs8):
[2018 年 12 月 16 日星期日 15:15:36.020090] [ssl:error] [pid 8379:tid 140184667797632] AH02203: Init: 找不到私钥 [2018 年 12 月 16 日星期日 15:15:36.020246] [ssl:error] [pid 8379 :tid 140184667797632] SSL 库错误:错误:0D0680A8:asn1 编码例程:ASN1_CHECK_TLEN:错误标签 [Sun Dec 16 15:15:36.020297 2018] [ssl:error] [pid 8379:tid 140184667797632] SSL 库错误: :0D08303A :asn1 编码例程:ASN1_TEMPLATE_NOEXP_D2I:嵌套 asn1 错误 [Sun Dec 16 15:15:36.020327 2018] [ssl:error] [pid 8379:tid 140184667797632] SSL 库错误:错误:0D0680A8:asn1 编码例程:ASN1_CHECK_TL CN:标签错误[ Sun Dec 16 15:15:36.020356 2018] [ssl:error] [pid 8379:tid 140184667797632] SSL 库错误:错误:0D07803A:asn1 编码例程:ASN1_ITEM_EX_D2I:嵌套 asn1 错误(类型 = RSA)[Sun Dec 16 15: 15:36.020386 2018] [SSL:错误] [PID 8379:TID 140184667797632] SSL库错误:错误:04093004:RSA例程:RSA例程:old_rsa_priv_decode:rsa lib [rsa lib:rsa lib [rsa lib [sun dec 16 15:15:15:15:36.0202020415 2018:SS] 8379:tid 140184667797632] SSL库错误:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误标签[Sun Dec 16 15:15:36.020444 2018] [ssl:错误] [pid 8379:tid 140184667797632]库错误: 错误: 0D07803A:asn1 编码例程:ASN1_ITEM_EX_D2I:嵌套 asn1 错误 (Type=PKCS8_PRIV_KEY_INFO)
没有 pkcs8
[2018年12月17日星期一01:24:47.455770] [ssl:错误] [pid 18124:tid 139679037429888] AH02203:初始化:找不到私钥[2018年12月17日星期一01:24:47.455902] [ssl:错误] [pid 18124 :tid 139679037429888] SSL 库错误: 错误:0D0680A8:asn1 编码例程:ASN1_CHECK_TLEN:错误标签 [Mon Dec 17 01:24:47.456051 2018] [ssl:error] [pid 18124:tid 139679037429888] SSL 库错误:错误:0D08303A :asn1编码例程:ASN1_TEMPLATE_NOEXP_D2I:嵌套asn1错误[Mon Dec 17 01:24:47.456090 2018] [ssl:error] [pid 18124:tid 139679037429888] SSL库错误:错误:0D0680A8:asn1编码例程:ASN1_CHECK_ TLEN:标签错误[ Mon Dec 17 01:24:47.456121 2018] [ssl:error] [pid 18124:tid 139679037429888] SSL 库错误:错误:0D07803A:asn1 编码例程:ASN1_ITEM_EX_D2I:嵌套 asn1 错误(类型 = RSA)[Mon Dec 17 01: 24:47.456152 2018] [ssl:错误] [pid 18124:tid 139679037429888] SSL库错误:错误:04093004:rsa例程:OLD_RSA_PRIV_DECODE:RSA lib [2018年12月17日星期一01:24:47.456180] [ssl:错误] [ PID 18124:tid 139679037429888] SSL库错误:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误标签[Mon Dec 17 01:24:47.456210 2018] [ssl:错误] [pid 18124:tid 139679037429888 ] SSL 库错误:错误: 0D07803A:asn1 编码例程:ASN1_ITEM_EX_D2I:嵌套 asn1 错误 (Type=PKCS8_PRIV_KEY_INFO)
注意:我已经使用使用 aes-256-cbc 加密的 rsa 密钥运行了它,但现在我想要使用 ec 密钥。
答案1
从错误消息来看,您的私钥似乎位于 pkcs#8 文件中。从RFC5958私钥可能采用 DER 格式:
Interoperability considerations:
The PKCS #8 object inside this media type MUST be DER-encoded
PrivateKeyInfo.
因此,您可能需要将私钥转换为 PEM 格式:
openssl pkey -inform DER -in key.p8 -outform PEM -out key.pem
从您的问题中不清楚您是如何创建密钥和证书的。这是一个在我的 Debian Buster 系统上运行的简单示例。
创建椭圆曲线私钥
openssl ecparam -out ec_key.pem -name brainpoolP384t1 -genkey
openssl pkey -in ec_key.pem -text
-----BEGIN PRIVATE KEY-----
MIG6AgEAMBQGByqGSM49AgEGCSskAwMCCAEBDASBnjCBmwIBAQQwKTnt9uvr1aJS
tXEsz3MCtPbojeYvDKOXm9eEllpsErzSdeBUs0c7kyJYnY00N9pwoWQDYgAED2+w
xryVMzZh/nW6mUx3WxWTjXf02/17sZPpkKHcqtj3TObcA7yjpwNs+PriRBEkiyuU
jbXdeTjr79xTLcElXIvJkEp5vu4qijBQ8CRdqc5BZgGWw0vV84xNtB5xKOpc
-----END PRIVATE KEY-----
Private-Key: (384 bit)
priv:
29:39:ed:f6:eb:eb:d5:a2:52:b5:71:2c:cf:73:02:
b4:f6:e8:8d:e6:2f:0c:a3:97:9b:d7:84:96:5a:6c:
12:bc:d2:75:e0:54:b3:47:3b:93:22:58:9d:8d:34:
37:da:70
pub:
04:0f:6f:b0:c6:bc:95:33:36:61:fe:75:ba:99:4c:
77:5b:15:93:8d:77:f4:db:fd:7b:b1:93:e9:90:a1:
dc:aa:d8:f7:4c:e6:dc:03:bc:a3:a7:03:6c:f8:fa:
e2:44:11:24:8b:2b:94:8d:b5:dd:79:38:eb:ef:dc:
53:2d:c1:25:5c:8b:c9:90:4a:79:be:ee:2a:8a:30:
50:f0:24:5d:a9:ce:41:66:01:96:c3:4b:d5:f3:8c:
4d:b4:1e:71:28:ea:5c
ASN1 OID: brainpoolP384t1
值得注意的是,这条特定的曲线不兼容与大多数浏览器或常用的客户端软件兼容。
因此,这是生成 NIST 曲线 EC 密钥的示例,其中兼容适用于大多数浏览器和常用的客户端软件。
创建 NIST EC 密钥
openssl ecparam -out ec_key_nist.pem -name secp384r1 -genkey
openssl pkey -in ec_key_nist.pem -text
-----BEGIN PRIVATE KEY-----
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDB1sa6wudssPDi6sfEg
V7J4xTkn3WF4veaMbcw4GAcL8PUrciXjt5jg8J3wbyvB9ZGhZANiAARLBE/WuM1e
DjYNETD+2oEoej6ZbhDvIRbxqxBBuvVna1hQQW76h3MsavEtBNbkAQZHQ9KZCScg
td5N/OhqQ+K7qXSr7F0KHTp49D9grufK+R6/uNoXtT8yiHO5yAI4lok=
-----END PRIVATE KEY-----
Private-Key: (384 bit)
priv:
75:b1:ae:b0:b9:db:2c:3c:38:ba:b1:f1:20:57:b2:
78:c5:39:27:dd:61:78:bd:e6:8c:6d:cc:38:18:07:
0b:f0:f5:2b:72:25:e3:b7:98:e0:f0:9d:f0:6f:2b:
c1:f5:91
pub:
04:4b:04:4f:d6:b8:cd:5e:0e:36:0d:11:30:fe:da:
81:28:7a:3e:99:6e:10:ef:21:16:f1:ab:10:41:ba:
f5:67:6b:58:50:41:6e:fa:87:73:2c:6a:f1:2d:04:
d6:e4:01:06:47:43:d2:99:09:27:20:b5:de:4d:fc:
e8:6a:43:e2:bb:a9:74:ab:ec:5d:0a:1d:3a:78:f4:
3f:60:ae:e7:ca:f9:1e:bf:b8:da:17:b5:3f:32:88:
73:b9:c8:02:38:96:89
ASN1 OID: secp384r1
NIST CURVE: P-384
创建自签名服务器证书
生成密钥后,自签名服务器证书就是一个单行证书:
openssl req -new -key ec_key.pem -x509 -nodes -days 365 -out cert.pem
使用两个 EC 密钥进行测试后,确认该brainpoolP384t1
曲线对于我的任何浏览器都不起作用。然而,NIST EC 密钥和证书在我的所有客户端软件上都按预期工作。
测试软件:
- 勇敢的浏览器 (0.25.2)
- 火狐浏览器 (60.3.0)
- 仙女 (3.7.0)
- 山猫 (2.8.9rel.1)