| ||||
| ||||
Народ, помогите!!! Ситуация такая: Делаем запрос на сертификацию своими средствами, отправляем на сервер MS с модулем КриптоПро 70% запросов проходят на ура, остальные - стопоряться, сервер возвращает ошибку: Ваш запрос на сертификат был отвергнут. Код запроса 0. Сообщение о назначении "Ошибка при обработке запроса Плохой ключ. 0x80090003 (-2146893821)". Обратитесь к системному администратору за дальнейшими сведениями. Мож кто знает что это за ошибка? Как она генериться - до проверки подписи или после? В чём ключ может быть "ПЛОХОЙ"? Какой ключ должен быть "ХОРОШИЙ"? Заранее благодарен за ответы! | ||||
Ответы: | ||||
| ||||
Я так подозреваю, что ошибка появляется именно во время проверки подписи. NTE_BAD_KEY означает то, что в запросе лежит недействительный (невалидный) открытый ключ, а возвращает ее скорее всего что-нибудь типа CryptVerifySignature. | ||||
| ||||
Дык... в смысле НЕДЕЙСТВИТЕЛЬНЫЙ??? Недействительный по дате? Так стартовые и конечные даты не передаются в запросе... :-( Вначале грешили на то, что в сигнатуре ключа присутствуют байты 0х00 - однако были получены сертификаты с нулевыми байтами в ключе... :-( Мож как то проверяется сигнатура ключа? И там есть какие то заковыки? | ||||
| ||||
Нет, недействительный в смысле invalid | ||||
| ||||
Kirill Sobolev, я конечно страшно извиняюсь, "недействительный в смысле invalid" - т.е. он отсутствует или длинной не 64 байта или ...??? | ||||
| ||||
А каким образом я могу это сказать, не видя запроса? Достаточно того, что он недействительный - значит надо смотреть как запрос делается. | ||||
| ||||
Ключ запихивается в запрос OpenSSL'ем таким вот макаром: BYTE PublicValue[64]; ASN1_STRING *public_key; BYTE seq[66]; seq[0] = 0x04; seq[1] = 0x40; seq[2] = '\0'; for(int v=2; v<66; v++) { seq[v] = PublicValue[v-2]; }; seq[66] = '\0'; public_key = ASN1_STRING_type_new(V_ASN1_BIT_STRING); rv = ASN1_STRING_set(public_key, seq, 66); for(int v=0; v<66; v++) { public_key->data[v] = seq[v]; }; r->req_info->pubkey->public_key = public_key; O = OBJ_nid2obj(NID_id_GostR3410_2001); r->req_info->pubkey->algor->algorithm = O; par = ASN1_STRING_type_new(V_ASN1_SEQUENCE); BYTE alpar[] = {0x30, 0x12, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01 }; int l = ARRAYSIZE(alpar); rv = ASN1_STRING_set(par, alpar, l); ASN1_TYPE_set(Type, V_ASN1_SEQUENCE, (void *)par); r->req_info->pubkey->algor->parameter = Type; ... так в общих чертах ... могу еще сам запрос намылить.... | ||||
| ||||
видимо openssl как-то не так его запихивает | ||||