Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Facturas electrónicas [España] (https://www.clubdelphi.com/foros/showthread.php?t=89295)

Noe277 18-08-2026 07:54:19

Cita:

Empezado por sglorka (Mensaje 572544)
Gracias por la respuesta

¿ Estás en el mismo escenario que yo ?. .Net, Microsoft.Web.Services3.Security y certificado registrado en integradores en https://integradores.face.gob.es/ ( no está registrado en https://proveedores.face.gob.es/ porque me dice que ya es integrador )

Saludos

C# y no estoy haciendo lo mismo pero si que en su momento tenia xml de facturae que por caracteres el fichero se codificaba como ANSI o lo del BOM "No me acuerdo si tiene que ser utf8 con o sin BOM" y firmabas el archivo y la firma no era valida.


Por otro lado hace tiempo vi que habían publicado Wsdl nuevos y tu estas usando los retrocompatibles igual los nuevos están funcionando ya.

Noe277 18-08-2026 09:15:12

Cita:

Empezado por Noe277 (Mensaje 572546)
C# y no estoy haciendo lo mismo pero si que en su momento tenia xml de facturae que por caracteres el fichero se codificaba como ANSI o lo del BOM "No me acuerdo si tiene que ser utf8 con o sin BOM" y firmabas el archivo y la firma no era valida.


Por otro lado hace tiempo vi que habían publicado Wsdl nuevos y tu estas usando los retrocompatibles igual los nuevos están funcionando ya.

Otra cosilla mira que estés haciendo con SHA-256 que esto también da problemas con la codificación igual estas con SHA-1 y no se si te dará problemas

sglorka 18-08-2026 12:51:09

Cita:

Empezado por Noe277 (Mensaje 572548)
Otra cosilla mira que estés haciendo con SHA-256 que esto también da problemas con la codificación igual estas con SHA-1 y no se si te dará problemas

Pues estoy con SHA-1 seguro porque WSE no trabaja con SHA-256. Lo que no sé es si ese es el problema ya que hasta la semana pasada sí funcionaba. ¿ Podrían haber actualizado algo en Face ?, pregunta del millón

Noe277 18-08-2026 13:59:12

Cita:

Empezado por sglorka (Mensaje 572549)
Pues estoy con SHA-1 seguro porque WSE no trabaja con SHA-256. Lo que no sé es si ese es el problema ya que hasta la semana pasada sí funcionaba. ¿ Podrían haber actualizado algo en Face ?, pregunta del millón

Hace unos meses actualizaron todos los manuales.
En los manuales pone SHA-256 el SHA-1 esta obsoleto y además están pidiendo el tls mas moderno.

yo uso estos pero si usas un .net viejo no podrás. el WSE 3 es muy viejo

using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel.Security;
using System.ServiceModel;
using System.ServiceModel.Channels;

sglorka 18-08-2026 14:41:03

Cita:

Empezado por Noe277 (Mensaje 572550)
Hace unos meses actualizaron todos los manuales.
En los manuales pone SHA-256 el SHA-1 esta obsoleto y además están pidiendo el tls mas moderno.

yo uso estos pero si usas un .net viejo no podrás. el WSE 3 es muy viejo

using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel.Security;
using System.ServiceModel;
using System.ServiceModel.Channels;

Perfecto, ¿Usas "Agregar referencia web" o "Agregar referencia de servicio"? contra https://webservice.face.gob.es/facturasspp?wsdl
¿La clase cliente hereda de ClientBase<T> o de SoapHttpClientProtocol?
Te agradecería que me aclarases esta información

Gracias de antemano
Saludos

Noe277 18-08-2026 15:02:39

Cita:

Empezado por sglorka (Mensaje 572551)
Perfecto, ¿Usas "Agregar referencia web" o "Agregar referencia de servicio"? contra https://webservice.face.gob.es/facturasspp?wsdl
¿La clase cliente hereda de ClientBase<T> o de SoapHttpClientProtocol?
Te agradecería que me aclarases esta información

Gracias de antemano
Saludos


Agregar referencia de servicio. y haber yo a facturae como tal no probé, intente ir a obtener los DIR3 pero me daba error 400. No se si pille cuando estaban cambiando toda la movida, hice muchas pruebas y lo deje. Te dejo un código haber si sacas algo de esto. Lo del toquen nunca había hecho así que no se si estará bien.


Cita:

private readonly string _url = "https://ws.face.gob.es/organismos/v1/directorio";

public async Task<ConsultarUnidadesResponse> ObtenerDirectorioAsync()
{
// 1. Configuración de Seguridad de Red
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
// System.Net.ServicePointManager.Expect100Continue = false;

// 2. Obtener Certificado
X509Certificate2 certificado = null;
try
{
// NOTA: BDCertificados debe devolver el cert cargado con X509KeyStorageFlags.MachineKeySet
(certificado, _) = BDCertificados.ObtenerCertificado("persona");
if (certificado == null) throw new Exception("Certificado no encontrado.");
}
catch (Exception ex) { throw new Exception("Error al cargar certificado: " + ex.Message); }

// 3. Configuración del Binding
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
// binding.MaxReceivedMessageSize = 2147483647;
// binding.AllowCookies = true;

var endpoint = new EndpointAddress(_url);

using (var client = new organismosv1directorioPortClient(binding, endpoint))
{
client.ClientCredentials.ClientCertificate.Certificate = certificado;

// 4. Generar el Token JWT firmado
string tokenJwt = GenerarTokenJWT(certificado);

// 5. Ámbito de la operación para inyectar la cabecera
using (new OperationContextScope(client.InnerChannel))
{
var property = new HttpRequestMessageProperty();
// El "Bearer" es lo que exige el API v2.0.0
property.Headers["Authorization"] = "Bearer " + tokenJwt;
property.Headers["Content-Type"] = "text/xml; charset=utf-8";

OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = property;

try
{
// 6. Request Mínimo (Evitar enviar campos vacíos que causan error 400)
var request = new ConsultarUnidadesRequest
{
codigo = "L01234567",
estado = "V", // Solo vigentes
nombre = "",
identificador = "",
padre = "",
administracion = ""
};


return await client.consultarUnidadesAsync(request);
}
catch (Exception ex)
{
string msg = ex.InnerException != null ? ex.InnerException.Message : ex.Message;
throw new Exception("Error 400 en FACe: " + msg);
}
}
}
}

// --- GENERADOR DE TOKEN JWT (Basado en Manual FACe pág. 86) ---
private string GenerarTokenJWT(X509Certificate2 cert)
{
// Header: RS256 + Certificado en x5c
string certBase64 = Convert.ToBase64String(cert.RawData);
string headerJson = "{\"alg\":\"RS256\",\"typ\":\"JWT\",\"x5c\":[\"" + certBase64 + "\"]}";

// Payload: exp y iat (sin decimales)
long iat = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
long exp = iat + 7200;
string payloadJson = "{\"exp\":" + exp + ",\"iat\":" + iat + "}";

// Codificación Base64Url
string headerEnc = Base64UrlEncode(Encoding.UTF8.GetBytes(headerJson));
string payloadEnc = Base64UrlEncode(Encoding.UTF8.GetBytes(payloadJson));
string dataToSign = headerEnc + "." + payloadEnc;

// Firma con SHA256 (Compatible con .NET 4.8 y claves CNG/CAPI)
byte[] signatureBytes;
using (RSA rsa = cert.GetRSAPrivateKey())
{
if (rsa == null) throw new Exception("El certificado no tiene clave privada RSA accesible.");
signatureBytes = rsa.SignData(Encoding.UTF8.GetBytes(dataToSign), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}

return dataToSign + "." + Base64UrlEncode(signatureBytes);
}

private string Base64UrlEncode(byte[] input)
{
return Convert.ToBase64String(input)
.Replace("+", "-")
.Replace("/", "_")
.Replace("=", "");
}

sglorka 18-08-2026 16:38:20

Gracias Noe277
No doy con la tecla... seguiré investigando

sglorka 20-08-2026 12:35:59

Ya se ha arreglado la entrada de facturas a Face a través de los endpoints https://webservice.face.gob.es/facturasspp y https://webservice.face.gob.es/facturasspp2. Parece que tenían un problema técnico y no habían dicho nada .... hoy ha empezado a funcionar bien.

Se confirma que WSE Microsoft.Web.Services3 sigue funcionando correctamente para firmar el soap mediante SHA-1
Pongo esta infomación por si le interesa a alguien
Saludos

jlmoli_67 25-08-2026 10:27:54

Cita:

Empezado por unomasmas (Mensaje 572260)
OK. Gracias; es un avance; pasamos, entonces, del servidor de pruebas porque parece que lo tienen abandonado ¿Nos das más pistas sobre qué error te muestra al intentar conectarte al webservice? Por ver si podemos concretar la razón de que no te vaya..

Buenas,
sigue sin poder alguien añadir un certificado en el portal de pruebas para integradores? https://se-integradores-face.redsara...-privada/login

segun la ia al recibir esta respuesta cuando envio una factura a face es que la validacion a nivel de firmas y estructura esta ok pero el pem no esta dado de alta en la seccion de certificados y no hay cojones de avanzar. El pem que no me deja en pruebas si me deja en produccion asi que estoy perdidito y a semejanza de otros usuarios de este foro he puesto 2 tickets a soporte y lo que dan de informacion no tiene ni que ver con lo que se les pregunta. Un desastre de soporte, vaya.

<SOAP-ENV:Fault>
<faultcode>401</faultcode>
<faultstring>No existe ning&#xFA;n usuario asociado al certificado que firma la petici&#xF3;n</faultstring>
</SOAP-ENV:Fault>

sglorka 27-08-2026 12:49:48

El entorno de pruebas no permite dar de alta certificados, el asistente se queda parado en la pantalla de adjuntar certificado. No sé si es un problema de software de ellos o es que no quieren que lo hagamos. Yo estoy escapando enviando la factura a producción con una referencia ya enviada para que por lo menos avise que ya existe y así poder validar el envío y la estructura

jlmoli_67 27-08-2026 13:25:53

Buenas,
gracias por tu respuesta como siempre.

Ese es exactamente mi problema. Lo fuerte de este asunto es que les pones un ticket y responden a su bola y en el ultimo que les he puesto hace una semana (llevo 3 tickets ya) ni me contestan. Si no quieren que lo usemos pues que lo digan y no pierdo una semana con los dichosos certificados pero como no dicen ná de ná.......

Mucha gracias


La franja horaria es GMT +2. Ahora son las 20:23:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi