C# Alexa Skill签名验证失败

C# Alexa Skill签名验证失败,c#,.net-core,bouncycastle,alexa,C#,.net Core,Bouncycastle,Alexa,我无法像上面描述的那样进行签名验证。我正在使用的项目是.NETCoreApp 1.0 我在macOS 10.12.1上开发,运行dotnet core 1.0.4,我的服务器运行Ubuntu 16.04.2-x64,运行发布版本,构建为netcore1.0和ubuntu16.04-x64应用程序 系统的其余部分运行没有问题,除了签名验证 我的验证总是返回false 以下是我的签名和正文验证服务: using System; using System.IO; using System.Text;

我无法像上面描述的那样进行签名验证。我正在使用的项目是.NETCoreApp 1.0

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

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

我的验证总是返回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);
        }
    }
}
使用系统;
使用System.IO;
使用系统文本;
使用System.Threading.Tasks;
命名空间MySkill.Main.Services
{
公共类CertificationValidationService:ICertificationValidationService
{
私有常量字符串算法=“SHA1 WithRSA”;
公共异步任务IsValidSiganture(流体、流certData、字符串签名)
{
var pemReader=neworg.BouncyCastle.OpenSsl.pemReader(newstreamreader(certData));
var cert=(Org.BouncyCastle.X509.X509Certificate)pemReader.ReadObject();
使用(var sr=新的StreamReader(主体))
{
var content=wait sr.ReadToEndAsync();
var result=CheckRequestSignature(Encoding.UTF8.GetBytes(content)、签名、证书);
返回结果;
}
}
私有静态bool CheckRequestSignature(字节[]bodyData,字符串签名,Org.BouncyCastle.X509.X509证书证书证书)
{
字节[]sig=Convert.FromBase64String(签名);
var pubKey=(Org.bounchycastle.Crypto.Parameters.RsaKeyParameters)cert.GetPublicKey();
var signer=Org.BouncyCastle.Security.SignerUtilities.GetSigner(算法);
signer.Init(false,publikey);
signer.BlockUpdate(bodyData,0,bodyData.Length);
返回签名人。验证签名(sig);
}
}
}

有人知道我做错了什么,或者使用了不同的框架或API吗?

从您共享的代码来看,这看起来是正确的。没有看到代码的其余部分,我不确定您得到的签名是否正确。您可以查看我们在通过认证的C#代码,并与您自己的代码进行比较,看看是否有任何差异


我尝试了.net库中的RSACryptoServiceProvider进行签名验证,但从未成功过。所以我也不得不切换到BouncyCastle.1.8.1,这对我很有效

一,。你确定“内容”是用UTF8编码的吗?2.你尝试过不同的算法吗。是的,内容肯定是UTF8。2.我尝试了System.Security.Cryptography.X509Certificates类。但它也不起作用。网络正在崩溃。