2017-07-23 2 views
2

Ich versuche, eine SAML AuthnRequest für die Redirect-Bindung zu erstellen.Was ist falsch an meiner Signatur für eine SAML Redirect-Bindung?

Dies ist mein (anonymisierten) AuthRequest:

<samlp:AuthnRequest AssertionConsumerServiceURL="https://tempuri.org/sp/AssertionConsumerService" 
        Destination="https://anothertempuri.org/broker/sso" 
        ID="a18471d18a93430a8b97b05989ae238f" 
        IssueInstant="2017-07-23T14:15:26Z" 
        ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
        Version="2.0" 
        xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
        xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"> 
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">...</saml:Issuer> 
</samlp:AuthnRequest> 

Ich habe einen Relaystate:

RelayState: 821eea8785134bbc8263be6838eda19d 

Und die SigAlg ist http://www.w3.org/2001/04/xmldsig-more#rsa-sha256

I abzulassen, dann base64 kodieren, dann URL -encodiere die Anfrage. (Die entleerten, Base64-codierte Ergebnis überprüft am SAMLTool Decoder aus.)

Die resultierende Zeichenfolge verwendet werden für die Erstellung der Signatur sieht dann etwa so aus:

SAMLRequest=fZL...5MP&RelayState=821eea8785134bbc8263be6838eda19d&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256 

Ich habe versucht, die Signatur mit OpenSSL erstellen:

openssl sha -sha256 -sign example.pem -out signed.sha256 theStringInAFile.txt 
openssl base64 -in signed.sha256 

und mit C#

byte[] data = File.ReadAllBytes(FileToSign); 
data = SignBytes(data); 
X509Certificate2 certificate = new X509Certificate2(CertFile, Password); 
using (RSA rsa = certificate.GetRSAPrivateKey()) 
{ 
    data = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); 
} 
signedData = Convert.ToBase64String(data, Base64FormattingOptions.None); 

Und (auch mit C#):

var signatureDescription = (SignatureDescription)CryptoConfig.CreateFromName("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 
HashAlgorithm hashAlg = signatureDescription.CreateDigest(); 
hashAlg.ComputeHash(Encoding.UTF8.GetBytes(signString)); 

X509Certificate2 certificate = new X509Certificate2(CertFile, Password); 

AsymmetricSignatureFormatter asymmetricSignatureFormatter = signatureDescription.CreateFormatter(certificate.GetRSAPrivateKey()); 

byte[] signatureValue = asymmetricSignatureFormatter.CreateSignature(hashAlg); 
return Convert.ToBase64String(signatureValue); 

Alle drei Methoden führen in der gleichen Base64-codierte Zeichenfolge (mit Ausnahme der Zeilenumbrüche im OpenSSL Ergebnis).

Leider, wenn ich versuche, dies mit dem Broker zu verwenden, sagen sie, dass etwas mit der Signatur falsch ist, und wenn ich die gleichen Informationen an die SAMLTool AuthnRequest signing tool füttere bekomme ich ein anderes Ergebnis.

Was mache ich falsch?

+0

ersetzt Dies ist ein Problem der Programmierung. Ich schlage vor, Sie in StackOverflow – pedrofb

+0

zu veröffentlichen, ist es aus Ihrem Beispiel unklar, wenn Sie die Base64-Version oder das Original-XML signieren. Könntest Du das erläutern? Ich glaube, du willst die XML signieren, nicht die Base64. – explunit

+0

@explunit: Ich unterzeichne den kompletten String 'SAMLRequest = ... & RelayState = ... & SigAlg = ...' gemäß [der Spezifikation] (https://www.oasis-open.org/committees/download.php) /56780/sstc-saml-bindings-errata--2.0-wd-06-diff.pdf) Abschnitt 3.4.4.1, zweiter Punkt 3. – Miel

Antwort

0

Das Problem besteht darin, dass die Zeichenfolge, die signiert werden muss, in einer Textdatei ist, die (as a rule) am Ende jeder Zeile einen Zeilenumbruch enthält. Die Zeichenfolge, die signiert werden sollte, enthält jedoch keine Zeilenschaltung.

Das bedeutet, die Lösung besteht darin, die neue Zeile aus der Zeichenfolge zu trimmen, z. durch

byte[] data = File.ReadAllBytes(FileToSign); 

von dem ersten Block von C# Code mit

string signString = File.ReadAllText(FileToSign); 
signString = signString.TrimEnd('\r', '\n'); 
byte[] data = Encoding.UTF8.GetBytes(signString); 
Verwandte Themen