2016-04-27 3 views
0

私はいくつかのXML文書を持っていましたが、それぞれ個々のブロック/タグが約50から100個あり、SHA256を使って個別に歌ってWebサービスに送る必要があったので、下のc#コードを使用して登録してください。XMLに署名する際にスマートカード/トークンから証明書が削除されました。それはどのように可能ですか?

突然私の秘密鍵がヌルになるまでサーバから「OK」という応答があったとしても、WSから禁止された匿名のログインメッセージが得られましたが、ほとんど私は私が別の証明書を取ったことを知っていませんでしたが、今度はUSBトークン1と同じ事が起きました.3回、4回はうまくいってからもう一度行ってしまいました!私は実際に何が起こっているのか、何がうまくいったのか分かりません!誰か手掛かりがありますか?ありがとう。

PS:それはsigner.ComputeSignature();方法は今、パスワードの例外をその上求めていた作業を停止する前に:

var key = (RSACryptoServiceProvider)pCertificado.PrivateKey; 

key.PersistKeyInCsp = false;  

public string SignSHA256(string pDocument, string id, X509Certificate2 pCertificado) 
{    
    string signatureCn14Transform = @"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"; 
    string signatureMethod = @"http://www.w3.org/2000/09/xmldsig-more#rsa-sha256"; 
    string digestMethod = @"http://www.w3.org/2001/04/xmlenc#sha256"; 
    string signatureReferenceURI = "#" + id; 


    CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), signatureMethod);    

    XmlDocument xmlDocToSign = new XmlDocument(); 
    xmlDocToSign.LoadXml(pDocument); 

    SignedXml signer = new SignedXml(xmlDocToSign);    

    var key = (RSACryptoServiceProvider)pCertificado.PrivateKey; 
    key.PersistKeyInCsp = false; 
    signer.SigningKey = key; 
    signer.SignedInfo.SignatureMethod = signatureMethod; 

    Reference reference = new Reference(); 
    reference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); 

    XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform(); 
    cn14Transform.Algorithm = signatureCn14Transform; 
    reference.AddTransform(cn14Transform); 
    reference.Uri = signatureReferenceURI; 
    reference.DigestMethod = digestMethod; 
    signer.AddReference(reference); 

    KeyInfo keyInfo = new KeyInfo();   
    keyInfo.AddClause(new KeyInfoX509Data(pCertificado)); 
    signer.KeyInfo = keyInfo;    
    signer.ComputeSignature(); 

    xmlDocToSign.DocumentElement.AppendChild(signer.GetXml()); 

    return xmlDocToSign.OuterXml; 
} 
+0

また、私はCert Manager SafeNet(トークン)とSafeSign standart(スマートカード)をチェックしており、両方に秘密鍵や証明書はありません。 – Marisco

+0

これ以外に何ができるかわからないので、RCA機能はサーバーで正しくありました。問題を引き起こしましたが、私はhttp://www.w3.org/2001/04/xmldsig-more#rsa-sha256に変更しました署名が追加されたhttp://www.w3.org/2000/09/xmldsig#enveloped-signatureのように、私に言ったように、同じことが起こります。 Pls何か考えですか? – Marisco

答えて

0

を私は私だけCryptoConfigのものに追加する必要があることを考え出しました。だから、私はループから下の行を取って、それが私の問題を解決したことを示す形にしました。

1

key.PersistKeyInCsp = false "このキーオブジェクトが解放されたときは、バッキングキーマテリアルを削除する"を意味します。だからガベージコレクションがこのメソッドの後にクリーンアップするとき、それはあなたが言ったことをします:秘密鍵を削除してください。

スマートカードの場合、証明書は関連するメタデータとして秘密鍵コンテナに格納されるため、証明書も同様に削除されます。

このコード行を削除すると、キー/証明書の削除の問題がなくなります。

関連する問題