![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
Código:
public static X509Certificate2 ElegirCertificado()// aqui se habre el selector de certificados del sistema.
{
try
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Selección de Certificados", "Seleccione un certificado de la lista para firmar la factura electrónica", X509SelectionFlag.SingleSelection);
X509Certificate2Enumerator Certificado = scollection.GetEnumerator();
X509Certificate2 cert = new X509Certificate2();
if (scollection.Count > 0)
{
X509Certificate2Enumerator en = scollection.GetEnumerator();
en.MoveNext();
cert = en.Current;
if (DateTime.Now > cert.NotAfter)
{
throw new Exception("Certificado caducado");
}
else
{
return cert;
}
}
if (fcollection.Count == 0)
{
MessageBox.Show("No hay certificados electrónicos instalados en tu equipo");
}
else
{
if (scollection.Count == 0)
{
MessageBox.Show("No has seleccionado ningún certificado");
}
}
store.Close();
var temp = scollection.OfType<X509Certificate2>();
var cert1 = scollection.OfType<X509Certificate2>().Where(x => x.Subject == "CN=FNMT-RCM").First();
return cert;
}
catch (Exception ex)
{
// throw ex;
}
//X509Store store = new X509Store(StoreLocation.CurrentUser);
//store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
//X509Certificate2Collection certificates = store.Certificates;
//X509Certificate2Collection foundCertificates = certificates.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
//var cert = foundCertificates.OfType<X509Certificate>().Where(x => x.Subject == "CN="+Program.configTaller.NombreTaller).First();
return null;
}
//aqui lo exporto en forma de bytes[] con un password propio
var certificado = ConfigDB.ElegirCertificado();//
if(null != certificado)
{
string caducidad = certificado.GetExpirationDateString();
Program.certificado = certificado.Export(X509ContentType.Cert, Program.passcertificado);
txtCaducidad.Text = caducidad;
ConfigDB.ActualizarCertificado(1, Program.certificado, caducidad);
}
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
|
#2
|
|||
|
|||
|
Yo con el tema de certificados, lo que hago es cargarlos desde el almacen de certificados sobre una lista que luego asigno a los items de un combobox para poder seleccionar el certificado que usaré en el envio:
para cargar los certificados en un combo (cmbCertificados:TComboBox; //en el form )
y cuando se selecciona un certificado del combo se deja en una variable infoCertificado:string; el contenido del combo, el elemento seleccionado y es en el evento OnbeforePost del componente HTTPRIO donde asigno el certificado a partir de ese infocertificado. Esto plantea un problema en delphi10 y en delphi11 porque la declaracion de tipos es distinta y en delphi11 se accede directamente para asignar los datos del certificado: no asigno la password, cojo el certificado directamente del almacen; no sé si al usarlo desde alli necesito informar la password. Pero a mi me funciona ah, se necesita usar la libreria CAPICOM_TLB y tambien System.Net.HttpClient, System.Net.HttpClientComponent, Soap.Rio, Soap.SOAPHTTPClient, Soap.SOAPHTTPTrans, soap.win.certhelper puede que haya alguna de más, pero yo las tengo todas ellas puestas |
|
#3
|
|||
|
|||
|
añado. he nombrado a unit DMEnvioLAF, es un tdatamodule propio donde he declarado la funcion carga certificados
|
|
#4
|
|||
|
|||
|
snif!
![]() me he olfidado una funcion importante que es la que carga infocertificado, pues no lo hace directamente, ya que los valores hexadecimales me aparecen cruzados. Para cargar infocertificado cuando el usuario elige un certificado del combo utilizo esto:
lamento la omisión |
|
#5
|
|||
|
|||
|
me vais a matar, hace falta la funcion para obtener el numero de serie del certificado
ahora ya creo que esta todo. SI echarais algo en falta me lo decis. Esto me ha funcionado en Delphi Berlin y en Delphi Alexandria |
|
#6
|
|||
|
|||
|
Muchísimas gracias javipes y bmfranky!!
En el caso de javipes sino te pide la contraseña ¿puede ser porque tu certificado no la requiera? nuestros certificados sí la requieren (estamos usando unos propios y otros como el DNIe) y en los dos casos nos salta la ventana de windows pidiendo la contraseña, y esto era lo que queríamos evitar cargando el certificado desde el almacén y asignandole pal password. De todas formas estamos estudiando los dos códigos, a ver si podemos tener algo en claro para nuestro caso. |
|
#7
|
||||
|
||||
|
Cita:
Solo volveria a pedir la clave, al actualizar el certificado, una vez caducado.
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Validar Password de un certificado | adebonis | Varios | 0 | 28-03-2015 11:18:36 |
| listar almacen de certificados de Windows | JordiP | Varios | 1 | 26-08-2010 10:52:10 |
| Como empiezo un sistema de almacen | espalafox | Varios | 18 | 07-04-2007 01:01:39 |
|