| ||||
| ||||
Добрый день всем. Возник вопрос. При интеграции с некоторой системой. Дали мне сертификат с private key. Необходимо создать hash md5, подписать private key и отправить в систему запрос. Открываем хранилище сертификатов HCERTSTORE hStoreHandle; if ( !( hStoreHandle = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, //CERT_SYSTEM_STORE_LOCAL_MACHINE, CERT_STORE_NAME))) { HandleError("Нельзя открыть хранилище MY."); } // Получаем указатель на наш сертификат PCCERT_CONTEXT pSignerCert; if(pSignerCert = CertFindCertificateInStore( hStoreHandle, MY_TYPE, 0, CERT_FIND_SUBJECT_STR, SIGNER_NAME, NULL)) { printf("Сертификат найден.\n"); } else { HandleError( "Сертификат не найден."); return false; } // через функцию CryptAcquireCertificatePrivateKey получаем доступ к CSP HCRYPTPROV hProv; DWORD dwKeySpec; BOOL fCallerFreeProv; if(CryptAcquireCertificatePrivateKey( pSignerCert, CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hProv, &dwKeySpec, &fCallerFreeProv )) { printf("CryptAcquireCertificatePrivateKey выполнилась успешно!\n"); } else { HandleError(" Ошибка CryptAcquireCertificatePrivateKey.\n"); return false; } // Создаем пустой hash объект HCRYPTHASH hHash; if(CryptCreateHash( hProv, CALG_MD5, 0, 0, &hHash)) { printf("Hash объект создан.\n"); } else { HandleError("Ошибка CryptCreateHash."); return false; } // Вычисляем hash для нашего сообщения if(CryptHashData( hHash, pbMessage, cbMessage, 0)) { printf("Hash объект вычислен.\n"); } else { HandleError("Ошибка CryptHashData."); return false; } // Переменные для указателя и длины подписи BYTE *pbSignature; DWORD dwSigLen; if(CryptSignHash( hHash, dwKeySpec, NULL, 0, NULL, &dwSigLen)) { printf("Длина подписи %d .\n",dwSigLen); } else { HandleError("Ошибка CryptSignHash."); return false; } if(pbSignature = new BYTE[dwSigLen]) { printf("Память под подпись выделена.\n"); } else { HandleError("Ошибка памяти."); return false; } if(CryptSignHash( hHash, dwKeySpec, NULL, 0, pbSignature, &dwSigLen)) { m_iSignLen=dwSigLen; printf("Подпись:\n"); } else { HandleError("Ошибка CryptSignHash."); return false; } if(pbSignature) delete pbSignature; if (pbMessage) delete pbMessage; if(hHash) CryptDestroyHash(hHash); if(hProv) CryptReleaseContext(hProv, 0); if(pSignerCert) CertFreeCertificateContext(pSignerCert); if(CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG)) { printf("\nХранилище закрыто. \n"); } else { HandleError("Ошибка!"); return false; } сообщение полученное мной и присланное мне для теста не совпадают. Что я делаю не так. Please HELP | ||||
Ответы: | ||||
| ||||
Может хэш не от того считается? | ||||
| ||||
Спасибо за ответ. Нет проблема я думаю в следующем. На той стороне работают с openssl или с java а я с CryptoAPI. MD5withRSA вот чего они хотят | ||||
| ||||
У Вас по идее то же самое, если ключ RSA. | ||||