現在、Ruby の OpenSSL EC サポートに関するドキュメントと実際の API はどちらも不足しているようです。特に、Ruby <= 2.3.1 ではOpenSSL::PKey::EC
、署名と検証のための RSA および DSA キーと同じ API に従っていません。あなたがしたいことは、現在ECキーではできませんrequire 'openssl'
.
# Get the key, here I'm reading the file
priv_key = OpenSSL::PKey.read(File.read('eckey.pem'))
# This should be the appropriately formatted string
data = "some data to sign"
# The hash algorithm, I assume SHA256 is being used
digest = OpenSSL::Digest::SHA256.new
# This doesn't work in 2.3.1, but does in 2.4.0-preview1
signature = priv_key.sign(digest, data)
コメントで指摘したように、これは Ruby 2.4.0-preview1 でも機能しますが、あまり役に立たないでしょう。
現在の Ruby で動作させるには、次のようにする必要があります。
# As before:
priv_key = OpenSSL::PKey.read(File.read('eckey.pem'))
data = "some data to sign"
signature = priv_key.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest(data))
これらの手法はどちらも、バイナリ文字列を提供します。リクエストヘッダーとして追加する前に、base64 でエンコードする必要があると思います。
公開鍵を抽出して署名の検証を確認するのも少し面倒です (ただし、openssl
コマンド ラインを使用してファイルを読み込むことはできます)。public_key
メソッドは実際の鍵ではなくオブジェクトを返すためOpenSSL::PKey::EC::Point
、秘密鍵からオブジェクトを再作成する必要があります。verify
メソッドはRuby 2.3.1 で機能します。
pub = OpenSSL::PKey::EC.new(priv_key.group)
pub.public_key = priv_key.public_key
data = "some data to sign"
digest = OpenSSL::Digest::SHA256.new
puts pub.verify(digest, sig, data)
Apple のページには、使用するハッシュ アルゴリズムが指定されていないようですが、私が見たところ、SHA-256 が正しいようです。(また、これは完全に間違っている可能性があり、Apple はまったく異なる形式を使用しています。このコードが機能するかどうかを知りたいと思います)。