2013-11-16 2 views
3

Я хочу реализовать проверку подлинности SNS SNS в GO. Here - это руководство по проверке подписи, предоставленное AWS.Проверка подлинности SNS AWS с помощью GO

Однако некоторые моменты я не могу получить.

7: Создать производное значение хэша в сообщении SNS Amazon. Отправьте сообщение Amazon SNS в каноническом формате на ту же хеш-функцию, которая используется для генерации подписи.

Как получить значение хеш-функции? Какую функцию хеша использовать?

8: Сгенерировать утверждённое значение хэширования сообщения SNS Amazon. Утвержденное значение хэша является результатом использования значения открытого ключа (начиная с шага 3), чтобы расшифровать подпись, поставленную с сообщением SNS Amazon.

Как получить Утвержденное значение хэша?

Вот мой код, у меня есть -структуру для уведомления:

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) 

Decode подпись от 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 свыше кода.

Спасибо!

+0

Это может помочь: https://github.com/mitchellh/goamz/blob/master/iam/sign.go – elithrar

+0

Он использует процесс подписания версии 2. Однако AWS SNS поддерживает только версию 1 и версию 4. – lazywei

+0

Считаете ли вы использование https://launchpad.net/goamz? –

ответ

2

Я знаю, что это действительно старый вопрос, но у меня были те же проблемы, что и у репортера, поэтому я взял день, чтобы понять это с помощью AWS. Я открываю свою работу как внешняя библиотека, теперь доступная here.

Вы можете использовать его, как это (notificationJson является JSON строка):

import (
    "encoding/json" 
    "fmt" 

    "github.com/robbiet480/go.sns" 
) 

var notificationPayload sns.Payload 
err := json.Unmarshal([]byte(notificationJson), &notificationPayload) 
if err != nil { 
    fmt.Print(err) 
} 
verifyErr := notificationPayload.VerifyPayload() 
if verifyErr != nil { 
    fmt.Print(verifyErr) 
} 
fmt.Print("Payload is valid!") 

Спасибо за ваши первоначальные работы по этому lazywei, я основывал мою библиотеку на вашем коде выше!

+0

Рад это видеть! Отличная работа! – lazywei