OpenSSL签名数据生成错误

OpenSSL签名数据生成错误,openssl,certificate,Openssl,Certificate,我使用以下代码创建SignedData CMS(代码简化) //使用部分模式添加具有自定义消息摘要算法的签名者 CMS_ContentInfo*content=CMS_符号(NULL,NULL,NULL,NULL,CMS_部分); if(content==NULL) { 返回-1; } //签名者证书、密钥和消息摘要算法 X509*用户X509=; CMS_SignerInfo*signer_info=CMS_add1_signer(内容、用户X509、执行副总裁sha256()、CMS_NOS

我使用以下代码创建SignedData CMS(代码简化)

//使用部分模式添加具有自定义消息摘要算法的签名者
CMS_ContentInfo*content=CMS_符号(NULL,NULL,NULL,NULL,CMS_部分);
if(content==NULL)
{
返回-1;
}
//签名者证书、密钥和消息摘要算法
X509*用户X509=;
CMS_SignerInfo*signer_info=CMS_add1_signer(内容、用户X509、执行副总裁sha256()、CMS_NOSMIMECAP);
如果(签名者信息==NULL)
{
返回-1;
}
//添加中间证书
如果(CMS_add0_cert(content,)==0)
{
返回-1;
}
//添加CA证书
如果(CMS_add0_cert(content,)==0)
{
返回-1;
}
//将结果二进制数据存储在内存中
BIO*input=BIO_new_mem_buf();
如果(CMS_final(内容、输入、空、CMS_NOSMIMECAP | CMS_二进制)==0)
{
返回-1;
}
我添加了两个额外的证书,以便在服务器上有一个用于验证的证书链。它使用错误的证书链生成SignedData。我使用了不同的组合,但链始终相同:CA证书->中间证书->签名者证书

据我所知,正确的顺序是:签名者证书->中间证书->CA证书


有没有办法解决这个问题?

CMS签名数据
证书中的证书包含一组证书。当然,由用户/验证者从证书存储中的可信证书开始创建一个可信链,这取决于用户/验证者。

我在这里可能完全不正确,所以请谨慎对待。你到底有什么问题?如果您正在尝试解决证书订购问题,我相信您正在尝试解决一个不存在的问题。根据第6.6节,
扩展证书和证书
:“该集应足以包含从公认的“根”或“顶级证书颁发机构”到与该集关联的所有签名者的链”.BouncyCastle的SignedData和OpenSSL的SignedData在
证书
成员中具有不同的证书顺序。我只是想确定顺序在这里并不重要。创建一个wiki答案只是为了表明这个问题已经得到了回答。
// use partial mode to add signer with custom message digest algorithm
CMS_ContentInfo *content = CMS_sign(NULL, NULL, NULL, NULL, CMS_PARTIAL);
if (content == NULL)
{
    return -1;
}
// signer certificate, key and message digest algorithm
X509 *userX509 = <...>;
CMS_SignerInfo *signer_info = CMS_add1_signer(content, userX509, <...>, EVP_sha256(), CMS_NOSMIMECAP);
if (signer_info == NULL)
{
    return -1;
}
// add intermediate certificate
if (CMS_add0_cert(content, <...>) == 0)
{
    return -1;
}
// add CA certificate
if (CMS_add0_cert(content, <...>) == 0)
{
    return -1;
}
// store result binary data in memory
BIO *input = BIO_new_mem_buf(<...>);
if (CMS_final(content, input, NULL, CMS_NOSMIMECAP | CMS_BINARY) == 0)
{
    return -1;
}