computeRsaSha256Signature()返回无效参数:密钥是公钥或rsa私钥时的密钥错误

时间:2016-04-14 04:43:42

标签: google-apps-script

我需要在我的Google Apps脚本中使用RSA-SHA256和公钥签名邮件。

我正在尝试使用Utilities.computeRsaSha256Signature(value, key),但我只收到Invalid argument: key错误。

出于这个问题的目的,我已经生成了一个这样的密钥对:

openssl genrsa -out private.pem 32
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

我的脚本如下所示:

function test() {
  var privKey = "-----BEGIN RSA PRIVATE KEY-----\nMCwCAQACBQC6fs8xAgMBAAECBQCxyL35AgMA3ecCAwDXJwICKLcCAnF9AgIbnA==\n-----END RSA PRIVATE KEY-----\n";
  var pubKey = "-----BEGIN PUBLIC KEY-----\nMCAwDQYJKoZIhvcNAQEBBQADDwAwDAIFALp+zzECAwEAAQ==\n-----END PUBLIC KEY-----\n";
  Utilities.computeRsaSha256Signature("value", pubKey); 
  Utilities.computeRsaSha256Signature("value", privKey);
}

当我运行此操作时,我在第一次调用Invalid argument: key时出现computeRsaSha256Signature错误。

错误表明他们的密钥存在问题,但我无法弄清问题是什么。我已尝试使用公钥和私钥,但我试图删除换行符,但所有内容都以相同的消息失败。

我的代码看起来与文档中的示例非常相似,所以我不确定我做错了什么。

如何成功使用Utilities.computeRsaSha256Signature()

2 个答案:

答案 0 :(得分:3)

以BEGIN PRIVATE KEY开头的密钥与BEGIN RSA PRIVATE KEY的密钥格式不同。

我是从“RSA”格式的密钥开始的,但computeRsaSha256Signature需要一个非RSA格式的密钥。

您可以使用以下内容将后者转换为前者:

openssl pkcs8 -topk8 -inform pem -in private.pem -outform pem -nocrypt -out newPrivate.pem

来源: https://plus.google.com/106009755685055488206/posts/bYuPM6MGwsU

答案 1 :(得分:0)

执行rsa sha256签名时,至少可以使用三种不同类型的密钥:

BEGIN PRIVATE KEY
BEGIN RSA PRIVATE KEY
BEGIN PUBLIC KEY

正如accepted answer所示,根据我自己的测试,似乎computeRsaSha256Signature仅支持BEGIN PRIVATE KEY类型。

正如接受的答案所解释的那样,可以将RSA PRIVATE KEY转换为PRIVATE KEY但是当你拥有的只是公钥时,它会更复杂。

在这种情况下,像JSEncrypt这样的外部库可能很有用。但是,这假定存在windownavigator对象,它们在普通JavaScript环境中执行,但在Google Apps脚本中不存在。

但是使用some modification,可以让JSEncrypt与Google Apps脚本一起使用,以便使用公钥对消息进行签名。