Вопрос по сертификатам и CryptoAPI

chikalov
Дата: 05.06.2009 09:44:42
Есть процедурка которая должна по идее подписать файлик указанным сертификатом, но что-то у меня вылетает ошибочка "нет ключей". Что может быть за проблема?
может я чего не догоняю?

Использую провайдер от КриптоПро.

procedure Sign(data: TStream; rslt: TStream; signer_cert: PCCERT_CONTEXT; sz_oid: PChar; DetachedSignature: Boolean);
    var pSignPara: PCRYPT_SIGN_MESSAGE_PARA;
        MessageArray: array[0..0] of PByte;
        MessageSizeArray: array[0..0] of Dword;
        pbSignedMessageBlob, pbMessageBlob: PByte;
        cbSignedMessageBlob: Dword;
        keyContext : CERT_KEY_CONTEXT;
        keyProvInfo: CRYPT_KEY_PROV_INFO;
        hProv: HCRYPTPROV;
begin
    New(pSignPara);
    ZeroMemory(pSignPara, SizeOf(CRYPT_SIGN_MESSAGE_PARA));

    if not CryptAcquireContext(@hProv, nil, PROVIDER_NAME, PROVIDER_TYPE,CRYPT_VERIFYCONTEXT) then
      begin
	    ///Ченить написать для обработке
        exit;
      end;

    keyProvInfo.pwszContainerName := Str2WChar(GetContainerName);
    keyProvInfo.pwszProvName := Str2Wchar(GetProviderName);
    keyProvInfo.dwProvType := GetProviderType;
    keyProvInfo.dwFlags := 0;
    keyProvInfo.cProvParam := 0;
    keyProvInfo.dwKeySpec := AT_KEYEXCHANGE;
    CertSetCertificateContextProperty(signer_cert,CERT_KEY_PROV_INFO_PROP_ID, 0, @keyprovInfo);

    keyContext.hCryptProv := CryptContext.Provider;
    keyContext.dwKeySpec := AT_KEYEXCHANGE;
    keyContext.cbSize := sizeof(CERT_KEY_CONTEXT);
    CertSetCertificateContextProperty( signer_cert, CERT_KEY_CONTEXT_PROP_ID,
      CERT_STORE_NO_CRYPT_RELEASE_FLAG,
    @keyContext);
     

    pSignPara.dwMsgEncodingType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
    pSignPara.cbSize := sizeof(CRYPT_SIGN_MESSAGE_PARA);
    pSignPara.pSigningCert := signer_cert;
    pSignPara.HashAlgorithm.pszObjId := sz_oid;
    pSignPara.cMsgCert := 1;
    pSignPara.rgpMsgCert := @signer_cert;

    MessageSizeArray[0] := data.Size - data.Position;

    GetMem(pbMessageBlob, data.Size - data.Position);
    data.Read(pbMessageBlob^, data.Size-data.Position);

    MessageArray[0] := pbMessageBlob;
    cbSignedMessageBlob := 0;

    if(not CryptSignMessage(
        pSignPara,         
        DetachedSignature, 
        1,                 
        Addr(MessageArray),
        Cardinal(Addr(MessageSizeArray)),
        nil,                  
        @cbSignedMessageBlob))
    then
      raise TCryptException.Create(ceOtherCryptError);

    GetMem(pbSignedMessageBlob,cbSignedMessageBlob);
  
    if(not CryptSignMessage(
        pSignPara,
        DetachedSignature,
        1,
        Addr(MessageArray),
        Cardinal(Addr(MessageSizeArray)),
        pbSignedMessageBlob,
        @cbSignedMessageBlob))
    then
      raise TCryptException.Create(ceOtherCryptError);
    rslt.Write(pbSignedMessageBlob^, cbSignedMessageBlob);
end;
Ryz
Дата: 05.06.2009 10:03:19
Мы через с КриптоПро через Capicom работаем.
Показал бы код, но стыдно :)
chikalov
Дата: 05.06.2009 10:15:38
Покажи, никто не увидит
Вообще, можешь мой сертификат проверить со своим кодом?
подписать какой нибудь файлик?
Ryz
Дата: 05.06.2009 10:19:41
Чтобы подписать или зашифровать файлик нужен ЗАКРЫТЫЙ ключ и сертификат на него, который ты должен получить в удостоверяющем центре, причем это стоит денюжку.

Может у тебя не код глючит, а ты просто не разобрался с технологией?

Класс подровняю, уберу зависимости от вспомогательных модулей и вышлю, наверное, ближе к вечеру.

Давай еще раз.
1. У тебя есть ЗАКРЫТЫЙ ключ?
2. У тебя есть парный к закрытому ОТКРЫТЫЙ ключ?
3. Есть действующий сертификат?
4. Кто у вас рулит УЦ? Есть такое вообще?
Ryz
Дата: 05.06.2009 10:52:18
Отправил тебе файлик.
chikalov
Дата: 05.06.2009 10:54:32
Ryz

Чтобы подписать или зашифровать файлик нужен ЗАКРЫТЫЙ ключ и сертификат на него, который ты должен получить в удостоверяющем центре, причем это стоит денюжку.

Может у тебя не код глючит, а ты просто не разобрался с технологией?

Класс подровняю, уберу зависимости от вспомогательных модулей и вышлю, наверное, ближе к вечеру.

Давай еще раз.
1. У тебя есть ЗАКРЫТЫЙ ключ?
2. У тебя есть парный к закрытому ОТКРЫТЫЙ ключ?
3. Есть действующий сертификат?
4. Кто у вас рулит УЦ? Есть такое вообще?


Может я чего и не догнал или путаю с PGP
1. Закрытого ключа для данного сертификата нет
2. Открытого ключа к соответственно тоже
3. Сертификат я вложил в первый пост, там вроде есть открытый ключ
4. УЦ у нас нет


Дааа..... Походу действительно я напутал
но тогда зачем мне нужен этот сертификат? Если я не могу им подписать ничего?
Ryz
Дата: 05.06.2009 11:02:44
Сертификат содержит твой ОТКРЫТЫЙ ключ.
Это значит, что на тебя могут что-то шифровать. Правда ты все равно не можешь расшифровать без закрытого :)

Почитай доки на криптопро, полазь у них на форуме. Вы когда покупали криптопро, вам должны были выдать хоть один закрытый ключ. Или лицензию на его получение.

Сорри за капс, сами в свое время намаялись с этими ключами.
В России только 2 системы сертифицированных - верба и криптопро.
И обе уродские :)
chikalov
Дата: 05.06.2009 11:45:12
автор

Сертификат содержит твой ОТКРЫТЫЙ ключ.
Это значит, что на тебя могут что-то шифровать. Правда ты все равно не можешь расшифровать без закрытого :)


В том то и прикол что этот сертификат НЕ мой. это я должен на нем зашифровать данные.
Расшифровывать будут уже на ТОЙ стороне.
или в этот сертификат я должен включить свой закрытый ключ?
Ryz
Дата: 05.06.2009 11:48:24
Почитай про ассиметричную криптографию.

Чтобы зашифровать файл у тебя должен быть свой ЗАКРЫТЫЙ ключ и чужой ОТКРЫТЫЙ (сертификат).
RENaissance
Дата: 05.06.2009 11:57:31

Ryz

Почитай про ассиметричную криптографию.

Чтобы зашифровать файл у тебя должен быть свой ЗАКРЫТЫЙ ключ и чужой
ОТКРЫТЫЙ (сертификат).

Всегда считал, что для шифрования используется только открытый ключ. Собственно, именно для этого он и передается.

Posted via ActualForum NNTP Server 1.4