13

Go でChef API クライアントを実装しようとしていますが、正しい要求ヘッダー RSA 署名を作成しようとして行き詰まりました。ドキュメントによると:

正規ヘッダーは、リクエストの送信元のクライアント マシンで使用される秘密鍵で署名され、Base64 を使用してエンコードされます。

次の ruby​​ 呼び出しはgem コードOpenSSL::PKey::RSA.private_encrypt()で見つけることができます。これはOpenSSL バインディングを使用し、メソッドはopenssl 関数を呼び出します。mixlib-authentication private_encrypt()RSA_private_encrypt

残念ながら、Go の標準ライブラリには一致する関数が見つかりません。crypto/rsaよく似ていますが、公開鍵による暗号化、秘密鍵によるハッシュ署名など、従来の暗号化方法のみを実装しています。OpenSSLRSA_private_encryptは反対のことを行います。(小さな) メッセージを秘密鍵で暗号化します (メッセージ ハッシュから署名を作成するのと似ています)。

この「署名」は、次のコマンドでも実行できます。

openssl rsautl -sign -inkey path/to/private/key.pem \
    -in file/to/encrypt -out encrypted/output

OpenSSL と同じ結果を達成するためのネイティブ Go ライブラリはありますかRSA_private_encrypt、または Cgo を使用して OpenSSL ライブラリからこの関数を呼び出す唯一の方法はありますか? 多分私は何かが足りない。私の考えは、go以外の依存関係なしでクライアントを実装することでした。

私は Go の初心者なので、crypto/rsaモジュール ソースに飛び込むことができるかどうかわかりません。


同様の質問が見つかりましたが、使用する答えSignPKCS1v15は明らかに間違っています (この関数は、メッセージ自体ではなく、メッセージのハッシュを暗号化します)。

4

4 に答える 4

3

go 以来1.3、これを使用して簡単に行うことができますSignPKCS1v15

rsa.SignPKCS1v15(nil, priv, crypto.Hash(0), signedData) 

参照: https://groups.google.com/forum/#!topic/Golang-Nuts/Vocj33WNhJQ

于 2015-04-20T04:09:04.173 に答える