CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 07:44
Оценка:
Приветствую ! Не работал кто CryptoAPI ?
Такой трабл: переносил из одной своей проги кусок, который творил цифровую подпись в новый COM-объект. Процедуры подписывания перенесены один в один (код не правил). В итоге функция CertFindCertificateInStore выдает отрицательный результат, хотя в старой проге всё отлично работало.
Ладно, может у COM объекта нет доступа к Current User, вот я и решил читать подпись из файла "*.pfx" напрямую. В тестовом екзешнике всё написал, всё отлично работает. Но с COM ситуация повторилась : теперь уже функция PFXImportCertStore возвращает отрицательный результат.
Может дело быть в каких то особенностях COM ?
Re: CryptoAPI и COM
От: Slayer Россия  
Дата: 08.08.02 07:49
Оценка:
Здравствуйте Eraserhead, Вы писали:

E>Приветствую ! Не работал кто CryptoAPI ?

E>Такой трабл: переносил из одной своей проги кусок, который творил цифровую подпись в новый COM-объект. Процедуры подписывания перенесены один в один (код не правил). В итоге функция CertFindCertificateInStore выдает отрицательный результат, хотя в старой проге всё отлично работало.
E>Ладно, может у COM объекта нет доступа к Current User, вот я и решил читать подпись из файла "*.pfx" напрямую. В тестовом екзешнике всё написал, всё отлично работает. Но с COM ситуация повторилась : теперь уже функция PFXImportCertStore возвращает отрицательный результат.
E>Может дело быть в каких то особенностях COM ?

Буквально позавчера была похожая проблема как раз с CryptoAPI. При чем я написал еще mfc прогу которая шифровала-расшифровывала данные. Так вот эта прога у меня работает отлично а на другом компьютере(там студии не стоит) нет — т.е. просто не шифрует и на любую функцию CryptoApi ошибку выдает(а на другом компьютере где студия стоит — все работает). Похоже проблема с дллками... Пробовал мфсишную прогу копировать с помощью wise installerа а также ручками дллки переносить — ничего не помогло...

Проблему решил ... переходом CryptLib++
Re[2]: CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 07:53
Оценка:
Мдяя, но у меня то COM объект не работает на том же компе, где exe-шник работает :))
Re[3]: CryptoAPI и COM
От: Slayer Россия  
Дата: 08.08.02 07:55
Оценка:
Здравствуйте Eraserhead, Вы писали:

E>Мдяя, но у меня то COM объект не работает на том же компе, где exe-шник работает


Да маленько отличается . Но есть один общий знаменатель CryptoApi
Re[2]: CryptoAPI и COM
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 07:59
Оценка:
Здравствуйте Slayer, Вы писали:

S>Здравствуйте Eraserhead, Вы писали:


S>Буквально позавчера была похожая проблема как раз с CryptoAPI. При чем я написал еще mfc прогу которая шифровала-расшифровывала данные. Так вот эта прога у меня работает отлично а на другом компьютере(там студии не стоит) нет — т.е. просто не шифрует и на любую функцию CryptoApi ошибку выдает(а на другом компьютере где студия стоит — все работает). Похоже проблема с дллками... Пробовал мфсишную прогу копировать с помощью wise installerа а также ручками дллки переносить — ничего не помогло...


Сильные криптографические методы не включены в русскую
версию Windows из-за наших законов. Проверь какая
была версия windows на которой работает и которой нет
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[3]: CryptoAPI и COM
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 08:00
Оценка:
Здравствуйте Eraserhead, Вы писали:

E>Мдяя, но у меня то COM объект не работает на том же компе, где exe-шник работает


У тебя тот COM объект, в котором не работает, не как сервис
выполняется случайно? А то там много чудес бывает.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[3]: CryptoAPI и COM
От: Slayer Россия  
Дата: 08.08.02 08:02
Оценка:
Здравствуйте Anatolix, Вы писали:

A>Здравствуйте Slayer, Вы писали:


S>>Здравствуйте Eraserhead, Вы писали:


S>>Буквально позавчера была похожая проблема как раз с CryptoAPI. При чем я написал еще mfc прогу которая шифровала-расшифровывала данные. Так вот эта прога у меня работает отлично а на другом компьютере(там студии не стоит) нет — т.е. просто не шифрует и на любую функцию CryptoApi ошибку выдает(а на другом компьютере где студия стоит — все работает). Похоже проблема с дллками... Пробовал мфсишную прогу копировать с помощью wise installerа а также ручками дллки переносить — ничего не помогло...


