6

CloudKit Web サービス要求の作成に関するApple のガイドに従っています。私が問題を抱えているビットは、「Authenticate Web Service Requests」の下のステップ 2 です。

  1. 秘密鍵を使用して、このメッセージの ECDSA 署名を計算します。

この時点に到達する前に、証明書である .pem ファイルを生成しました。このファイルをテキスト エディターで開くと、秘密鍵が表示されるので、それも文字列形式になっています。

また、メッセージと呼ばれるものを生成するための手順も実行しましたが、これは現在文字列として持っています。

したがって、秘密鍵 (または必要に応じて .pem ファイル) と文字列としてのメッセージがあるとすれば、理論的には、メッセージの ECDSA 署名を秘密鍵で計算して取得するのはかなり簡単なはずです。しかし、ここで私は苦労しています。私がオンラインで見つけたライブラリは、さまざまな可動部分があり、.pem ファイルへの参照がなく、新しい公開/秘密鍵の生成について話している、はるかに複雑なアプローチを取っているようです。

このステップで何か助けていただければ幸いです。

4

1 に答える 1

5

現在、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 はまったく異なる形式を使用しています。このコードが機能するかどうかを知りたいと思います)。

于 2016-08-13T19:21:42.920 に答える