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?
ersetzt Dies ist ein Problem der Programmierung. Ich schlage vor, Sie in StackOverflow – pedrofb
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
@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