Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openssl 什么';我的SAML重定向绑定签名有什么问题?_Openssl_.net_Saml - Fatal编程技术网

Openssl 什么';我的SAML重定向绑定签名有什么问题?

Openssl 什么';我的SAML重定向绑定签名有什么问题?,openssl,.net,saml,Openssl,.net,Saml,我正在尝试为重定向绑定创建SAML AuthnRequest 这是我的(匿名)授权请求: <samlp:AuthnRequest AssertionConsumerServiceURL="https://tempuri.org/sp/AssertionConsumerService" Destination="https://anothertempuri.org/broker/sso" ID="a18471d1

我正在尝试为重定向绑定创建SAML AuthnRequest

这是我的(匿名)授权请求:

<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>
这个信号是

我对请求进行放气,然后进行base64编码,然后进行URL编码。(放气后的base64编码结果将在下一步签出。)

用于创建签名的结果字符串如下所示:

SAMLRequest=fZL...5MP&RelayState=821eea8785134bbc8263be6838eda19d&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256
我尝试使用openssl创建签名:

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

和(还有c#):

这三种方法都产生相同的base64编码字符串(openssl结果中的换行除外)

不幸的是,当我尝试使用代理时,他们说签名有问题,当我将相同的信息提供给代理时,我得到了不同的结果


我做错了什么?

问题是需要签名的字符串位于文本文件中,该文件()在每行末尾包含一个换行符。但是,应该签名的字符串不包括换行符

这意味着解决方案是从字符串中修剪换行符,例如通过替换

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

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

这是一个编程问题。我建议您在StackOverflow中发布您的示例不清楚您是在签署base64版本还是原始xml。你能澄清一下吗?我认为您希望对xml进行签名,而不是它的base64。@ExpluUnit:我根据第3.4.4.1节第二项3对完整的字符串
SAMLRequest=…&RelayState=…&SigAlg=…
进行签名。很抱歉,您是对的。我没有时间精确比较您的代码,但这里可以看到来自Kentor.AuthServices的一个工作示例。它是LGPL授权的。
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);
byte[] data = File.ReadAllBytes(FileToSign);
string signString = File.ReadAllText(FileToSign);
signString = signString.TrimEnd('\r', '\n');
byte[] data = Encoding.UTF8.GetBytes(signString);