必要なものが見つかりました。 http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-security/2875/Manually-computing-sha1-digest-of-reference-containing
いくつかのコードを追加する必要がありました。X509ChainElement.Certificate.GetSerialNumberString() は必要なものを提供し、何も計算する必要はありません。
ここに私が今使っているコードがあります
public static XmlElement GenerateSignature(XmlElement xmlToSign, StoreName storeName, StoreLocation storeLocation, X509Certificate2 certificate, string referenceID)
{
SignedXml signedXml = new SignedXml(xmlToSign);
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
signedXml.SigningKey = certificate.PrivateKey;
Reference tRef = new Reference(referenceID);
XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
tRef.AddTransform(env);
signedXml.AddReference(tRef);
KeyInfo keyInfo = new KeyInfo();
X509Chain x509Chain = new X509Chain();
x509Chain.Build(certificate);
foreach (X509ChainElement element in x509Chain.ChainElements)
{
KeyInfoX509Data x509Data = new KeyInfoX509Data(element.Certificate);
string issuer = element.Certificate.Issuer;
x509Data.AddIssuerSerial(issuer, element.Certificate.GetSerialNumberString());
keyInfo.AddClause(x509Data);
}
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
XmlElement xmlDsig = signedXml.GetXml();
return xmlDsig;
}