Hola colegas,
Necesito acceder al almacén de certificados de Windows y seleccionar un certificado de entre los existentes.
¿Es posible hacer esto desde nuestro entorno de programación via [X]Harbour/FW?
Se que desde Java se puede pero desconozco el código necesario para conseguirlo.
Si alguien puede ofrecer una rutina desde este u otro lenguaje de programación sería estupendo.
Gracias
Acceso al almacen de certificados de Windows
- José Vicente Beltrán
- Posts: 279
- Joined: Mon Oct 10, 2005 8:55 am
- Location: Algeciras, España
- Contact:
Re: Acceso al almacen de certificados de Windows
Puedes ver este artículo a ver si nos da luz en el tema
http://www.sysadmit.com/2017/10/windows ... cados.html
http://www.sysadmit.com/2017/10/windows ... cados.html
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
- José Vicente Beltrán
- Posts: 279
- Joined: Mon Oct 10, 2005 8:55 am
- Location: Algeciras, España
- Contact:
Re: Acceso al almacen de certificados de Windows
Cristobal,
de nuevo gracias por tu información, valiosa como siempre, desde aquí: ya se puede seleccionar el certificado jugando con la huella digital y el alias del certificado, un pasito mas.... y ya podremos usarlo para firmar. Investigaré en esta dirección y si consigo armar una pequeña utilidad la pondré aquí por si le interesa a alguien mas.
de nuevo gracias por tu información, valiosa como siempre, desde aquí:
Code: Select all
%APPDATA%\Microsoft\SystemCertificates\My\Certificates
-
- Posts: 16
- Joined: Tue Oct 06, 2015 7:06 am
Re: Acceso al almacen de certificados de Windows
Buenas, por si te sirve ayuda, te paso un código que muestra el diálogo de selección de certificados de Windows y te devuelve el seleccionado:
Un saludo.
Code: Select all
#include "fivewin.ch"
func main()
MsgInfo("Seleccionado certificado: "+ToTxt(SELCERT()), "CryptoApi")
return nil
//*****************************************************************************
//*****************************************************************************
function ToTxt( uVal )
local cType := ValType( uVal )
do case
case cType == "C" .or. cType == "M"
return uVal
case cType == "D"
return DToC( uVal )
case cType == "L"
return If( uVal, ".T.", ".F." )
case cType == "N"
return AllTrim( Str( uVal ) )
case cType == "B"
return "{|| ... }"
case cType == "A"
return "{ ... }"
case cType == "O"
return If( __ObjHasData( uVal, "cClassName" ), uVal:cClassName, uVal:ClassName() )
case cType == "H"
return "{=>}"
otherwise
return ""
endcase
return nil
//*****************************************************************************
//*****************************************************************************
#pragma BEGINDUMP
#include <windows.h>
//#include <psapi.h>
//#include <hbapi.h>
//#include <hbapierr.h>
//#include <hbapiitm.h>
//#include <wincrypt.h>
#define CRYPTUI_SELECT_LOCATION_COLUMN 0x000000010
//Definir el prototipo de las funciones:
typedef HCERTSTORE (WINAPI * PTYPECERTOPEN) (HCRYPTPROV, LPTSTR);
typedef PCCERT_CONTEXT (WINAPI * PTYPECERTSELECTDLG) (HCERTSTORE, HWND, LPCWSTR, LPCWSTR, DWORD, DWORD, void*);
typedef PCCERT_CONTEXT (WINAPI * PTYPECERTENUM) (HCERTSTORE, PCCERT_CONTEXT);
typedef DWORD (WINAPI * PTYPECERTGETNAME) (PCCERT_CONTEXT, DWORD, DWORD, VOID*, LPTSTR, DWORD);
typedef DWORD (WINAPI * PTYPECERTNAMETOSTR) (DWORD, PCERT_NAME_BLOB, DWORD, LPTSTR, DWORD);
typedef BOOL (WINAPI * PTYPECERTFREECC) (PCCERT_CONTEXT);
typedef BOOL (WINAPI * PTYPECERTCLOSESTORE) (HCERTSTORE, DWORD);
HB_FUNC(SELCERT)
{
// Hay varios ejemplos en: https://msdn.microsoft.com/en-us/library/windows/desktop/aa382361(v=vs.85).aspx
HCERTSTORE hStore;
PCCERT_CONTEXT PrevContext, CurContext;
PCHAR sNombre;
DWORD cbSize;
PHB_ITEM pArray;
PHB_ITEM pItem;
PCCERT_CONTEXT pCertContext;
// Cargamos las librerías de las que queremos la dirección de las funciones.
HMODULE HCrypt = LoadLibrary("Crypt32.dll");
HMODULE HCrypt2 = LoadLibrary("Cryptui.dll");
// Declaramos el tipo de puntero a la función, tenemos la definición arriba.
PTYPECERTOPEN pCertOpen;
PTYPECERTSELECTDLG pCertSelectDlg;
PTYPECERTGETNAME pCertGetName;
PTYPECERTNAMETOSTR pCertNameToStr;
PTYPECERTFREECC pCertFreeCC;
PTYPECERTCLOSESTORE pCertCloseStore;
if (HCrypt != NULL && HCrypt2 != NULL){
//Sacamos el puntero todas las funciones que vamos a usar mediante GetProcAddress:
#ifdef UNICODE
pCertOpen = (PTYPECERTOPEN) GetProcAddress(HCrypt, "CertOpenSystemStoreW");
pCertGetName = (PTYPECERTGETNAME) GetProcAddress(HCrypt, "CertGetNameStringW");
#else
pCertOpen = (PTYPECERTOPEN) GetProcAddress(HCrypt, "CertOpenSystemStoreA");
pCertGetName = (PTYPECERTGETNAME) GetProcAddress(HCrypt, "CertGetNameStringA");
#endif
pCertSelectDlg = (PTYPECERTSELECTDLG) GetProcAddress(HCrypt2, "CryptUIDlgSelectCertificateFromStore");
pCertFreeCC = (PTYPECERTFREECC) GetProcAddress(HCrypt, "CertFreeCertificateContext");
pCertCloseStore = (PTYPECERTCLOSESTORE) GetProcAddress(HCrypt, "CertCloseStore");
}
if (pCertOpen){
// Llamada a CertOpenSystemStore:
hStore = pCertOpen(NULL, TEXT("MY"));
}
if (hStore){
// Diálogo de selección de certificado:
pCertContext = pCertSelectDlg(hStore, NULL, NULL, NULL, CRYPTUI_SELECT_LOCATION_COLUMN, 0, NULL);
if (pCertContext){
cbSize = pCertGetName(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0);
if (cbSize>0) {
//Reservamos la memoria que necesitamos para el texto que recibiremos
sNombre = (LPTSTR)malloc(cbSize * sizeof(TCHAR));
pCertGetName(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, sNombre, cbSize);
// Llamada a CertFreeCertificateContext:
pCertFreeCC(pCertContext);
}
}
// Cerrar el almacen de certificados:
// Llamada a CertCloseStore:
pCertCloseStore(hStore, 0);
}
FreeLibrary(HCrypt);
FreeLibrary(HCrypt2);
hb_retc(sNombre);
}
#pragma ENDDUMP
- José Vicente Beltrán
- Posts: 279
- Joined: Mon Oct 10, 2005 8:55 am
- Location: Algeciras, España
- Contact:
Re: Acceso al almacen de certificados de Windows
Muchisimas gracias Dario, esto me va a ahorrar mucho trabajo, funciona perfecto.
- AngelSalom
- Posts: 664
- Joined: Fri Oct 07, 2005 7:38 am
- Location: Vinaros (Castellón ) - España
- Contact:
Re: Acceso al almacen de certificados de Windows
Interesante!
Angel Salom
http://www.visionwin.com
---------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.0
http://www.visionwin.com
---------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.0