Openssl 使用SECP384R1椭圆曲线密钥和sha384哈希签名生成csr

Openssl 使用SECP384R1椭圆曲线密钥和sha384哈希签名生成csr,openssl,csr,Openssl,Csr,我正在使用openssl命令创建具有椭圆曲线secp384r1和使用算法sha384签名的哈希的CSR: openssl ecparam-out ec_client_key.pem-name secp384r1-genkey openssl请求-新建-密钥ec_client_key.pem-out ec_clientReq.pem 然后,我使用以下命令以可读格式显示CSR: openssl请求-在ec_clientReq.pem中-noout-text 在CSR的签名部分,我得到以下信息: 为了

我正在使用openssl命令创建具有椭圆曲线secp384r1和使用算法sha384签名的哈希的CSR:

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

openssl请求-新建-密钥ec_client_key.pem-out ec_clientReq.pem

然后,我使用以下命令以可读格式显示CSR:

openssl请求-在ec_clientReq.pem中-noout-text

在CSR的签名部分,我得到以下信息:

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

openssl请求-新建-密钥ec_client_key.pem-out ec_clientReq.pem-sha384

但是关于签名算法,我得到了相同的结果

另一个问题涉及签名的格式。在上面的示例中,一个长102字节,第二个长103字节。看起来,第一个字节是一个包含类型、长度的头,可能是一些其他内容,比如填充。但我找不到确切的定义。有人能解释一下吗?
谢谢

当我使用与-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,这是序列的长度。这可以告诉您更多关于ASN.1的信息


只要这个值是一个由2个整数组成的序列,这是有意义的。ECDSA签名由2个整数组成。更多信息请参见第4节。还有解释如何计算2个整数的说明。

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

openssl ecparam-out ec_client_key.pem-名称secp384r1-gen

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

openssl请求-在ec_clientReq.pem中-noout-text

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

签名算法:ecdsa-with-SHA384

看起来版本0.9.8n不支持sha384

此更改文件摘录似乎证实了这一点:

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


感谢gtrig的帮助。

为了让答案更完整,可以提到使用ecdsa-sha384签名生成非自签名证书,因为它有点不同。诀窍是在“opensslca”命令中使用“-md sha384”参数

包含客户端证书的示例 为证书颁发机构生成密钥:

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 .

感谢您对签名格式的解释。这真的很有帮助。不幸的是,我运行的是openssl版本0.9.8n,那里没有命令列表消息摘要算法。我发现内核中没有设置标志CONFIG_CRYPTO_SHA256和CONFIG_CRYPTO_SHA512,所以我再次使用这些标志构建了内核。但没有结果。我还在openssl.cnf中的支持摘要列表中添加了sha384,但也没有帮助。如果键入“openssl dgst-foo”,您会看到SH386列表吗?-foo部分显然不是有效的参数,但用于显示用法,它还将列出摘要。另外,您是否使用SHA256或SHA512尝试过此方案,以查看它们是否有效?键入openssl dgst-foo时,将显示以下内容:“-sha384以使用sha384消息摘要算法”。是的,我也试过SHA256和SHA512,我总是在签名算法中显示ecdsa-with-SHA1。很有趣。如果您尝试了一个无效的选项,如-sha777,该怎么办?它会让你这样做,还是会给你一个错误?那么新版本的OpenSSL呢?你可以下载最新的。关于签名格式(第二个问题)还有一点不清楚;DSA签名的两个整数中的每一个长度可以是48(0x30)字节或49(0x31)字节。在第一种情况下,签名中的相关序列将以02:30:开始,后跟48个字节4e:b4:b6:。。。。。在第二种情况下,签名中的相关序列将以02:31:开头,后跟填充字节00:和48字节d7:a5:63:。。。问题是为什么有时有0x00字节填充,有时没有?这个问题似乎属于堆栈交换网络中的另一个站点,因为它与编程无关。也许。
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 .