有没有办法在Medium Trust托管上对文档进行数字签名?

时间:2010-12-13 18:44:11

标签: c# digital-signature medium-trust

托管服务器不会执行:

SignedXml.ComputeSignature();

我认为从XML和toXML方法需要完全信任。但这令人惊讶。现在不可能对任何文件进行数字签名。

在网上搜索我发现了这个: Using RSA Public Key Encryption in a Shared Web Hosting Environment

之前有人使用过这种方式吗?或者其他方式?

3 个答案:

答案 0 :(得分:1)

我最终能够使用Bounty Castle安全API开发在线激活系统。

没有可用的直接方法,但基本API可用于生成数字签名。

答案 1 :(得分:1)

我知道这篇文章很老但也许有人会发现它很有用: 该解决方案适用于中等信任的ASP .NET 3.5:

    private XmlDocument GetSignedDoc(XmlDocument doc)
{
      X509Certificate2 certificate = null;
                    try
                    {
                        certificate = new X509Certificate2(AppDomain.CurrentDomain.BaseDirectory + licenceFile, licenceFilePass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);

                        if (certificate == null)
                            throw new Exception("The certificate i

s null!!!");
                }
                catch (Exception ex)
                {
                    exception += "X509Certificate2 fail! Did not get certificate " + AppDomain.CurrentDomain.BaseDirectory + licenceFile;
                    exception += FormatException(ex);
                    goto SetError;
                }
            RSACryptoServiceProvider myRSASigner = null;

            try
            {
                myRSASigner = (RSACryptoServiceProvider)certificate.PrivateKey;

                if (myRSASigner == null)
                {
                    throw new Exception("No valid cert was found");
                }


                    doc = SignXmlFile(doc, myRSASigner);

           catch (Exception ex)
                {
                    exception += "SignXmlFile failed";
                    exception += FormatException(ex);
                    goto SetError;
                }

}

private static XmlDocument SignXmlFile(XmlDocument doc, RSACryptoServiceProvider myRSA)
            {
                byte[] sign_this = Encoding.UTF8.GetBytes(doc.InnerXml);
                byte[] signature = myRSA.SignData(sign_this, new SHA1CryptoServiceProvider());
                string base64_string = Convert.ToBase64String(signature);

                XmlElement Signature = doc.CreateElement("Signature");
                Signature.AppendChild(doc.CreateTextNode(base64_string));
                doc.DocumentElement.AppendChild(doc.ImportNode(Signature, true));

                return doc;
            }

答案 2 :(得分:0)

本文的作者基本上通过将不同的部分组合在一起来重新发明轮子以获得一些工作代码。虽然他们的方法应该工作,你可以自己发明一些类似的方法(在这里和那里采取一些代码并尝试使其工作),他们确认(在历史中)有修复的错误,我认为可能有更多的错误那里。

JFYI:我们提供XML security components,它们在有限的环境中工作,因为我们自己编写了所有代码并包含在我们的程序集中。