A>Сильные криптографические методы не включены в русскую

A>версию Windows из-за наших законов. Проверь какая
A>была версия windows на которой работает и которой нет

Работает на русккой не работает на английской
Re[4]: CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 08:06
Оценка:
Здравствуйте Anatolix, Вы писали:

A>Здравствуйте Eraserhead, Вы писали:


E>>Мдяя, но у меня то COM объект не работает на том же компе, где exe-шник работает :))


A>У тебя тот COM объект, в котором не работает, не как сервис

A>выполняется случайно? А то там много чудес бывает.

Да нет, попроще :)) regsvr32 MyCrypt.dll, а запускаю методы из PHP.
Re: CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 08:24
Оценка:
Сохранил структуру pPFX (вернее все её поля: cbData, pbData) на диске в коде exe-ка и в COM, перед выполнением функции:
if(!(hStore = PFXImportCertStore(&pPFX,szPassword,0)))
handleError(EPOS_OPEN_STORE);
Что не идивительно, структура идентична, но в одном случае PFXImportCertStore выполняеться, а в другом нет :(
Re: CryptoAPI и COM
От: OlegO Россия http://www.mediachase.ru
Дата: 08.08.02 09:07
Оценка:
Здравствуйте Eraserhead, Вы писали:

E>Приветствую ! Не работал кто CryptoAPI ?

E>Такой трабл: переносил из одной своей проги кусок, который творил цифровую подпись в новый COM-объект. Процедуры подписывания перенесены один в один (код не правил). В итоге функция CertFindCertificateInStore выдает отрицательный результат, хотя в старой проге всё отлично работало.
E>Ладно, может у COM объекта нет доступа к Current User, вот я и решил читать подпись из файла "*.pfx" напрямую. В тестовом екзешнике всё написал, всё отлично работает. Но с COM ситуация повторилась : теперь уже функция PFXImportCertStore возвращает отрицательный результат.
E>Может дело быть в каких то особенностях COM ?

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

Поэтому начнем с простого:

Как ты открываешь хранилище ?
Параметры CertFindCertificateInStore ?
Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?

код в студию

а так работали и в COM и в сервисах, без проблем.
С уважением, OlegO.
Re[2]: CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 10:46
Оценка:
Здравствуйте OlegO, Вы писали:


OO>Как мне кажется, тут либо ты не там ищешь в хранилище, либо может прав не хватает, больше сказать сложно.


OO>Поэтому начнем с простого:


OO>Как ты открываешь хранилище ?


if(!(hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER,"MY")))
handleError(EPOS_OPEN_STORE);

OO>Параметры CertFindCertificateInStore ?


if(!(pCertContext=CertFindCertificateInStore(hStore,ENCODING_TYPE,0,CERT_FIND_SUBJECT_STR_A,"Kosinov",NULL)))
handleError(EPOS_CERT_NOT_FOUND);

OO>Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?


С этим не совсем понятно, в обработчике ошибки handleError, вывожу ошибку такой строкой:
printf("GetLastError returns %x\n.",GetLastError());
В итоге получаю результат — 5. Что это, 0x5 ?
А после PFXImportCertStore, выдает ошибку 2.

OO>код в студию :)


OO>а так работали и в COM и в сервисах, без проблем.
Re[5]: CryptoAPI и COM
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 10:49
Оценка:
Здравствуйте Eraserhead, Вы писали:

E>Да нет, попроще regsvr32 MyCrypt.dll, а запускаю методы из PHP.


Это тоже из контекста сервиса, все выполняется в контексте Web сервера.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[3]: CryptoAPI и COM
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.08.02 10:51
Оценка:
Здравствуйте Eraserhead, Вы писали:

OO>>Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?


E>С этим не совсем понятно, в обработчике ошибки handleError, вывожу ошибку такой строкой:

E>printf("GetLastError returns %x\n.",GetLastError());

посмотри здесь — http://www.rsdn.ru/?files/?Classes/errmsg.xml

E>В итоге получаю результат — 5. Что это, 0x5 ?


Отказано в доступе.

E>А после PFXImportCertStore, выдает ошибку 2.


