Clave privada para firmar un archivo XML

1

Nunca he tratado con la criptografía antes, por lo que mi pregunta puede ser trivial. Necesito crear una aplicación que envíe mensajes como archivos XML firmados digitalmente. Los mensajes se envían a una entidad de CA.

De acuerdo con las instrucciones que he recibido de la autoridad, creé una solicitud de certificado (archivo CSR) usando OpenSSL que creó mi par de claves (RSA 2048). La clave privada está dentro de un archivo .key. Luego envié el archivo CSR a la CA y obtuve un certificado (.cer).

Al usar este certificado, ahora debería estar firmando los mensajes XML. Para ello, sigo este procedimiento:

public string CreateXML()
{

    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

    //TO DO - Create XML Tree

    // Create a SignedXml object.
    var signedXml = new SignedXml(doc);


    AssetManager assets = this.Assets;
    var bytes = new List<byte>();
    using (StreamReader sr = new StreamReader(assets.Open("certificate25675.cer")))
    {
        int i = 0;
        while (i != -1)
        {
            i = sr.BaseStream.ReadByte();
            if (i != -1)
                bytes.Add(Convert.ToByte(i));
        }
    }

    X509Certificate2 cert = new X509Certificate2(bytes.ToArray());


    signedXml.SigningKey = // ?? What value to put here??

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

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

    XmlDsigC14NTransform c14t = new XmlDsigC14NTransform();
    reference.AddTransform(c14t);

    KeyInfo keyInfo = new KeyInfo();
    KeyInfoX509Data keyInfoData = new KeyInfoX509Data(cert);
    keyInfo.AddClause(keyInfoData);
    signedXml.KeyInfo = keyInfo;

    // Add the reference to the SignedXml object.
    signedXml.AddReference(reference);

    // Compute the signature.
    signedXml.ComputeSignature();

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

    doc.DocumentElement.AppendChild(
       doc.ImportNode(xmlDigitalSignature, true));

    return doc.OuterXml;
}

Mi pregunta está relacionada con el campo "SigningKey" del objeto SignedXml. Todos los ejemplos que encontré, de hecho, este campo se completa con el valor de la clave privada en el certificado. Desafortunadamente, el certificado que recibí no contiene la clave privada.

Entonces la pregunta es: ¿qué valor debo poner? ¿Tengo que ingresar la clave privada que generó el OpenSSL? En este caso, ¿cómo me muevo de un archivo .key (que contiene la clave privada) a un objeto AsymmetricAlgorithm que es el tipo de SigningKey?

    
pregunta Paolo 22.12.2017 - 17:15
fuente

0 respuestas

Lea otras preguntas en las etiquetas