2017-07-03 2 views
2

Ich kann nicht die Signaturverifizierung funktioniert, wie es beschrieben here. Ich benutze BouncyCastle.NetCore 1.8.1.3 und das Projekt ist eine .NETCoreApp 1.0.Alexa Skill Signatur Validierung fehlgeschlagen

Ich entwickle auf macOS 10.12.1, läuft dotnet core 1.0.4 und mein Server läuft Ubuntu 16.04.2-x64 mit der Release-Version, Build als netcore1.0 und ubuntu16.04-x64 App.

Der Rest des Systems läuft ohne Probleme, mit Ausnahme der Signaturprüfung.

Meine Validierung gibt immer false zurück.

Hier mein Service ist die Unterschrift und Körper für die Validierung:

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

Hat jemand einen Tipp, was ich falsch mache oder hat einen anderen Rahmen oder apis verwendet?

+0

1. Sind Sie sicher, dass der "Inhalt" in UTF8 kodiert ist? 2. Haben Sie einen anderen Algorithmus versucht? – ChrisM

+0

1. Ja, der Inhalt ist sicher UTF8. 2. Ich habe die Klassen System.Security.Cryptography.X509Certificates ausprobiert. aber es funktioniert auch nicht. Es stürzt dotnet ab. – Duglah

Antwort

0

Aus dem Code, den Sie freigegeben haben, sieht es korrekt aus. Ohne den Rest des Codes zu sehen, bin ich nicht sicher, ob die Signatur, die Sie erhalten haben, korrekt ist. Sie können sich unseren C# -Code ansehen, der die Zertifizierung unter https://github.com/sophtron/Alexa-Skill-Sophtron bestanden hat, und ihn mit Ihrem eigenen vergleichen, um festzustellen, ob es Unterschiede gibt.

Ich versuchte RSACryptoServiceProvider von. Net-Bibliothek für die Signatur-Validierung und es hatte nie funktioniert. Also musste ich auch zu BouncyCastle.1.8.1 wechseln und es funktionierte für mich.

Verwandte Themen