01.11.2006 7:13:03плохой ключ Ответов: 7
dionis
Народ, помогите!!!
Ситуация такая:
Делаем запрос на сертификацию своими средствами,
отправляем на сервер MS с модулем КриптоПро
70% запросов проходят на ура,
остальные - стопоряться, сервер возвращает ошибку:

Ваш запрос на сертификат был отвергнут.
Код запроса 0. Сообщение о назначении "Ошибка при обработке запроса Плохой ключ. 0x80090003 (-2146893821)".
Обратитесь к системному администратору за дальнейшими сведениями.

Мож кто знает что это за ошибка? Как она генериться - до проверки подписи или после? В чём ключ может быть "ПЛОХОЙ"? Какой ключ должен быть "ХОРОШИЙ"?

Заранее благодарен за ответы!
 
Ответы:
01.11.2006 11:59:19Kirill Sobolev
Я так подозреваю, что ошибка появляется именно во время проверки подписи. NTE_BAD_KEY означает то, что в запросе лежит недействительный (невалидный) открытый ключ, а возвращает ее скорее всего что-нибудь типа CryptVerifySignature.
02.11.2006 4:58:40dionis
Дык... в смысле НЕДЕЙСТВИТЕЛЬНЫЙ??? Недействительный по дате? Так стартовые и конечные даты не передаются в запросе... :-(
Вначале грешили на то, что в сигнатуре ключа присутствуют байты 0х00 - однако были получены сертификаты с нулевыми байтами в ключе... :-(
Мож как то проверяется сигнатура ключа? И там есть какие то заковыки?
02.11.2006 9:20:46Kirill Sobolev
Нет, недействительный в смысле invalid
02.11.2006 9:35:30dionis
Kirill Sobolev,
я конечно страшно извиняюсь, "недействительный в смысле invalid" - т.е. он отсутствует или длинной не 64 байта или ...???
02.11.2006 11:06:18Kirill Sobolev
А каким образом я могу это сказать, не видя запроса? Достаточно того, что он недействительный - значит надо смотреть как запрос делается.
02.11.2006 13:01:03dionis
Ключ запихивается в запрос 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;

... так в общих чертах ...
могу еще сам запрос намылить....
02.11.2006 13:35:17Kirill Sobolev
видимо openssl как-то не так его запихивает