OpenSSL 生成具有字節序、編碼和字元集的證書
我在使用 openssl 命令行工具創建證書時遇到了一些問題。
私鑰的規格是:
“使用帶有 SHA-1 散列函式 (RSA-SHA1-1024) 的 RSA 1024 位密鑰的數字簽名”
創建如下
openssl genrsa -out rsa.key 1024
生成 CSR
openssl req -new -key rsa.key -out csr.csr
該證書具有以下規格:
- 格式 = x.509
- 字元集 = UTF-8
- 編碼 = Base-64
- 字節序 = 小字節序
- 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 命令行工具設置它的字節序,這裡的任何幫助將不勝感激!
除非我讀錯了,否則該文件似乎自相矛盾。它談到了證書的創建和自簽名證書是可以的,但後來又說他們希望你發送給 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”的內容。要驗證,我們可以執行以下操作,輸出“驗證成功”。
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"