Alexa Skill签名验证失败

时间:2017-07-03 19:26:14

标签: c# .net-core bouncycastle alexa

我无法使签名验证正常工作,就像它描述的here一样。我使用BouncyCastle.NetCore 1.8.1.3,项目是.NETCoreApp 1.0。

我在macOS 10.12.1上开发,运行dotnet core 1.0.4,我的服务器正在运行发布版本的Ubuntu 16.04.2-x64,构建为netcore1.0和ubuntu16.04-x64 app。

系统的其余部分运行没有问题,签名验证除外。

我的验证始终返回 false

以下是我验证签名和正文的服务:

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace MySkill.Main.Services
{
    public class CertificationValidationService : ICertificationValidationService
    {
        private const string Algorithm = "SHA1withRSA";

        public async Task<bool> IsValidSiganture(Stream body, Stream certData, string signature)
        {
            var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(new StreamReader(certData));
            var cert = (Org.BouncyCastle.X509.X509Certificate)pemReader.ReadObject();

            using (var sr = new StreamReader(body))
            {
                var content = await sr.ReadToEndAsync();
                var result = CheckRequestSignature(Encoding.UTF8.GetBytes(content), signature, cert);

                return result;
            }
        }

        private static bool CheckRequestSignature(byte[] bodyData, string signature, Org.BouncyCastle.X509.X509Certificate cert)
        {
            byte[] sig = Convert.FromBase64String(signature);

            var pubKey = (Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)cert.GetPublicKey();
            var signer = Org.BouncyCastle.Security.SignerUtilities.GetSigner(Algorithm);
            signer.Init(false, pubKey);
            signer.BlockUpdate(bodyData, 0, bodyData.Length);

            return signer.VerifySignature(sig);
        }
    }
}

是否有人提示,我做错了什么或使用过不同的框架或api?

1 个答案:

答案 0 :(得分:0)

从您分享的代码看起来是正确的。没有看到剩下的代码,我不确定你得到的签名是否正确。您可以查看我们在https://github.com/sophtron/Alexa-Skill-Sophtron通过认证的C#代码,并与您自己进行比较,看看是否存在任何差异。

我尝试使用.net库中的RSACryptoServiceProvider进行签名验证,但它从未运行过。所以我不得不切换到BouncyCastle.1.8.1,它对我有用。