Приветствую ! Не работал кто CryptoAPI ?
Такой трабл: переносил из одной своей проги кусок, который творил цифровую подпись в новый COM-объект. Процедуры подписывания перенесены один в один (код не правил). В итоге функция CertFindCertificateInStore выдает отрицательный результат, хотя в старой проге всё отлично работало.
Ладно, может у COM объекта нет доступа к Current User, вот я и решил читать подпись из файла "*.pfx" напрямую. В тестовом екзешнике всё написал, всё отлично работает. Но с COM ситуация повторилась : теперь уже функция PFXImportCertStore возвращает отрицательный результат.
Может дело быть в каких то особенностях COM ?
Здравствуйте Eraserhead, Вы писали:
E>Приветствую ! Не работал кто CryptoAPI ? E>Такой трабл: переносил из одной своей проги кусок, который творил цифровую подпись в новый COM-объект. Процедуры подписывания перенесены один в один (код не правил). В итоге функция CertFindCertificateInStore выдает отрицательный результат, хотя в старой проге всё отлично работало. E>Ладно, может у COM объекта нет доступа к Current User, вот я и решил читать подпись из файла "*.pfx" напрямую. В тестовом екзешнике всё написал, всё отлично работает. Но с COM ситуация повторилась : теперь уже функция PFXImportCertStore возвращает отрицательный результат. E>Может дело быть в каких то особенностях COM ?
Буквально позавчера была похожая проблема как раз с CryptoAPI. При чем я написал еще mfc прогу которая шифровала-расшифровывала данные. Так вот эта прога у меня работает отлично а на другом компьютере(там студии не стоит) нет — т.е. просто не шифрует и на любую функцию CryptoApi ошибку выдает(а на другом компьютере где студия стоит — все работает). Похоже проблема с дллками... Пробовал мфсишную прогу копировать с помощью wise installerа а также ручками дллки переносить — ничего не помогло...
Здравствуйте Slayer, Вы писали:
S>Здравствуйте Eraserhead, Вы писали:
S>Буквально позавчера была похожая проблема как раз с CryptoAPI. При чем я написал еще mfc прогу которая шифровала-расшифровывала данные. Так вот эта прога у меня работает отлично а на другом компьютере(там студии не стоит) нет — т.е. просто не шифрует и на любую функцию CryptoApi ошибку выдает(а на другом компьютере где студия стоит — все работает). Похоже проблема с дллками... Пробовал мфсишную прогу копировать с помощью wise installerа а также ручками дллки переносить — ничего не помогло...
Сильные криптографические методы не включены в русскую
версию Windows из-за наших законов. Проверь какая
была версия windows на которой работает и которой нет
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Eraserhead, Вы писали:
E>Мдяя, но у меня то COM объект не работает на том же компе, где exe-шник работает
У тебя тот COM объект, в котором не работает, не как сервис
выполняется случайно? А то там много чудес бывает.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Здравствуйте Slayer, Вы писали:
S>>Здравствуйте Eraserhead, Вы писали:
S>>Буквально позавчера была похожая проблема как раз с CryptoAPI. При чем я написал еще mfc прогу которая шифровала-расшифровывала данные. Так вот эта прога у меня работает отлично а на другом компьютере(там студии не стоит) нет — т.е. просто не шифрует и на любую функцию CryptoApi ошибку выдает(а на другом компьютере где студия стоит — все работает). Похоже проблема с дллками... Пробовал мфсишную прогу копировать с помощью wise installerа а также ручками дллки переносить — ничего не помогло...
A>Сильные криптографические методы не включены в русскую A>версию Windows из-за наших законов. Проверь какая A>была версия windows на которой работает и которой нет
Здравствуйте Anatolix, Вы писали:
A>Здравствуйте Eraserhead, Вы писали:
E>>Мдяя, но у меня то COM объект не работает на том же компе, где exe-шник работает :))
A>У тебя тот COM объект, в котором не работает, не как сервис A>выполняется случайно? А то там много чудес бывает.
Да нет, попроще :)) regsvr32 MyCrypt.dll, а запускаю методы из PHP.
Сохранил структуру pPFX (вернее все её поля: cbData, pbData) на диске в коде exe-ка и в COM, перед выполнением функции:
if(!(hStore = PFXImportCertStore(&pPFX,szPassword,0)))
handleError(EPOS_OPEN_STORE);
Что не идивительно, структура идентична, но в одном случае PFXImportCertStore выполняеться, а в другом нет :(
Здравствуйте Eraserhead, Вы писали:
E>Приветствую ! Не работал кто CryptoAPI ? E>Такой трабл: переносил из одной своей проги кусок, который творил цифровую подпись в новый COM-объект. Процедуры подписывания перенесены один в один (код не правил). В итоге функция CertFindCertificateInStore выдает отрицательный результат, хотя в старой проге всё отлично работало. E>Ладно, может у COM объекта нет доступа к Current User, вот я и решил читать подпись из файла "*.pfx" напрямую. В тестовом екзешнике всё написал, всё отлично работает. Но с COM ситуация повторилась : теперь уже функция PFXImportCertStore возвращает отрицательный результат. E>Может дело быть в каких то особенностях COM ?
Как мне кажется, тут либо ты не там ищешь в хранилище, либо может прав не хватает, больше сказать сложно.
Поэтому начнем с простого:
Как ты открываешь хранилище ?
Параметры CertFindCertificateInStore ?
Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?
OO>Как мне кажется, тут либо ты не там ищешь в хранилище, либо может прав не хватает, больше сказать сложно.
OO>Поэтому начнем с простого:
OO>Как ты открываешь хранилище ?
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 и в сервисах, без проблем.
Здравствуйте Eraserhead, Вы писали:
E>Да нет, попроще regsvr32 MyCrypt.dll, а запускаю методы из PHP.
Это тоже из контекста сервиса, все выполняется в контексте Web сервера.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Eraserhead, Вы писали:
OO>>Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?
E>С этим не совсем понятно, в обработчике ошибки handleError, вывожу ошибку такой строкой: E>printf("GetLastError returns %x\n.",GetLastError());
O$>Здравствуйте Eraserhead, Вы писали:
OO>>>Какой код ошибки в GetLastError после обработки CertFindCertificateInStore?
E>>С этим не совсем понятно, в обработчике ошибки handleError, вывожу ошибку такой строкой: E>>printf("GetLastError returns %x\n.",GetLastError());
Ну с этим понятно, но не совсем понятно, как с этим бороться :)
E>>А после PFXImportCertStore, выдает ошибку 2.
O$>Не удается найти указанный файл.
А вот с этим не совсем.
hStore = PFXImportCertStore(&pPFX,szPassword,0) не открывает никакой файл, все данные считываються до этого в структуру pPFX.
Может вся беда в том, что как написал Anatolix, всё это выполняеться в контексте Web сервера. Но как разрешить доступ этому COM объекту к хранилищу ?
Как я понял 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, Вы писали:
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.