2010-12-02 11 views
2

私はこれについて既に投稿しましたが、それ以来運がないと私はもっと情報を持っています。私はもう一度やり直したいと思っていました。基本的に私はXMLファイルを読んで、それが署名されているという事実を確認しています。このコードは管理者として実行されても、ネットワークサービスとしては動作しません。最終的な行は「true」に解決されますが、管理者として実行されない場合は解決されます。CryptoKeySecurityの権限を編集するには?

注:これは問題なく、XMLファイルを読むときに問題なく開きます。問題はメモリ内のオブジェクトの1つにあります。私は '問題は、CryptoKeyRightsオブジェクトのアクセス制御リストと関係があると思います。

私が使用しているしようとすると、CspParamsオブジェクトに誰でもアクセス許可する(下記のコードで)次

CryptoKeyRights rightsForall = CryptoKeyRights.FullControl; 

CryptoKeyAccessRule everyone = new CryptoKeyAccessRule(@"Everyone", CryptoKeyRights.FullControl, AccessControlType.Allow); 

cspParams.CryptoKeySecurity = new CryptoKeySecurity(); 

cspParams.CryptoKeySecurity.AddAccessRule(everyone); 

上記のコードを

コードは次のとおりです。

// Verify the signature of an XML file against an asymmetric 
// algorithm and return the result.XmlDocument Doc, RSA Key 
public static Boolean VerifyLicenceFile(string xmlLicFilePathArg) 
{ 
    bool isVerified = false; 

    try 
    { 

     CspParameters cspParams = new CspParameters(); 

     cspParams.KeyContainerName = containerName; 

     RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams); 

     // Create a new XML document. 
     XmlDocument xmlDoc = new XmlDocument(); 

     // Load an XML file into the XmlDocument object. 
     xmlDoc.PreserveWhitespace = true; 
     xmlDoc.Load(xmlLicFilePathArg); 


     // Check arguments. 
     if (xmlDoc == null) 
      throw new ArgumentException("Doc"); 
     if (rsaKey == null) 
      throw new ArgumentException("Key"); 

     // Create a new SignedXml object and pass it 
     // the XML document class. 
     SignedXml signedXml = new SignedXml(xmlDoc); 

     // Find the "Signature" node and create a new 
     // XmlNodeList object. 
     XmlNodeList nodeList = xmlDoc.GetElementsByTagName("Signature"); 

     // Throw an exception if no signature was found. 
     if (nodeList.Count <= 0) 
     { 
      throw new CryptographicException("Verification failed: No Signature was found in the document."); 
     } 

     // This example only supports one signature for 
     // the entire XML document. Throw an exception 
     // if more than one signature was found. 
     if (nodeList.Count >= 2) 
     { 
      throw new CryptographicException("Verification failed: More that one signature was found for the document."); 
     } 

     // Load the first <signature> node. 
     signedXml.LoadXml((XmlElement)nodeList[0]); 

     // Check the signature and return the result. 
     isVerified = signedXml.CheckSignature(rsaKey); 
    } 
    catch (Exception ex) 
    { 
    } 

    return isVerified; 

} 

答えて

0

これは、ルートCAまたは署名証明書のアクセス許可によく似ています。だから、私がチェックするのは、チェーン内の証明書がどこにあるのか - ユーザーストア(管理者の下で動作することを説明する)またはマシンストア(全員で動作するはずです)の場合は

0

ませんでした。

これらのプロファイルは完全なユーザーではなく、独自のキーストアを持っていません。エフェメラルキーを使用するか、キーストアへのアクセスを引き起こさないようにする必要があります。

詳細はhttp://blogs.msdn.com/b/alejacma/archive/2007/10/23/rsacryptoserviceprovider-fails-when-used-with-mandatory-profiles.aspxを参照してください。

RSACryptoServiceProvider.UseMachineKeyStore = trueを設定できます。 これにより、ユーザープロファイルのキーストアの使用を避けることができます。

.net 4.0を使用している場合、新しいCspParameters.flags CreateEphemeralKeyを使用して、そのキーがキーストアから独立していることを示すことができます。すなわち、メモリ内キーであり、キーチェーンに読み込まれたり保存されたりしない。