2017-07-03 5 views
2

Je n'arrive pas à faire fonctionner la vérification de la signature, comme cela est décrit here. J'utilise BouncyCastle.NetCore 1.8.1.3 et le projet est .NETCoreApp 1.0. Je suis en train de développer sur macOS 10.12.1, exécutant dotnet core 1.0.4 et mon serveur exécute Ubuntu 16.04.2-x64 exécutant la version finale, build as netcore1.0 et ubuntu16.04-x64 app.Alexa Skill La validation de la signature échoue

Le reste du système s'exécute sans problème, à l'exception de la vérification de signature. Ma validation retourne toujours false.

Voici mon service pour valider la signature et du corps:

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); 
     } 
    } 
} 

Est-ce que quelqu'un a une astuce, ce que je fais mal ou a utilisé un cadre différent ou apis?

+0

1. Êtes-vous sûr du "contenu" codé en UTF8? 2. Avez-vous essayé un autre algorithme? – ChrisM

+0

1. Oui, le contenu est UTF8 à coup sûr. 2. J'ai essayé les classes System.Security.Cryptography.X509Certificates. mais ça ne marche pas non plus. C'est l'écrasement de dotnet. – Duglah

Répondre

0

Le code que vous avez partagé semble correct. Sans voir le reste du code, je ne suis pas sûr que la signature que vous avez est correcte. Vous pouvez jeter un oeil à notre code C# qui a passé la certification au https://github.com/sophtron/Alexa-Skill-Sophtron et comparer avec le vôtre pour voir s'il y a des différences.

J'ai essayé RSACryptoServiceProvider à partir de la bibliothèque .net pour la validation de la signature et cela n'a jamais fonctionné. J'ai donc dû passer à BouncyCastle.1.8.1 aussi et ça a marché pour moi.