Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.06.2012(UTC) Сообщений: 65 Откуда: Almaty, KZ
|
не являюсь потомственным программистом, без программисткого образования, но очень хотел бы доделать свою программу регистрации сертификата в браузере. поясняю: есть некая программа тумар для работы всяких интернет банкинков, гос закупа и статической отчетности, после установки которой "ломается" функционал импортирования сертификатов rsa.p12 в браузер (или систему) стандартными методами. есть у нас система для сдачи налоговой отчетности, выдается ключик формата гост, который потом конвертируем в сертификат rsa.p12 на том портале, и который потом используется для входа в эту систему. этот сертификат должен импортироваться в момент конвертирования путем использования ява апплета. по идее он должен положить полученный сертификат в "Личные". программа тумар же в эту папку "Личные" добавляет свою тумарскую папку, в результате в этой "Личные" две папки, и видимо из-за этого стандартный метод не работает. то есть при наличии программы тумар регистрировать сертификат приходится вручную, помечая галку отображения физического хранилища и выбирая четко путь "Личные\Реестр":  только после этого наш сертификат запоминается системой. поскольку бухгалтерши, в большинстве своем, не очень образованы в айтишном плане, я хотел бы сделать некий автоматический регистратор сертификатов, который бы сам записывал именно по физическому пути так сказать сертификат. изучая форумы вроде как нашлись некоторые команды крипто апи, которые все это могут воспроизвести, однако примеры все в основном на с++ мне их придется еще переводить в свой, менее распространенный язык. из последних были изучены две команды: PFXImportCertStore и CertCloseStore. насколько я понимаю необходимо сделать копию или образ сертификата в памяти, и после подсунуть его в PFXImportCertStore, эта команда вроде как должна записать сертификат куда надо и после этого следует закрыть все это дело CertCloseStore. Код:Structure CRYPT_DATA_BLOB
cbData.l
*pbData
EndStructure
; необходимо "познакомить" мой язык программирования с функциями из
; чужой библиотеки. для этого объявляется прототип с описаниями
; переменных и сам вызов функции
Prototype.i ProtoPFXImportCertStore(*pPFX, szPassword.c, dwFlags.l)
Global PFXImportCertStore.ProtoPFXImportCertStore
Prototype.i ProtoCertCloseStore(hCertStore.i, dwFlags.l)
Global CertCloseStore.ProtoCertCloseStore
Define hdll.l
CoInitialize_(0)
hdll=OpenLibrary(#PB_Any,"Crypt32.dll")
PFXImportCertStore=GetFunction(hdll,"PFXImportCertStore")
CertCloseStore=GetFunction(hdll,"CertCloseStore")
;file$ = OpenFileRequester("Select a file","","certificate (.p12)|*.p12|All files (*.*)|*.*",0)
file$ = "D:\RSA.p12"
; путь до файла сертификата
If file$
If ReadFile(0, file$)
length = Lof(0) ; чтение длинны файла
*MemoryID = AllocateMemory(length) ; резервирование необходимого количества памяти
If *MemoryID
ReadData(0, *MemoryID, length) ; чтение файла в тот зарезервированный участок
EndIf
CloseFile(0)
blob.CRYPT_DATA_BLOB
blob\cbData = length
blob\pbData = *MemoryID
hStore = PFXImportCertStore(blob,#Null,0)
;Debug hStore
ErrorCode = GetLastError_()
If ErrorCode
ErrorBuffer$ = Space(255)
FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrorCode, 0, @ErrorBuffer$, Len(ErrorBuffer$), 0)
Debug ErrorBuffer$
EndIf
If hStore
CertCloseStore(hStore,0);
EndIf
EndIf
EndIf
CoUninitialize_()
CloseLibrary(hdll)
приведенный код вроде бы как работает. PFXImportCertStore возвращает какое-то число, GetLastError молчит и не выдает каких-либо ошибок, а CertCloseStore возвращает единичку. но ничего в браузере в личных не показывает и в certmgr.msc тоже отсутствует этот мой сертификат. вторая проблема, которая может быть связана с первой: в данном случае тип переменной szPassword определен как константа szPassword.c. сертификат изначально без пароля и используется в качестве пароля параметр #Null. по идее же для определения типа пароля следует использовать string szPassword.s, а не константу - однако в этом случае PFXImportCertStore(blob,"",0) - то есть "" в качестве отсутствующего в сертификате пароля - возвращает ошибку что сетевой пароль не верный. если же подсунуть сертификат с паролем и указать пароль в кавычках - то тогда все работает PFXImportCertStore(blob,"12345",0) то есть не ругается что пароль не верен, но тем не менее сертификат в личных не появляется. почему PFXImportCertStore не хочет кушать "" если сертификат изначально без пароля - не понимаю :) ну это я еще поищу как можно определить тип переменной чтобы и константа и string могли быть скормлены этой функции для своего языка программирования. в крайнем случае можно сделать два варианта одной и той-же функции в теле программы. система виндовс xp sp3, используется только одна учетная запись - администраторская. чего мне не хватает для регистрации сертификата четко в "Личные\Реестр"? кроме мозгов... мозгов то точно не хватает...
|