我在使用 openssl 命令行工具创建证书时遇到了一些问题。
私钥的规格如下:
“使用 RSA 1024 位密钥和 SHA-1 哈希函数 (RSA-SHA1-1024) 的数字签名”
如下创建
openssl genrsa -out rsa.key 1024
生成 CSR
openssl req -new -key rsa.key -out csr.csr
该证书具有以下规格:
- 格式 = x.509
- 字符集 = UTF-8
- 编码 = Base-64
- 字节序 = Little Endian
- OAEP 填充 = PKCS1 v1.5 填充
- 私钥大小 = 1024 位
- 哈希消息格式 = SHA-1
我尝试过以下多种组合:
openssl x509 -req -utf8 -enc base64 -pkcs -sha1 rsa:1024 -in csr.csr -signkey rsa.key -out server.crt
我根本无法使上述命令的大量组合起作用,总是有一些参数破坏它。
根据规范,我们应该使用给定的证书对 RSA 消息摘要进行签名。我有点困惑我们为什么要这样做以及如何这样做,也许这是一个错误的规范?
我在用着OpenSSL 1.1.0f 2017 年 5 月 25 日
我甚至找不到如何使用 openssl 命令行工具来设置字节序,这里有任何帮助大大感谢!
答案1
除非我读错了,否则该文档似乎自相矛盾。它谈到了证书创建,并且自签名证书是可以的,但后来又说他们希望您发送给 NTA 的唯一东西是公钥。签署数据不需要证书,只需要私钥。所以我想知道为什么他们不让你创建一个公钥/私钥对,而是创建一个只会放在盒子上并且永远不会被使用的整个证书。
以下是创建简单的 RSA 1024 私钥并将公钥提取到其自己的文件中的方法:
openssl genrsa -out rsa.key 1024
openssl rsa -in rsa.key -outform PEM -pubout -out rsa.pub
该rsa.pub
文件就是您要发送给 NTA 的文件。我从未听说过有人需要使用 openssl 明确处理字节序。所以我可能是错的,但您可能不必担心。UTF8 字符集可能只对带有文本字段(如主题)的实际证书有用。Openssl 输出带有 ASCII 编码的 PEM 文件,这很好(也很正常),因为 PEM 是 Base64 编码的。PKCS1 v1.5 填充也是标准的。
现在您已经获得了密钥。让我们尝试签署其文档第 2.2.5 节中的示例数据。首先,将数据放入文件中,以便于在示例中使用。
echo -n 'signature_from_previous_receipt;2014-01-24;23:59:59;123456789;1250.00;1000.00' > data.txt
显示 SHA1 哈希只是为了证明我们得到了与示例匹配的数据
openssl dgst -sha1 data.txt
哈希和对数据进行签名,将其转换为无换行符的 base64 并将其保存到文件中。
openssl dgst -sha1 -sign rsa.key data.txt | openssl base64 -A -out data.sig
假设其中的文本data.sig
现在就是您在示例中用于“signature_for_this_receipt”的内容。
为了验证,我们只需执行以下操作,它将输出“Verified OK”。
openssl dgst -sha1 -verify rsa.pub -signature <(openssl base64 -d -A -in data.sig) data.txt
如果出于某种原因,您确实需要实际的证书文件,则可以用此一行代码替换生成私钥的第一个命令,该命令将生成密钥和自签名证书。您仍然需要相同的第二个命令来提取公钥。
openssl req -nodes -x509 -sha1 -utf8 -newkey rsa:1024 -keyout rsa.key -out server.crt -days 365 -subj "/CN=MyCert"