本篇文章介紹使用 openssl 使用指令進行簽章和檢驗,例如可以使用 RSA 或 EC (ECDSA) 金鑰來簽章和檢驗。包含使用 PEM、DER 和 PVK 格式,以及使用 Base64 格式的方法。

簽章

首先我們把要簽署的訊息存在檔案裡,例如 message.txt:

1
test

PEM

使用私鑰來簽章,把簽章輸出到檔案:

1
openssl dgst -sha256 -sign private.pem -out sig message.txt

sig 為輸出的檔案名稱,-sha256 為用來簽章的演算法,可以使用下面指令來看有哪些可使用:

1
openssl dgst -list

會輸出下面內容:

1
2
3
4
5
6
7
8
9
10
Supported digests:
-blake2b512 -blake2s256 -md4
-md5 -md5-sha1 -mdc2
-ripemd -ripemd160 -rmd160
-sha1 -sha224 -sha256
-sha3-224 -sha3-256 -sha3-384
-sha3-512 -sha384 -sha512
-sha512-224 -sha512-256 -shake128
-shake256 -sm3 -ssl3-md5
-ssl3-sha1 -whirlpool

DER

如果是 DER 檔案:

1
openssl dgst -sha256 -sign private.der -keyform DER -out sig message.txt

PVK

如果是 PVK 檔案:

1
openssl dgst -sha256 -sign private.pvk -keyform PVK -out sig message.txt

檢驗

PEM

1
openssl dgst -sha256 -verify public.pem -signature sig message.txt

驗證成功會看到

1
Verified OK

失敗則是

1
Verification Failure

DER

1
openssl dgst -sha256 -verify public.der -keyform DER -signature sig message.txt

使用 Base64

上面產生的簽章是二進位資料,如果想轉成 Base64 可以用以下寫法:

簽章

1
openssl dgst -sha256 -sign private.pem ../message.txt | openssl enc -base64 -out sig

檢驗

先將 Base64 轉成二進位資料存到暫存的 .tmp,再進行原來的檢驗流程:

1
openssl enc -d -base64 -in sig -out .tmp && openssl dgst -sha256 -verify public.pem -signature .tmp message.txt && rm .tmp

延伸閱讀

OpenSSL 指令產生 EC 私鑰和公鑰
OpenSSL 指令產生 RSA 私鑰和公鑰