Please attach the actual signed file.

Aleksey

Rolando Abarca wrote:
Ok, I got a little more info on the error:

From the other side (the place we're I'm sending the signed XML) the response is:

  The public key does not correspond to the certificate

This is how I'm signing the document (this is inside a ruby extension):

VALUE xmlsec_sign(VALUE self, VALUE cert_file, VALUE key_file, VALUE node_uri) {
    xmlNodePtr signNode = NULL;
    xmlNodePtr refNode = NULL;
    xmlNodePtr keyInfoNode = NULL;
    xmlSecDSigCtxPtr dsigCtx = NULL;
    ruby_xml_document_t *rxd;
    char *filename;
    int res = -1;

    /* get libxml node from ruby VALUE */
    Check_Type(key_file, T_STRING);
    Data_Get_Struct(self, ruby_xml_document_t, rxd);
    /* create signature template */
signNode = (xmlNodePtr)xmlSecTmplSignatureCreate(rxd->doc, xmlSecTransformInclC14NId, xmlSecTransformRsaSha1Id, NULL);
    if (signNode == NULL) {
        rb_raise(rb_eXMLError, "Failed to create signature template");
    }
    xmlAddChild(xmlDocGetRootElement(rxd->doc), signNode);
    /* add reference */
refNode = (xmlNodePtr)xmlSecTmplSignatureAddReference(signNode, xmlSecTransformSha1Id, NULL, STR2CSTR(node_uri), NULL);
    if (refNode == NULL) {
rb_raise(rb_eXMLError, "Failed to add reference to signature template");
    }
    /* add key info */
keyInfoNode = (xmlNodePtr)xmlSecTmplSignatureEnsureKeyInfo(signNode, NULL);
    if (keyInfoNode == NULL) {
        rb_raise(rb_eXMLError, "Failed to add key info");
    }
    if ((xmlNodePtr)xmlSecTmplKeyInfoAddKeyValue(keyInfoNode) == NULL) {
        rb_raise(rb_eXMLError, "Failed to add key value");
    }
    if ((xmlNodePtr)xmlSecTmplKeyInfoAddX509Data(keyInfoNode) == NULL) {
        rb_raise(rb_eXMLError, "Failed to add X509 Data");
    }

    /* create sign context and sign the document */
    dsigCtx = xmlSecDSigCtxCreate(NULL);
    if(dsigCtx == NULL) {
        rb_raise(rb_eXMLError, "Failed to create signature context");
    }
    filename = STR2CSTR(key_file);
dsigCtx->signKey = xmlSecCryptoAppKeyLoad(filename, xmlSecKeyDataFormatPem, NULL, NULL, NULL);
    if(dsigCtx->signKey == NULL) {
        xmlSecDSigCtxDestroy(dsigCtx);
rb_raise(rb_eXMLError, "Failed to load private key from %s", filename);
    }
    /* add the X509 cert info */
    filename = STR2CSTR(cert_file);
if(xmlSecCryptoAppKeyCertLoad(dsigCtx->signKey, filename, xmlSecKeyDataFormatPem) < 0) {
        xmlSecDSigCtxDestroy(dsigCtx);
rb_raise(rb_eXMLError, "Failed to load certificate from %s", filename);
    }
    /* sign */
    if(xmlSecDSigCtxSign(dsigCtx, signNode) < 0) {
        xmlSecDSigCtxDestroy(dsigCtx);
        rb_raise(rb_eXMLError, "Signature failed");
    }
    xmlSecDSigCtxDestroy(dsigCtx);
    /* dump to stdout */
    return Qnil;
}

As you can see, I'm creating a template, adding the KeyInfo, Value and X509 data. The key_file and cert_file are both the same (it's a PEM file).
Any ideas on what could be the problem?

thanks a lot for any hint.

On Jun 20, 2008, at 12:26 PM, Rolando Abarca wrote:

I'm trying to verify a XML I signed (using xmlsec), but I keep getting xmlSecDSigStatusUnknown as the status... what does it means?
Currently, the XML is of the kind:

<root>
<A>
 <B>
 <Sing for B>
 <B>
 <Sign for B>
</A>
<Sign for A>
</root>

What I'm trying to check first, is the sign for A, but it fails... Any hints on where I should start looking?
Regarding on how the tree is being constructed:

Generate a B sub-tree, save it to a file. Load it and sign it.
Generate an A sub-tree, add all B nodes, save it to a file. Load it and sign it.
Generate the root node, add the A node. Save the file.

Note: this save-load-sign routine is so far the only way I've found to preserve the whitespace (is there any other way?)

regards
--
Rolando Abarca M.


_______________________________________________
xmlsec mailing list
[email protected]
http://www.aleksey.com/mailman/listinfo/xmlsec

Reply via email to