如何验证 pem_cert 和签名 (RSA-SHA1)?

How can I verify a pem_cert and signiture (RSA-SHA1)?

我正在尝试检查签名是否有效,在 Node.js 中我会使用

https://nodejs.org/api/crypto.html#crypto_verify_verify_object_signature_signatureencoding

我似乎找不到 crystal 提供此功能的任何东西?

目前标准库中没有实现,但我们可以找到一个分片来实现它:openssl_ext。这个碎片与 Ruby API 非常相似,所以让我们开始吧!

首先我们需要一把钥匙:

$ openssl genpkey -algorithm rsa -out key.pem
$ openssl rsa -in key.pem -pubout -out pub.pem

然后我们需要创建一个分片并添加依赖:

$ shards init
$ $EDITOR shards.yml
dependencies:
   openssl_ext:
      github: randomstate/openssl_ext
$ shards

签名小程序:

$ $EDITOR sign.cr
require "openssl_ext"
require "base64"

private_key = OpenSSL::RSA.new File.read(ARGV[0])
digest = OpenSSL::Digest.new("SHA1")

data = ARGV[1]
signature = private_key.sign digest, data

puts Base64.encode signature
$ crystal build sign.cr

还有一个验证签名的小程序:

$ $EDITOR verify.cr
require "openssl_ext"
require "base64"

public_key = OpenSSL::RSA.new File.read(ARGV[0]), is_private: false
digest = OpenSSL::Digest.new("SHA1")

data = ARGV[1]
signature = Base64.decode STDIN.gets_to_end

puts public_key.verify(digest, signature, data) ? "Valid" : "Invalid"
$ crystal build verify.cr

让我们测试一下我们的工作:

$ ./sign key.pem Hello | ./verify pub.pem Hello
Valid
$ ./sign key.pem Hello | ./verify pub.pem Bye
Invalid