Ver Mensaje Individual
  #2  
Antiguo 14-11-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 599
Reputación: 1
bmfranky Va por buen camino
Cita:
Empezado por austral_es Ver Mensaje
Estamos intentando usar un certificado instalado en el almacén de windows para realizar la remisión a VeriFactu.
Para esto usamos el evento HTTPWebNode.OnNeedClientCertificate(const Sender: TObject; const ARequest: TURLRequest; const ACertificateList: TCertificateList var AnIndex: Integer);
En este evento nos llega una lista de certificados válidos para el server de la AEAT y escogemos uno de ellos.
Ahora bien, queremos que el proceso sea automático y en caso de que el certificado use una Passowrd nos salta la pantalla de Windows pidiendo la contraseña del certificado. Queríamos evitar esto.

Se nos ocurren dos opciones:

1) Poder asignar por código la Password directamente al certificado escogido en el OnNeedCertificate pero solo podemos asignar el parámetro de salida AnIndex.

2) Sabemos que existe una forma de asignar las password de la siguiente forma:



Pero esto implica tener el certificado en un Stream o un fichero y eso es lo que queremos evitar, queremos que sea uno de los válidos que nos entrega la AEAT en el OnNeedClientCertificate.
Quizás hay alguna forma de exportar desde el Almacén de certificados de Windows hacia un Stream y así asignarlo directamente al HTTPWebNode.ClientCertificate.Stream y después la Password.


¿Alguien de aquí escoge el certificado desde el almacén o todos lo cargais desde un fichero?
Hola, yo lo cojo desde windows, pero por comodidad lo guardo en la base de datos, en mi configuracion, con otro password independiente deloriginal del certificado, en c# lo hgo asi.
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)
Responder Con Cita