2017-11-20 1 views
0

Ich habe einen privaten Schlüssel, einen öffentlichen Schlüssel und ein Zertifikat bekommen, um eine Signatur für eine SSO-Anwendung zu erstellen. Ich habe schon eine Weile mit diesem Problem zu kämpfen und ich glaube, dass ich es endlich geschafft habe etwas Code, der bei Bedarf funktioniert. Ich habe vor einer Weile hier einen Eintrag gemacht: iDP connecting to SP SAML/SSO was mir geholfen hat, in die richtige Richtung zu kommen.Generieren der Assertion-Signatur mit privatem Schlüssel und Zertifikat?

Allerdings bin ich immer noch unsicher, wie ich diese Signatur signieren wollte, der ganze Code, den ich zu sagen scheint, muss ich verwenden .Net-Klasse X509Certificate, die in der Regel versucht, eine andere Datei zu laden, aber das Zertifikat ist in der Zusicherungsdatei selbst.

<ds:X509Data> 
    <ds:X509Certificate>X509Certificate Goes Here</ds:X509Certificate> 
</ds:X509Data> 

Ich habe diese Methode hier:

private SignedXml SignSignature(XmlDocument assertionDoc, string uri, string digest) 
    { 
     CspParameters cspParams = new CspParameters(); 
     cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"; 

     RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams); 

     SignedXml signedXml = new SignedXml(assertionDoc); 
     Reference reference = new Reference(); 

     signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl; 
     signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url; 

     reference.Uri = uri;  

     reference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); 
     reference.AddTransform(new XmlDsigExcC14NTransform()); 
     reference.DigestMethod = SignedXml.XmlDsigSHA1Url; 
     reference.DigestValue = Encoding.ASCII.GetBytes(digest); 

     signedXml.AddReference(reference); 
     signedXml.SigningKey = rsaKey; 

     HMACSHA256 key = new HMACSHA256(Encoding.ASCII.GetBytes(PrivateKey)); 

     signedXml.ComputeSignature(key); 

     return signedXml; 
    } 

Was ist das, was ich SignatureValue das Dokuments zu unterzeichnen verwenden, aber bin ich nur Gebrauch des privaten Schlüssels in der SHA256-Klasse zu machen und nicht die Ich bin mir nicht einmal sicher, ob ich den privaten Schlüssel richtig verwende, insgesamt denke ich, dass ich das komplizierter mache, als es sein muss und hoffentlich kann mir jemand von hier helfen.

Antwort

0

Wenn Sie eine Assertion signieren, müssen Sie nur den privaten Schlüssel eines Zertifikats verwenden, das der Fall Ihres Codes ist.

In der Regel wird jedoch der öffentliche Schlüssel des Schlüssels des Zertifikats in die Signatur eingefügt, um einen Empfänger zu benachrichtigen. Dies endet als ds: X509Data Abschnitt, den Sie oben erwähnt haben. Um dies zu tun, müssen Sie der obigen Methode weitere Codezeilen hinzufügen. Sie finden Beispielcode unter: https://github.com/Safewhere/CHTestSigningService/blob/86a66950d1ffa5208b8bf80d03868a073ba29f12/Kombit.Samples.CHTestSigningService/Code/TokenSigningService.cs#L344 (Hinweiszeile 361, 362 und 368).

Verwandte Themen