OpenSSL 生成具有字节顺序、编码和字符集的证书

OpenSSL 生成具有字节顺序、编码和字符集的证书

我在使用 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"

相关内容