x509 signature. failed to create signature template
От: _Kronos_  
Дата: 11.03.10 16:09
Оценка:
Добрый день!
Проблема заключается в том, что при формировании x509 подписи функция xmlSecTmplSignatureCreate ( см. код ниже ) возвращает NULL.
Тоесть ошибка возникает на этапе создания шаблона подписи...
Ситуация появилась с переносом сервереного модуля, который и подписывал сообщения, на другую машину(ОС RHEL 5.4 x64)

Может кто подскажет, в чем может скрыватся ошибка ?

П.с. даная функция успешно работала на предыдущей серверной машине, конфигурация которой была RHEL 4.4 x32


Код :

int digital_signature::sign_xml(const string& input_xml_buff, string& output_xml_buff, const string& key_file, const string& cert_file)
{
xmlDocPtr doc = NULL;
xmlNodePtr signNode = NULL;
xmlNodePtr refNode = NULL;
xmlNodePtr keyInfoNode = NULL;
xmlSecDSigCtxPtr dsigCtx = NULL;
int res = SIGN_ADD_OK;

/* load doc file */
doc = xmlParseMemory(input_xml_buff.c_str(), input_xml_buff.size());

if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL))
{
//fprintf(stderr, "Error: unable to parse xml\n");
res = SIGN_INVALID_INPUT_XML;
return res;
}

/* create signature template for RSA-SHA1 enveloped signature */

// !!!!!!!!!!! ТУТ ОШИБКА !!!!!!!!!!!! SignNode == NULL после выполнения функции
signNode = xmlSecTmplSignatureCreate(doc, xmlSecTransformInclC14NId, xmlSecTransformRsaSha1Id, NULL);

if(signNode == NULL)
{
//fprintf(stderr, "Error: failed to create signature template\n");
res = SIGN_ERROR_CREATE_SIGN_TEMPLATE;
}
else
{
/* add <dsig:Signature/> node to the doc */
xmlAddChild(xmlDocGetRootElement(doc), signNode);

/* add reference */

char *uri = "";
refNode = xmlSecTmplSignatureAddReference(signNode, xmlSecTransformSha1Id, NULL, (xmlChar*)uri, NULL);


//----->
//refNode = xmlSecTmplSignatureAddReference(signNode, xmlSecTransformSha1Id, NULL, NULL, NULL);

if (NULL == refNode)
{
//fprintf(stderr, "Error: failed to add reference to signature template\n");
res = SIGN_ERROR_ADD_REF_TO_TEMPLATE;
}
else
{
/* add enveloped transform */
//if(NULL == xmlSecTmplKeyInfoAddRetrievalMethod(signNode,uri,NULL))
//{
// res = -50;
//}
if(NULL == xmlSecTmplReferenceAddTransform(refNode, xmlSecTransformEnvelopedId))
{
//fprintf(stderr, "Error: failed to add enveloped transform to reference\n");
res = SIGN_ERROR_ADD_ENV_TO_REF;
}
else
{
/* add <dsig:KeyInfo/> and <dsig:X509Data/> */
keyInfoNode = xmlSecTmplSignatureEnsureKeyInfo(signNode, NULL);
if(NULL == keyInfoNode)
{
//fprintf(stderr, "Error: failed to add key info\n");
res = SIGN_ERROR_ADD_KEY_INFO;
}
else
{
if(NULL == xmlSecTmplKeyInfoAddX509Data(keyInfoNode))
{
//fprintf(stderr, "Error: failed to add X509Data node\n");
res = SIGN_ERROR_ADD_X509DATA;
}
else
{
/* create signature context */
dsigCtx = xmlSecDSigCtxCreate(NULL);

if(NULL == dsigCtx)
{
//fprintf(stderr,"Error: failed to create signature context\n");
res = SIGN_ERROR_CREATE_SIG_CONTEXT;
}
else
{
/* load private key, assuming that there is not password */
dsigCtx->signKey = xmlSecCryptoAppKeyLoad(key_file.c_str(), xmlSecKeyDataFormatPem, NULL, NULL, NULL);

if(NULL == dsigCtx->signKey)
{
//fprintf(stderr,"Error: failed to load private pem key from \"%s\"\n", key_file);
res = SIGN_ERROR_LOAD_PEM_KEY;
}
else
{
/* load certificate and add to the key */
if(0 > xmlSecCryptoAppKeyCertLoad(dsigCtx->signKey, cert_file.c_str(), xmlSecKeyDataFormatPem))
{
//fprintf(stderr,"Error: failed to load pem certificate \"%s\"\n", cert_file);
res = SIGN_ERROR_LOAD_PEM_CERT;
}
else
{
/* sign the template */
if(0 > xmlSecDSigCtxSign(dsigCtx, signNode) < 0)
{
//fprintf(stderr,"Error: signature failed\n");
res = SIGN_ERROR_SIGNATURE_FAIL;
}
else
{
/* print signed document to stdout */
//xmlDocDump(stdout, doc);

int size = 0;
xmlChar* lib_mem = NULL;
xmlDocDumpMemory(doc, &lib_mem, &size);

if (0 < size)
{
output_xml_buff.assign(reinterpret_cast<char*>(lib_mem),size);
}
else
{
res = SIGN_ERROR_DUMP_MEM;
}
xmlFree(lib_mem);
}
}
}
}
}
}
}
}

}

/* cleanup */
if(NULL != dsigCtx)
{
xmlSecDSigCtxDestroy(dsigCtx);
}
if(NULL != doc)
{
xmlFreeDoc(doc);
}
return res;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.