1

OpenSSL によって生成された秘密 RSA キーを使用して、C# .NET 4.0 で XML ファイルに署名しようとしています。私のソースコードは次のようになります:

    public static void SignXml(String filePath, String certificatePath)
    {
        CspParameters cspParams1 = new CspParameters();
        cspParams1.KeyContainerName = certificatePath;
        RSACryptoServiceProvider rsakey = new RSACryptoServiceProvider(cspParams1);


        XmlDocument xmlDoc = new XmlDocument();

        // Load an XML file into the XmlDocument object.
        xmlDoc.PreserveWhitespace = true;
        xmlDoc.Load(filePath);
        SignedXml signedXml = new SignedXml();
        CspParameters cspParams = new CspParameters();
        cspParams.KeyContainerName = certificatePath;

        // Create a new RSA signing key and save it in the container. 
        RSACryptoServiceProvider Key = new RSACryptoServiceProvider(cspParams);

        // Add the key to the SignedXml document.
        signedXml.SigningKey = Key;

        // Create a reference to be signed.
        Reference reference = new Reference();
        reference.Uri = "";

        // Add an enveloped transformation to the reference.
        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();

        reference.AddTransform(env);

        // Add the reference to the SignedXml object.
        signedXml.AddReference(reference);
        KeyInfo keyInfo = new KeyInfo();

        // Load the X509 certificate.


        X509Certificate MSCert = X509Certificate.CreateFromCertFile(certificatePath);


        // Load the certificate into a KeyInfoX509Data object 
        // and add it to the KeyInfo object.
        keyInfo.AddClause(new KeyInfoX509Data(MSCert));
        keyInfo.AddClause(new RSAKeyValue((RSA)Key));

        // Add the KeyInfo object to the SignedXml object.
        signedXml.KeyInfo = keyInfo;
        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save 
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));


        xmlDoc.Save(filePath);
    }

アプリケーションでクラス(CPSMSXmlGenerator)をDLL(DBTBeneficiariesCPSMSという名前)として呼び出しており、それを呼び出すためのコードは次のとおりです。

  Dim genXml As String = DBTBeneficiariesCPSMS.CPSMSXmlGenerator.getXmlFile1(xml)

        'Dim appPath As String = Request.PhysicalApplicationPath
        Dim fullPath As String = Server.MapPath("/XML/") + dataSource + ".xml"
        lblMessage.Text = fullPath
        Dim SwFromFile As StreamWriter = New StreamWriter(fullPath)
        SwFromFile.Write(genXml)
        SwFromFile.Flush()
        SwFromFile.Close()

        CPSMSXmlGenerator.SignXml(fullPath, Server.MapPath("/XML/aua.cer"))

ここで、問題は、アプリケーションが実行されるたびに、' Reference.Uri="" ' で停止し、次のようなエラーが発生することです:- Error: An XmlDocument context is required to resolve the Reference Uri .

が表示され、デジタル署名証明書のない XML ファイルが生成されます。

4

1 に答える 1