Google Apps Script で、電子署名をする


Google Apps Script で、
AMP の update-cache の リクエストを送信する script を書いていて、
Google Apps Script で、電子署名をする機会があったので、そのあたりについて記載します。


AMP の update-cache について

update-cache については以下に記載されています。
Update AMP Content  |  Google AMP Cache  |  Google Developers
update-ping と同じような AMP の cache 更新要求ですが、
電子署名の仕組みを絡めて、update-ping よりも早く、amp のcache を更新してくれます。
update-ping と比較すると、
要求送信までの仕組み構築が面倒くさいが、更新は早くなるというもので、
お手軽さはないけど、真面目に構築する分の恩恵は受けられるという仕組みになります。
具体的な手順に興味のある方は、
AMP の update-cache 要求を apikey.pub を使用して送ってみる | Monotalk
で記事にしていますので、ご確認ください。


Google Apps Script で 提供されているAPIについて

Class Utilities  |  Apps Script  |  Google Developers には、いくつか鍵っぽいAPI が存在します。

  • Utilities#computeDigest(algorithm, value)
    指定されたアルゴリズムで指定された値を使用してダイジェストを計算します。
    アルゴリズムとしては、以下が用意されていて、DigestAlgorithm を使用して指定可能です。

    Utilities.DigestAlgorithm.MD2
    Utilities.DigestAlgorithm.MD5
    Utilities.DigestAlgorithm.SHA_1
    Utilities.DigestAlgorithm.SHA_256
    Utilities.DigestAlgorithm.SHA_384
    Utilities.DigestAlgorithm.SHA_512
    

  • Utilities#computeDigest(algorithm, value, charset) 指定されたアルゴリズムで指定された値を使用してダイジェストを計算します。
    文字コードの指定が可能です。

  • Utilities#computeHmacSha256Signature(value, key)
    指定されたキーでHMAC-SHA256を使用して提供された値に署名します。

  • Utilities#computeHmacSha256Signature(value, key, charset) 指定されたキーでHMAC-SHA256を使用して提供された値に署名します。
    文字コードの指定が可能です。

  • Utilities#computeHmacSignature(algorithm, value, key) 指定されたキーと値で指定されたアルゴリズムを使用してメッセージ認証コードを計算します。
    アルゴリズムとしては、以下が用意されていて、MacAlgorithm を使用して指定可能です。

    Utilities.MacAlgorithm.HMAC_MD5 
    Utilities.MacAlgorithm.HMAC_SHA_1   
    Utilities.MacAlgorithm.HMAC_SHA_256
    Utilities.MacAlgorithm.HMAC_SHA_384
    Utilities.MacAlgorithm.HMAC_SHA_512
    

  • Utilities#computeHmacSignature(algorithm, value, key, charset) 指定されたキーと値で指定されたアルゴリズムを使用してメッセージ認証コードを計算します。
    文字コードの指定が可能です。

  • Utilities#computeRsaSha256Signature(value, key) 指定されたキーでRSA-SHA256を使用して提供された値に署名します。

  • Utilities#computeRsaSha256Signature(value, key, charset) 指定されたキーでRSA-SHA256を使用して提供された値に署名します。
    文字コードの指定が可能です。

今回使用したのは、
Utilities#computeRsaSha256Signature(value, key) です。
以下、このAPIを使用したTips を記載します。


Utilities#computeRsaSha256Signature(value, key) について

  • key の妥当性チェックで、おそらくキーの長さを検証している。
    ドキュメントに以下のようなサンプルが記載されています。
    以下テストコードを書いて実行すると、
    無効な引数: key というエラーが出力されてエラーとなります。

     // This will write an array of bytes to the log.
     var signature = Utilities.computeRsaSha256Signature("this is my input",
         "-----BEGIN PRIVATE KEY-----\nprivatekeyhere\n-----END PRIVATE KEY-----\n");
     Logger.log(signature);
    

  • RSA フォーマットのキーの場合、電子署名できない。
    最初、BEGIN RSA PRIVATE KEY で始まる、RSAフォーマットのキーを引数に指定していたのですが、
    無効な引数: key というエラーが出力されてエラーとなりました。
    google apps script - computeRsaSha256Signature() returns Invalid argument: key error when key is public key or rsa private key - Stack Overflow を見る限り、指定できないようだったので、
    以下コマンドを実行して、newPrivate.pem の内容をキーとして指定したところうまくいきました。

    openssl pkcs8 -topk8 -inform pem -in {rsa_private.pem} -outform pem -nocrypt -out newPrivate.pem  
    

RSA フォーマットのキー を使用する場合は、以下、jsencrypt というライブラリを使うと、
試してはないですが、処理できそうです。
travist/jsencrypt: A Javascript library to perform OpenSSL RSA Encryption, Decryption, and Key Generation.

何故エラーになるのかわからず、けっこうはまってしまいましたが、
勉強になりました。
以上です。

コメント