| ||||
| ||||
Добрый день, пытаюсь правильно создать CRL, вроде все проходит без ошибок но файл не могу открыть пишет ошибка в формирование, укажите где "собака зарыта". Спасибо. CCC_Crl::CCC_Crl() { CRL_ENTRY CRLEntry; CRL_INFO CRLs; PBYTE ser_num; DWORD ser_num_len; int ser_num_int; CERT_RDN_ATTR nameAttr; char *nameString; CERT_RDN rdn; CERT_NAME_INFO nameInfo; DWORD encNameLen; PBYTE EncName; char *st1; CRYPT_OBJID_BLOB Parameters; DWORD CRL_enc_len; PBYTE CRL_enc; CERT_EXTENSION extension; CERT_EXTENSION crls_extension; int reason_code; int i; FILETIME ftTime; SYSTEMTIME stTime; RTAsciiString MyText ("miam"); nameAttr.dwValueType = CERT_RDN_PRINTABLE_STRING; nameAttr.pszObjId = "2.5.4.3"; nameAttr.Value.cbData = (DWORD)::strlen(MyText.ToAsciiString()); nameAttr.Value.pbData = (BYTE *) MyText.ToAsciiString(); rdn.cRDNAttr= 1; rdn.rgRDNAttr= &nameAttr; nameInfo.cRDN= 1; nameInfo.rgRDN= &rdn; if (!(::CryptEncodeObject(MY_ENCODING_TYPE, ((LPCSTR) 7), &nameInfo, NULL, &encNameLen))) { // Error in CryptEncodeObject . } if (!(EncName = (BYTE *) _alloca(encNameLen))) { // // Error @@@ Обработка через throw // RTException(RTError::BadOperation, errNo, L"Функция", // L"Операция" // } if (!(::CryptEncodeObject(MY_ENCODING_TYPE, ((LPCSTR) 7), &nameInfo, EncName, &encNameLen))) { // Error in CryptEncodeObject } ser_num_int=30; CRLEntry.SerialNumber.cbData=sizeof(ser_num_int); CRLEntry.SerialNumber.pbData=(BYTE *)ser_num_int; GetSystemTime(&stTime); SystemTimeToFileTime(&stTime, &ftTime); CRLEntry.RevocationDate = ftTime; reason_code=0; CryptEncodeObject(MY_ENCODING_TYPE, X509_CRL_REASON_CODE, &reason_code, NULL, &extension.Value.cbData); if (!(extension.Value.pbData = (BYTE *) _alloca(extension.Value.cbData))) { // // Error @@@ Обработка через throw // RTException(RTError::BadOperation, errNo, L"Функция", // L"Операция" // } CryptEncodeObject(MY_ENCODING_TYPE, X509_CRL_REASON_CODE, &reason_code, extension.Value.pbData, &extension.Value.cbData); extension.pszObjId = szOID_CRL_REASON_CODE; extension.fCritical = false; CRLEntry.cExtension = 0; CRLEntry.rgExtension = &extension; CRLs.dwVersion = CRL_V1; //memset(params, 0, sizeof(params)); memset(&Parameters, 0, sizeof(Parameters)); CRLs.SignatureAlgorithm.pszObjId = szOID_OIWSEC_sha1RSASign; CRLs.SignatureAlgorithm.Parameters = Parameters; GetSystemTime(&stTime); SystemTimeToFileTime(&stTime, &ftTime); CRLs.ThisUpdate = ftTime; GetSystemTime(&stTime); SystemTimeToFileTime(&stTime, &ftTime); WORD wMonths = 24; stTime.wMonth += wMonths; if ((stTime.wMonth / 12) > 0) { stTime.wYear += (stTime.wMonth / 12); stTime.wMonth = (stTime.wMonth % 12); } SystemTimeToFileTime(&stTime, &ftTime); CRLs.NextUpdate = ftTime; CRLs.cCRLEntry = 1; CRLs.rgCRLEntry = &CRLEntry; CRLs.cExtension=0; CRLs.rgExtension=NULL; CRLs.Issuer.cbData=encNameLen; CRLs.Issuer.pbData=EncName; CCC_PrivateKeyCreator *ClientKeys; ClientKeys = new CCC_PrivateKeyCreator(1024); HCRYPTPROV hCryptProvREQ = ClientKeys->getHandle(); CryptSignAndEncodeCertificate(hCryptProvREQ, AT_SIGNATURE, MY_ENCODING_TYPE, X509_CERT_CRL_TO_BE_SIGNED, &CRLs, &(CRLs.SignatureAlgorithm), NULL, NULL, &CRL_enc_len); if (!(CRL_enc = (BYTE *) _alloca(CRL_enc_len))) { // // Error @@@ Обработка через throw // RTException(RTError::BadOperation, errNo, L"Функция", // L"Операция" // } CryptSignAndEncodeCertificate(hCryptProvREQ, AT_SIGNATURE, MY_ENCODING_TYPE, X509_CERT_CRL_TO_BE_SIGNED, &CRLs, &(CRLs.SignatureAlgorithm), NULL, CRL_enc, &CRL_enc_len); PCCRL_CONTEXT MyCRLContext = CertCreateCRLContext( MY_ENCODING_TYPE, CRL_enc, sizeof(CRL_enc)); if (MyCRLContext == NULL) { FILE * myfile; myfile = fopen( "c:\\mycrlerror.txt", "a"); int t = GetLastError(); fprintf(myfile, "%d", t); fclose(myfile); }else{ FILE * myfile; myfile = fopen( "c:\\mycrl.crl", "w"); fprintf(myfile, "%s", MyCRLContext); fclose(myfile); } ClientKeys->~CCC_PrivateKeyCreator(); } | ||||
Ответы: | ||||
| ||||
У Вас какое-то нетрадиционное сохранение в файл. Результат работы функции CryptSignAndEncodeCertificate - это бинарный буфер. А Вы его преобразовываете в структуру CRL_CONTEXT и потом пытаетесь ее сохранить в файл как текстовую строку! Так ничего работать не будет. Нужно что-то типа myfile = fopen( "c:\\mycrl.crl", "wb"); fwrite(CRL_enc, sizeof(BYTE), CRL_enc_len, myfile); Контекст создается тоже неправильно, последний аргумент должен быть длина блоба а не размер перемнной. | ||||