Cita:
Empezado por JoseLeeTo
Buenos dias a todos.
Gracias en primer lugar por vuestra a ayuda. Pude desarrollar el envio TicketBai en su momento, gracias a este foro.
Tengo una duda al enviar. Trabajo con C# (Visual Studio 2015).
Cada vez que trato de enviar, obtengo siempre una respuesta en HTML, advirtiéndome que "el certificado no es correcto, o no se ha seleccionado correctamente" - Error 403.
He instalado el certificado en todos los navegadores que tengo, en el almacén de "Personal", pero a la hora de enviar, selecciono dicho certificado (es el mío personal de la FNMT - y es funcional dado que entro en las sedes perfectamente, he realizado la declaración con el mismo, etc...) .... pero la respuesta a través del código es un HTML (no un XML) con ese error 403.
¿Alguien ha logrado enviar sin problemas, teniendo el certificado instalado en el navegador? ¿Qué puede estar ocurriendo para que no esté validando mi certificado?
Mil gracias de antemano.
Un saludo
|
Hola te respondo por aqui y asi le puede servir a alguien mas.
En el App.config teneis que poner que usais la identificacion con certificado, asi:
Cita:
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
|
Os pongo como queda en el app config.
Código:
<client>
<endpoint address="https://www1.agenciatributaria.gob.es/wlpl/BURT-JDIT/ws/VNifV2SOAP"
binding="basicHttpBinding" bindingConfiguration="VNifV2SoapBinding"
contract="ChecaNifsActivos.VNifV2" name="VNifPort1" />
<endpoint address="https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP"
binding="basicHttpBinding" bindingConfiguration="sfVerifactu"
contract="ServicioVerifactu.sfPortTypeVerifactu" name="SistemaVerifactuPruebas" />
<endpoint address="https://prewww10.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP"
binding="basicHttpBinding" bindingConfiguration="sfVerifactu1"
contract="ServicioVerifactu.sfPortTypeVerifactu" name="SistemaVerifactuSelloPruebas" />
</client>
<bindings>
<basicHttpBinding>
<binding name="VNifV2SoapBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="VNifV2SoapBinding1" />
<binding name="sfVerifactu">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="sfVerifactu1">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="sfVerifactu2" />
<binding name="sfRequerimiento" />
</basicHttpBinding>
<customBinding>
<binding name="sfVerifactu">
<textMessageEncoding messageVersion="Soap11" writeEncoding="utf-8" />
<httpsTransport />
</binding>
</customBinding>
</bindings>
Tambien os pongo la funcion para seleccionar los certificados del sistema y luego almacenarlos en bytes[] para guardarlos en la base de datos.
Código:
public static X509Certificate2 ElegirCertificado()
{
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(); // + Program.configTaller.NombreTaller).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;
}
Esto devuelve el certificado seleccionado.
Luego simplemente lo exportamos a bytes con una contraseña por nuestra seguridad.
Código:
var certificado = ConfigDB.ElegirCertificado();// CertificadoSeleccionado();
if(null != certificado)
{
string caducidad = certificado.GetExpirationDateString();
Program.certificado = certificado.Export(X509ContentType.Cert, Program.passcertificado);<-- Este es el password que usaremos para guardar/usar el certificado.
txtCaducidad.Text = caducidad;
ConfigDB.ActualizarCertificado(1, Program.certificado, caducidad);
}