У меня есть конечная точка ASP.NET, где я получаю сообщения Amazon SNS. Я хочу проверить подписи, которые я получаю вместе с этими сообщениями, и выполнил руководство по адресу http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.example.java.html, пытаясь сопоставить код Java на C#. Вот то, что я до сих пор (я заинтересован только в проверке уведомлений, а не подтверждения подписки):Проверка подписи SNS от Amazon в C#
private X509Certificate2 cert;
// cert is from constructor...
private bool IsValidMessageSignature(AmazonMessage msg)
{
// Verify the signature
var rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
var msgBytes = GetMessageBytes(msg);
var signedBytes = Convert.FromBase64String(msg.Signature);
return rsa.VerifyData(msgBytes, CryptoConfig.MapNameToOID("SHA1"), signedBytes);
}
private byte[] GetMessageBytes(AmazonMessage msg)
{
// Construct message string
var sb = new StringBuilder();
sb.AppendLine("Message");
sb.AppendLine(msg.Message);
sb.AppendLine("MessageId");
sb.AppendLine(msg.MessageId);
if (msg.Subject != null)
{
sb.AppendLine("Subject");
sb.AppendLine(msg.Subject);
}
sb.AppendLine("Timestamp");
sb.AppendLine(msg.Timestamp);
sb.AppendLine("TopicArn");
sb.AppendLine(msg.TopicArn);
sb.AppendLine("Type");
sb.AppendLine(msg.Type);
return Encoding.UTF8.GetBytes(sb.ToString());
}
rsa.VerifyData()
шаг возвращает ложь. Я также создал пример в Java, и здесь он отлично работает с тем же сообщением, которое я пытаюсь проверить, и тем же сертификатом, который я использую для C#.
Здесь две программы различаются, насколько я могу видеть. Байт-массив C# GetMessageBytes
возвращает 637 байт, тогда как эквивалент Java getMessageBytesToSign
возвращает 627 байт. К сожалению, я не могу опубликовать содержимое сообщения здесь по соображениям безопасности. В моей настройке Java по умолчанию используется кодировка windows-1252, но даже если я изменил кодировку C# на то, что размер байтового массива по-прежнему равен 637. Я не настолько разбираюсь в кодировании и различиях между C# и Java, поэтому я не знаю, имеет ли это значение.
Любые идеи относительно того, как изменить свой C#?
Дикое предположение, но, возможно, Java-код использует \ n для новых строк, а C# использует \ r \ n? – ntoskrnl
Я проверил, и они оба используют \ r \ n. –
Я проверил код java, с которым вы связались, и просто использует \ n ntoskrnl правильно. ex: stringToSign = "Message \ n"; –