Не удается найти указанный файл.
Re[4]: CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 11:17
Оценка:
Здравствуйте Odi$$ey, Вы писали:

O$>Здравствуйте Eraserhead, Вы писали:

OO>>>Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?


E>>С этим не совсем понятно, в обработчике ошибки handleError, вывожу ошибку такой строкой:

E>>printf("GetLastError returns %x\n.",GetLastError());

O$>посмотри здесь — http://www.rsdn.ru/?files/?Classes/errmsg.xml

E>>В итоге получаю результат — 5. Что это, 0x5 ?


O$>Отказано в доступе.

Ну с этим понятно, но не совсем понятно, как с этим бороться :)

E>>А после PFXImportCertStore, выдает ошибку 2.


O$>Не удается найти указанный файл.

А вот с этим не совсем.
hStore = PFXImportCertStore(&pPFX,szPassword,0) не открывает никакой файл, все данные считываються до этого в структуру pPFX.
Может вся беда в том, что как написал Anatolix, всё это выполняеться в контексте Web сервера. Но как разрешить доступ этому COM объекту к хранилищу ?
Re[3]: CryptoAPI и COM
От: OlegO Россия http://www.mediachase.ru
Дата: 08.08.02 11:20
Оценка:
Здравствуйте Eraserhead, Вы писали:

E>Здравствуйте OlegO, Вы писали:



OO>>Как ты открываешь хранилище ?


E>if(!(hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER,"MY")))

E> handleError(EPOS_OPEN_STORE);

Попробуй хранение сертификата вынести в CERT_SYSTEM_STORE_LOCAL_MACHINE

OO>>Параметры CertFindCertificateInStore ?


E>if(!(pCertContext=CertFindCertificateInStore(hStore,ENCODING_TYPE,0,CERT_FIND_SUBJECT_STR_A,"Kosinov",NULL)))

E> handleError(EPOS_CERT_NOT_FOUND);

Как я понял ENCODING_TYPE == PKCS_7_ASN_ENCODING | X509_ASN_ENCODING ? Ну тут все просто и вроде правильно

E>В итоге получаю результат — 5. Что это, 0x5 ?


5 — Access is denied., для просмотра описания ошибок, можно использовать стандартную утилиту Error Lockup.

Так же Попробуй определить под каким пользователем работает COM объект у тебя в PHP, какие у него права.

E>А после PFXImportCertStore, выдает ошибку 2.


2 — The system cannot find the file specified.

ЗЫ Для визуального управления Сертификатами, удобно использовать MMC консоль с Snap-In'ом Certificates.
С уважением, OlegO.
Re[4]: CryptoAPI и COM
От: Eraserhead  
Дата: 08.08.02 11:47
Оценка:
Здравствуйте OlegO, Вы писали:

OO>Здравствуйте Eraserhead, Вы писали:


E>>Здравствуйте OlegO, Вы писали:



OO>>>Как ты открываешь хранилище ?


E>>if(!(hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER,"MY")))

E>> handleError(EPOS_OPEN_STORE);

OO>Попробуй хранение сертификата вынести в CERT_SYSTEM_STORE_LOCAL_MACHINE


OO>>>Параметры CertFindCertificateInStore ?


E>>if(!(pCertContext=CertFindCertificateInStore(hStore,ENCODING_TYPE,0,CERT_FIND_SUBJECT_STR_A,"Kosinov",NULL)))

E>> handleError(EPOS_CERT_NOT_FOUND);

OO>Как я понял ENCODING_TYPE == PKCS_7_ASN_ENCODING | X509_ASN_ENCODING ? Ну тут все просто и вроде правильно


E>>В итоге получаю результат — 5. Что это, 0x5 ?


OO>5 — Access is denied., для просмотра описания ошибок, можно использовать стандартную утилиту Error Lockup.


OO>Так же Попробуй определить под каким пользователем работает COM объект у тебя в PHP, какие у него права.


Да, спасибо, в этом и были все проблеммы. Вопрос был не к коду COM — объекта, а нашему админу, чтоб повысил под IIS права доступа скрипта index.php, который работал с COM — объектом. :)

E>>А после PFXImportCertStore, выдает ошибку 2.


OO>2 — The system cannot find the file specified.


OO>ЗЫ Для визуального управления Сертификатами, удобно использовать MMC консоль с Snap-In'ом Certificates.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.