これを行うための回避策を見つけました。
アルゴリズムを含むが、署名者情報と証明書を含まないテンプレートを作成しました。CryptMsgOpenToDecode
asn1 エディターまたは CryptoApi (およびを使用) を使用して実行できます。CryptMsgControl(..., CMSG_CTRL_DEL_SIGNER, ...)
次に、署名者情報と証明書を現在の署名から上で作成したテンプレートに転送する必要があります。
PCMSG_CMS_SIGNER_INFO pSignerInfo;
DWORD cbSignerInfo;
CryptMsgGetParam(hMsg2, CMSG_CMS_SIGNER_INFO_PARAM, 0, NULL, &cbSignerInfo);
pSignerInfo = (PCMSG_CMS_SIGNER_INFO)LocalAlloc(LPTR, cbSignerInfo);
CryptMsgGetParam(hMsg2, CMSG_CMS_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &cbSignerInfo);
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CMS_SIGNER_INFO, pSignerInfo);
DWORD cbCertInfo;
CryptMsgGetParam(hMsg2, CMSG_CERT_PARAM, 0, NULL, &cbCertInfo);
std::vector<BYTE> pCertInfo(cbCertInfo);
CryptMsgGetParam(hMsg2, CMSG_CERT_PARAM, 0, &pCertInfo[0], &cbCertInfo);
CRYPT_INTEGER_BLOB certBlob;
memset(&certBlob, 0, sizeof(CRYPT_INTEGER_BLOB));
certBlob.cbData = cbCertInfo;
certBlob.pbData = &pCertInfo[0];
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &certBlob);
その後、新しい署名を追加できます。