Chiave privata per firmare un file XML

1

Non mi sono mai occupato della crittografia, quindi la mia domanda potrebbe essere banale. Devo creare un'app che invii messaggi come file XML con firma digitale. I messaggi vengono inviati a un'entità CA.

Secondo l'istruzione che ho ricevuto dall'autorità, ho creato una richiesta di certificato (file CSR) usando OpenSSL che ha creato la mia coppia di chiavi (RSA 2048). La chiave privata si trova all'interno di un file .key. Quindi ho inviato il file CSR alla CA e ho ottenuto un certificato (.cer).

Utilizzando questo certificato, ora dovrei firmare i messaggi XML. Per fare questo, seguo questa procedura:

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;
}

La mia domanda è correlata al campo "SigningKey" dell'oggetto SignedXml. Tutti gli esempi che ho trovato, infatti, questo campo è compilato con il valore della chiave privata nel certificato. Sfortunatamente, il certificato che ho ricevuto non contiene la chiave privata.

Quindi la domanda è: quale valore dovrei inserire? Devo inserire la chiave privata che ha generato OpenSSL? In questo caso, come posso passare da un file .key (contenente la chiave privata) a un oggetto AsymmetricAlgorithm che è il tipo di SigningKey?

    
posta Paolo 22.12.2017 - 17:15
fonte

0 risposte

Leggi altre domande sui tag