我需要在我的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()
?
答案 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这样的外部库可能很有用。但是,这假定存在window
和navigator
对象,它们在普通JavaScript环境中执行,但在Google Apps脚本中不存在。
但是使用some modification,可以让JSEncrypt与Google Apps脚本一起使用,以便使用公钥对消息进行签名。