有没有一种方法可以在中等信托托管上进行数字签署文档?
-
09-10-2019 - |
题
托管服务器只是无法执行:
SignedXml.ComputeSignature();
我认为FROFXML和TOXML方法需要完全信任。但这令人惊讶。现在,不可能以数字方式签署任何文档。
在搜索网时,我发现了这一点:在共享的网络托管环境中使用RSA公共密钥加密
有人在以前还是没有其他出路?
解决方案
我最终能够使用 赏金城堡 安全API。
没有可用的直接方法,但是基本API可用于生成数字签名。
其他提示
我知道这篇文章很旧,但也许有人会发现它很有用:该解决方案与中等信任的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;
}
本文的作者基本上是通过将不同的零件放在一起以获取一些工作代码来重新发明轮子。尽管他们的方法应该起作用,并且您可以自己发明一些类似的方法(在这里和那里进行一些代码并试图使其起作用),但他们(在历史上)确认有些错误,我认为可能还有更多错误那里。
JFYI:我们提供 XML安全组件 哪些在有限的环境中起作用,因为我们将所有代码都写成并包含在我们的集会中。
不隶属于 StackOverflow