| ||||
| ||||
Мне необходимо реализовать поддержку S/MIME в своей программе и я столкнулся с проблемой получения сертификата подписавшей стороны. if ( !( hCertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY"))) { HandleError("The MY store could not be openned."); } DecryptPara.cbSize = sizeof(CRYPT_DECRYPT_MESSAGE_PARA); DecryptPara.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING; DecryptPara.cCertStore = 1; DecryptPara.rghCertStore = &hCertStore; VerifyPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA); VerifyPara.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING; VerifyPara.hCryptProv = 0; VerifyPara.pfnGetSignerCertificate = NULL; VerifyPara.pvGetArg = NULL; pbDecrypted = NULL; cbDecrypted = 0; PCCERT_CONTEXT pSignerCert; if(!(CryptDecryptAndVerifyMessageSignature(&DecryptPara, &VerifyPara, dwSignerIndex, pbSignedAndEncryptedBlob, cbSignedAndEncryptedBlob, NULL, &cbDecrypted, NULL, &pSignerCert))) { DWORD dwError = GetLastError(); HandleError("Failed decrypt and verify signature."); } .......... Функция CryptDecryptAndVerifyMessageSignature не отрабатывает и возвращает ошибку "ASN1 bad tag value met". Хотя если при тех же условиях вместо этой функции вызывать функцию CryptDecryptMessage, то сообщение нормально расшифровывается. Подскажите что я не правильно делаю или хотя бы какие-нибудь ссылки на практическую реализацию S/MIME с помощью CryptoAPI. | ||||
Ответы: | ||||
| ||||
Поищите на форуме фарзу S/MIME. Есть ссылки. А если ваш файл расшифровывается (DecryptMessage), а функция последовательного расшифрования и проверки подписи сообщает об ошибке ASN.1 может внутри и нет подписанных данных? | ||||
| ||||
Подписанные данные есть, т.к. после расшифрования видно что есть вложенный файл с расширением p7s. Да и в Outlook Express можно просмотреть сертификат для шифрования и сертификат для подписи. | ||||
| ||||
Спасибо за ответ kure. Пошел обходными путями и получилось. Я сделал примерно так. С помощью функции CryptMsgGetParam и параметра CMSG_SIGNER_CERT_ID_PARAM я получаю ID сертификата, потом с помощью функции CryptGetMessageCertificates открываю p7s файл как хранилище сертификатов и в нем с помощью CertFindCertificateInStore ищу сертификат по известному ID. | ||||