我想在GO中实现AWS SNS签名验证。这里是AWS提供的签名验证教程。
但是,有一些点我无法理解。
7:生成 Amazon SNS 消息的派生哈希值。将规范格式的 Amazon SNS 消息提交到用于生成签名的相同哈希函数。
如何导出哈希值?我应该使用哪个哈希函数?
8:生成 Amazon SNS 消息的断言哈希值。断言的哈希值是使用公钥值(来自第 3 步)解密与 Amazon SNS 消息一起交付的签名的结果。
如何获得断言的哈希值?
这是我的代码,我有一个通知结构:
type Notification struct {
Message string
MessageId string
Signature string
SignatureVersion string
SigningCertURL string
SubscribeURL string
Subject string
Timestamp string
TopicArn string
Type string
UnsubscribeURL string
}
我已经生成了规范字符串:
signString := fmt.Sprintf(`Message
%v
MessageId
%v`, self.Message, self.MessageId)
if self.Subject != "" {
signString = signString + fmt.Sprintf(`
Subject
%v`, self.Subject)
}
signString = signString + fmt.Sprintf(`
Timestamp
%v
TopicArn
%v
Type
%v`, self.Timestamp, self.TopicArn, self.Type)
从 base64 解码签名
signed, err := base64.StdEncoding.DecodeString(self.Signature)
从 .pem 获取证书
resp, _ := http.Get(self.SigningCertURL)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
p, _ := pem.Decode(body)
cert, err := x509.ParseCertificate(p.Bytes)
现在,如何使用规范字符串验证签名?下面的代码对吗?
cert.CheckSignature(x509.SHA1WithRSA, signed, []byte(signString))
我总是crypto/rsa: verification error从上面的代码中得到。
相关分类