使用secp384r1elliptic曲线键和sha384散列签名生成csr

时间:2013-05-29 15:27:14

标签: openssl csr

我正在使用openssl命令创建一个带有椭圆曲线secp384r1的CSR,并使用算法sha384进行哈希签名:

  

openssl ecparam -out ec_client_key.pem -name secp384r1 -genkey

     

openssl req -new -key ec_client_key.pem -out ec_clientReq.pem

然后我用这个命令以可读格式显示CSR:

  

openssl req -in ec_clientReq.pem -noout -text

在CSR的签名部分,我得到了这个:

Signature Algorithm: ecdsa-with-SHA1
    30:64:02:30:06:a1:f2:5e:1b:34:18:b9:f3:7c:e9:52:c8:78:
    99:90:63:d2:1e:d2:f5:7a:25:f3:d6:4d:6d:90:d0:bf:25:45:
    15:ad:aa:17:34:ad:1a:b9:1e:67:2b:cf:d7:a6:9b:e5:02:30:
    31:fe:76:37:4b:11:3a:e7:2d:63:52:bb:18:2f:8e:43:a7:bb:
    65:74:38:a4:92:38:9d:eb:ec:22:8f:77:f3:e4:5f:47:2d:f8:
    2a:9b:e1:2c:ba:a7:b0:e6:c2:54:8d:0e

为了获得签名算法“ecdsa-with-SHA384”而不是“ecdsa-with-SHA1”,我该怎么做?我在这个过程中遗漏了什么吗? 我试图在第二个命令

中使用-sha384
  

openssl req -new -key ec_client_key.pem -out ec_clientReq.pem -sha384

但是我得到了与签名算法相同的结果

Signature Algorithm: ecdsa-with-SHA1
    30:65:02:30:4e:b4:b6:5f:3a:fc:b7:28:e5:4b:f0:3d:9a:ea:
    4a:ba:ce:a4:f1:a6:e8:cd:15:19:23:a6:81:3f:24:01:d7:81:
    3c:9d:9a:4c:cd:4b:4a:12:6d:69:48:ec:7e:73:7d:73:02:31:
    00:d7:a5:63:9b:21:b2:95:ce:7f:13:3f:c5:1a:ac:99:01:ff:
    ba:9c:59:93:d5:ee:97:03:b5:9e:c1:7d:03:f8:72:90:65:b5:
    08:7c:79:ae:ea:4f:6e:b0:2b:55:1a:11:a5

另一个问题涉及签名的格式。在上面的例子中,一个是102字节长,第二个是103字节长。看起来第一个字节是一个包含类型,长度的标题,可能还有一些像填充这样的东西。但我找不到一个确切的定义。有些人可以对此有所了解吗? 感谢

3 个答案:

答案 0 :(得分:5)

这次我再次尝试使用上一个openssl版本1.0.1e(而不是0.9.8n)。

  

openssl ecparam -out ec_client_key.pem -name secp384r1 -gen

     

openssl req -config openssl.cnf -new -key ec_client_key.pem -out ec_clientReq.pem -sha384

     

openssl req -in ec_clientReq.pem -noout -text

现在我得到了预期的结果:

  

签名算法:ecdsa-with-SHA384

看起来版本0.9.8n不支持sha384。

来自CHANGES文件的摘录似乎证实了这一点:

  

1.0.0h和1.0.1之间的变化[2012年3月14日]:... *)添加HMAC ECC   来自RFC5289的密码套件。包括SHA384 PRF支持。        根据RFC5289的要求,如果适用,则不能使用这些密码套件        早于1.2的TLS版本。        [史蒂夫汉森]

感谢gtrig的帮助。

答案 1 :(得分:1)

当我使用与-SHA384选项相同的命令时,我在生成的CSR中得到了这个:“签名算法:ecdsa-with-SHA384”。

键入此命令以查看支持的摘要列表:

openssl list-message-digest-algorithms

希望您能在该列表中看到SHA384。

关于第二个问题,格式为ASN.1。 “30”表示序列如下(在这种情况下,它是2个整数的序列)。 “65”是序列中八位字节的数量。 “02”表示整数,30是该整数中的八位字节数。如果你向前跳过0x30(十进制48个)八位字节,你将得到第二个整数,标有“02”和“31”。所以第一个整数的长度是30,第二个是31.每个整数加上2个八位字节,你得到65,这是序列的长度。此page可以告诉您有关ASN.1的更多信息。

这个值是2个整数的序列,这是有道理的。 ECDSA签名由2个整数组成。有关详细信息,请参阅RFC6605第4节。还有wiki page解释了如何计算2个整数。

答案 2 :(得分:0)

为了使答案更加完整,可以提到使用ecdsa-sha384签名生成非自签名证书,因为它有点不同。诀窍是使用" -md sha384"带" openssl ca"的参数命令。

包含客户端证书

的示例

为证书颁发机构生成密钥:

openssl ecparam -out ca.key -name secp384r1 -genkey

为ca:

创建自签名证书
openssl req -x509 -new -key ca.key -out ca-ca.pem -outform pem -sha384

为客户生成密钥:

openssl ecparam -out host1.key -name secp384r1 -genkey

为客户端密钥创建证书请求:

openssl req -new -nodes -key host1.key -outform pem -out host1.req -sha384

为客户创建证书以响应请求:

openssl ca -keyfile ca.key -cert ca-ca.pem -in host1.req
  -out ca-host1-cert.pem -md sha384 -outdir .