我需要使用PHP验证在Windows 8应用程序服务器端进行的应用内购买.MSDN的文档页面仅在C#中有一个示例.现在我花了一整天的时间来寻找一种在PHP中实现它的方法.没有成功.在整个互联网上,只有这个主题的.NET示例.
我发现了一些有关已签名的XML和x509的部分信息,一些库(xmlseclibs - 无用,使用不支持sha256的openssl_*函数; phpseclib - 看起来很有前途,但他们的文档和示例很差,没有任何帮助).
是否有可能在不学习有关签名XML,RSA和x509的所有内容的情况下以某种方式完成?现在我几乎读过所有内容,但到处都是关于编码的信息.没有关于验证的事情.
我正在尝试使用SignedXml类在C#中签名Xml(实际上是SOAP xml),签名阶段成功通过,但是当我尝试验证签名时它告诉我它无效.我在MSDN中使用XmlDsigExcC14NTransform而不是转换XmlDsigEnvelopedSignatureTransform 的示例中所做的唯一更改.如果我使用XmlDsigEnvelopedSignatureTransform,我将获得有效的签名.
这是我的签名代码:
private static XmlDocument SignXml(XmlDocument doc)
{
SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = Certificate.PrivateKey;
Reference reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
//XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
signedXml.ComputeSignature();
XmlElement signature = signedXml.GetXml();
doc.DocumentElement.AppendChild(signature);
doc.Save(SignedXmlPath);
return doc;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将给我一个有效的签名,但如果我使用
XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
Run Code Online (Sandbox Code Playgroud)
代替
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
Run Code Online (Sandbox Code Playgroud)
我会得到一个无效的签名.
这是我的验证码:
private static bool Verify(XmlDocument doc)
{
SignedXml signedDoc = new SignedXml(doc);
XmlNodeList nodeList = …Run Code Online (Sandbox Code Playgroud) 我正在努力使用XAdES进行消息签名。我一直在寻找将我带到以下代码的解决方案。但是我要连接的服务告诉我签名错误。我究竟做错了什么?
public static class Signature
{
#region Private fields
public const string XmlDsigSignatureProperties = "http://uri.etsi.org/01903#SignedProperties";
public const string XadesProofOfApproval = "http://uri.etsi.org/01903/v1.2.2#ProofOfApproval";
public const string XadesPrefix = "xades";
public const string SignaturePrefix = "ds";
public const string SignatureNamespace = "http://www.w3.org/2000/09/xmldsig#";
public const string XadesNamespaceUrl = "http://uri.etsi.org/01903/v1.3.2#";
private const string SignatureId = "Signature";
private const string SignaturePropertiesId = "SignedProperties";
#endregion Private fields
#region Public methods
public static XmlElement SignWithXades(X509Certificate2 signingCertificate, string xml)
{
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
AddSignatureProperties(xmlDocument, signingCertificate);
var …Run Code Online (Sandbox Code Playgroud) 我想创建2个非常简单的dll:
1)将签署一个xml文档2),它将检查xml文档是否未被修改.
我尝试使用RSACryptoServiceProvider和一个密钥容器.但是当我移动到另一台机器时,这不起作用,因为钥匙存储在机器中.
我想将密钥存储在我创建的dll中(我知道这不是推荐的)但是我无法弄清楚如何编写一些代码来简单地签署一个xml文档,然后验证它没有被更改.
所以我需要使用对称密钥来做我想要的这可能吗?
皮特
signedxml ×4
c# ×3
cryptography ×1
licensing ×1
php ×1
sign ×1
signature ×1
windows-8 ×1
xmlseclibs ×1