# xmlhttprequest autenticacion por certificado

**URL:** <https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358>\
**Category:** Velneo\
**Created:** [26 Febrero, 2017 04:32 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358 "2017-02-26T04:32:26Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [26 Febrero, 2017 04:32 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/1 "2017-02-26T04:32:26Z")

</div>

Buen día a todos,

He estado probando el utilizar webservices que requieren autenticación mediante certificados digitales, como en el caso de la AEAT para el suministro de información inmediata.

Sin embargo no encuentro la manera de hacerlo con la implementación actual de XMLHTTPREQUEST, si, ya sé que se puede mediante curl (hay un ejemplo funcional en el foro), pero me interesa hacerlo mediante dicha clase.

Revisando en distintos foros nadie encuentra la manera de hacerlo desde aplicaciones de escritorio, siempre desde navegador y registrando el correspondiente certificado en su correspondiente almacén.

Pero resulta que me encontré la siguiente página, en donde hacen una implementación de un método que resuelve dicho problema. [https://wakanda.github.io/wakanda-api-reference/docs/interfaces/xmlhttprequest.html#setclientcertificate](https://wakanda.github.io/wakanda-api-reference/docs/interfaces/xmlhttprequest.html#setclientcertificate) Anexo tambien imagen del método.

Mi pregunta es, ¿será posible que en la siguiente versión de V7 se implemente algo parecido?, toda vez que aparentemente existe una tendencia a autenticarse a consumo de WebServices mediante esta técnica y la verdad estoy encantado con el uso de XMLHTTPREQUEST actualmente.

O si alquien conoce alguna manera de hacerlo y me pudiera orientar al respecto.

Gracias por sus comentarios.

Anton.

---

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [26 Febrero, 2017 04:34 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/2 "2017-02-26T04:34:17Z")

</div>

Va la imagen, que no subio en el primer post.

 ![image](https://canada1.discourse-cdn.com/flex035/uploads/velneo/original/2X/d/d4a008912a1ee3ec927630babdf0080fcbab0bd5.jpg)

---

<div class="post-metadata">

**Author:** ![innovadb](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/innovadb/32/5643_2.png) [@innovadb](https://foros.velneo.com/u/innovadb)\
**Post date:** [27 Febrero, 2017 20:11 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/3 "2017-02-27T20:11:35Z")

</div>

Hola Anton

Yo me encontré el mismo problema y después de tres días no fui capaz de solucionarlo desde v7.

Al final la mejor opción que encontré fue hacer la conexión y el envío con python y dejar en un fichero de texto todos los datos necesarios para recogerlos desde v7.

Un saludo

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [28 Febrero, 2017 14:04 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/4 "2017-02-28T14:04:51Z")

</div>

Yo tampoco lo he conseguido para https autofirmado, la respuesta de soporte fue que no se soporta y no parece que se vaya a soportar.

Tuve que usar curl finalmente.

---

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [28 Febrero, 2017 18:17 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/5 "2017-02-28T18:17:38Z")

</div>

Gracias innovadb e Infortic, una pena que no implementen esa funcionalidad en futuras versiones (en caso que no lo hayan planeado), toda vez que existen otras implementaciones de dicha clase que si lo hacen, tales como la mencionada de WAKANDA, el WinHttpRequest, y tantas otras en Java.

Desconozco qué tan fácil o difícil resulte ser eso, pero de que hace falta, hace falta.

Solo aclarar, la clase actual del API de velneo SI puede trabajar con sitios https (yo lo hago sin ningún problema), siempre y cuando o no soliciten contraseña o la manejen “normal”, enviando un nombre de usuario y clave o generando un token de algún modo, solo no se puede usar cuando el sitio requiere autenticación por certificado digital, como en el caso de la AEAT.

Saludos.

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [1 Marzo, 2017 08:26 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/6 "2017-03-01T08:26:32Z")

</div>

Es cierto, en mi caso era autofirmado, por lo que aparece como no seguro y no te deja

---

<div class="post-metadata">

**Author:** ![leonardo-daniel-vela](https://avatars.discourse-cdn.com/v4/letter/l/f9ae1b/32.png) [@leonardo-daniel-vela](https://foros.velneo.com/u/leonardo-daniel-vela)\
**Post date:** [7 Marzo, 2017 21:44 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/7 "2017-03-07T21:44:31Z")

</div>

Hola… olvidate de XMLHttpRequest… es una mala broma… la documentacion de risa… y el ejemplo que me mando soporte ( ejemplo externo, no me sirvio de nada ) a fin de cuentas se decidio crear una tabla con las ciudades destino de los viajes asi como sus millas (ya que no son tantas), tanto de ida como de vuelta por no siempre es el mismo camino de regreso y se ahorro el gasto de pagarla a la empresa que daba el WebService de trazado de rutas de Camiones de carga pesada…

---

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [9 Marzo, 2017 19:26 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/8 "2017-03-09T19:26:18Z")

</div>

Hola Leonardo,

No entiendo a qué te refieres con que XMLHTTPREQUEST es una mala broma, en lo particular llevo poco utilizándolo y me ha resuelto sin ningún problema la conexión a todos los webservices que he necesitado, con excepción de los que requieren autenticación por certificado digital, lo utilizo para timbrar facturas en México con múltiples PACs, y a pesar de que cada PAC se pone sus moños, pues una vez analizando sus peticiones y sus responses no me queda más que ir parseando los resultados y sin problema alguno.

Quizás no he tenido necesidades más complejas, pero pues simple, si no me funciona uso CURL o pyton o cualquier otra.

Saludos.

Anton.

---

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [3 Mayo, 2017 16:21 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/9 "2017-05-03T16:21:29Z")

</div>

¡Pues lo pusieron!

A probarlo se a dicho.

---

<div class="post-metadata">

**Author:** ![eduarchap1988](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/eduarchap1988/32/5496_2.png) [@eduarchap1988](https://foros.velneo.com/u/eduarchap1988)\
**Post date:** [3 Mayo, 2017 16:51 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/10 "2017-05-03T16:51:12Z")

</div>

Saludos Anton

En efecto yo tampoco pude lograrlo, lo solucione con PHP directamente.

Por cierto anton, para los webservice que trabajan con SOAP. como lo has resuelto?

Saludos.

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [3 Mayo, 2017 17:04 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/11 "2017-05-03T17:04:37Z")

</div>

Hola

En el body si le pones el envelope soap funciona sin problemas.

Yo he implementado ws de UPS, DHL, FEDEX, etc… con xmlhttprequest, con envelope SOAP y no ha habido problemas.

---

<div class="post-metadata">

**Author:** ![eduarchap1988](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/eduarchap1988/32/5496_2.png) [@eduarchap1988](https://foros.velneo.com/u/eduarchap1988)\
**Post date:** [3 Mayo, 2017 17:07 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/12 "2017-05-03T17:07:47Z")

</div>

Saludos infortic

Ah genial, algo asi me imaginaba pero no lo habia probado… Ahora para el tema del certificado si no hay solucion cierto?

Otra consulta, sabes que existen algunos WebServices que requieren del UpLoad de un archivo de disco (seagun sea el caso) si lo veo en PHP seria algo como

@.$RUTA\_ARCHIVO

Pero en este caso lo has hecho con el JS de V7?

Saludos.

---

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [3 Mayo, 2017 17:21 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/13 "2017-05-03T17:21:08Z")

</div>

Hola eduarchap, como comenta Infortic, en el body lo defines y va bien, me hacia falta el tema que acaban de poner, autenticación por certificado, lo de enviar archivos todavía no lo he hecho pero no tardaré en hacerlo, te comento.  
Saludos.

Anton.

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [3 Mayo, 2017 22:15 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/14 "2017-05-03T22:15:49Z")

</div>

Hola.

Si queréis comprobar la nueva función setClientCertificate() de la clase XmlHttprequest lo podéis hacer con el siguiente código que consulta el saldo de Puntos de la Dirección General de Tráfico.  
Es una petición GET pero es lo mismo para las peticiones POST.

```auto
importClass("VFile")
importClass("XMLHttpRequest")
var xhr = new XMLHttpRequest()

// Consulta de puntos en Tráfico
xhr.open("GET", "https://sedeapl.dgt.gob.es:9443/WEB_COPACI3/certificado/verSaldoPuntosCert.faces", false)
// Para los que no tengáis carnet de conducir probad con el Test del CNMC
// xhr.open("GET", "https://api.cnmc.gob.es/test/v1/echoseguro/Test de certificado", false)

// Obtenemos los strings con el Certificado y la Clave privada disponibles en formato PEM
var oFichero_Certificado = new VFile( "D:\\certificados\\certificado_solo.pem" );
var cCertificado_Solo = "";
if ( oFichero_Certificado.open( VFile.OpenModeReadOnly ) )
    cCertificado_Solo = oFichero_Certificado.readAll().toLatin1String();    
var oFichero_ClavePrivada = new VFile( "D:\\certificados\\certificado_clave_privada.pem" );
var cCertificado_ClavePrivada = "";
if ( oFichero_ClavePrivada.open( VFile.OpenModeReadOnly ) )
    cCertificado_ClavePrivada = oFichero_ClavePrivada.readAll().toLatin1String();    

// Especificamos el Certificado y la Clave privada para el acceso seguro SSL indicando la identidad del Cliente
if (cCertificado_Solo && cCertificado_ClavePrivada) {
	xhr.setClientCertificate(cCertificado_Solo, cCertificado_ClavePrivada, "password_clave_privada");
}
// Enviamos el Request
xhr.send()

if (parseInt(xhr.status) == 200) {
	alert (xhr.responseText)
}
else {
	alert ("<code>Error: " + xhr.responseText + "</code>")
}

```

En España podéis usar el certificado personal de la FNMT exportado como .pfx desde vuestra lista de certificados del explorador web.  
La conversión a PEM se realiza con la herramienta openssl (necesitamos tener instalado [OpenSSL](https://slproweb.com/products/Win32OpenSSL.html)). Ver también las opciones del [comando openssl pkcs12](https://www.openssl.org/docs/manmaster/man1/pkcs12.html).

El certificado debe dividirse en 2 ficheros:

- El certificado en sí mismo  
C:\OpenSSL-Win32\bin\openssl pkcs12 -in MiCertificado\_FNMT.pfx -out certificado\_solo.pem -clcerts -nokeys
- y la clave privada  
Debemos especificar una password para la clave privada (3º parámetro de setClientCertificate() de Velneo)  
C:\OpenSSL-Win32\bin\openssl pkcs12 -in MiCertificado\_FNMT.pfx -out certificado\_clave\_privada.pem -nocerts  
Con la opción -nodes NO hace falta la password de la clave privada  
C:\OpenSSL-Win32\bin\openssl pkcs12 -in MiCertificado\_FNMT.pfx -out certificado\_clave\_privada.pem -nocerts -nodes

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![anton](https://avatars.discourse-cdn.com/v4/letter/a/d9b06d/32.png) [@anton](https://foros.velneo.com/u/anton)\
**Post date:** [4 Mayo, 2017 02:28 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/15 "2017-05-04T02:28:36Z")

</div>

Como siempre muchas gracias Paco Satué, más sencillo no se puede.

Saludos.

Anton.

---

<div class="post-metadata">

**Author:** ![david\_ramallo](https://avatars.discourse-cdn.com/v4/letter/d/ed8c4c/32.png) [@david\_ramallo](https://foros.velneo.com/u/david_ramallo)\
**Post date:** [22 Septiembre, 2019 19:58 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/16 "2019-09-22T19:58:30Z")

</div>

Buenas a todos, estoy usando esta información para enviar una llamada con certificado. Los certificados que me proveen son un .crt, .pfx, la .key y una clave. Cuando uso postman utilizo todos, es decir pfx y crt, además de la key. En este ejemplo, @pacosatu , muestras como pasar de pfx a pem y utilizarlo. ¿Sabrías decirme si la llamada se debe usar con varios certificados a la vez? En caso de ser así, ¿alguna idea si con xhr.setClientCertificate se puede hacer?

En caso contrario, ¿se podría usar pfx o crt exclusivamente convirtiendolo en pem? No se si me puedes ayudar con esto pero me gustaría saber como gestionarlo desde velneo. Las llamadas de Postman funcionan con ambos certificados como comenté.

Un saludo a todos.

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [23 Septiembre, 2019 10:31 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/17 "2019-09-23T10:31:13Z")

</div>

Hola david\_ramallo.

Dices:

> ¿Sabrías decirme si la llamada se debe usar con varios certificados a la vez?

No entiendo el sentido de la pregunta. Las autentificaciones de cliente, que yo sepa, se hacen con un solo certificado. La función del API **xhr.setClientCertificate** no tiene más complicación que disponer del certificado de cliente, de su clave privada (ambos en formato **pem** ) y de la contraseña.

Usa la utilidad **OpenSSL** para obtener los archivos **pem** desde el certificado de Cliente que tengas en otros formatos.

Yo no uso Postman. En su lugar yo uso una Consola hecha con Velneo y el API, desde la que puedes probar todas las llamadas a los servicios Web SSL externos mediante la clase XMLHttpRequest.

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![davidramallo](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/davidramallo/32/4587_2.png) [@davidramallo](https://foros.velneo.com/u/davidramallo)\
**Post date:** [23 Septiembre, 2019 10:51 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/18 "2019-09-23T10:51:20Z")

</div>

La pregunta era debido a que el proveedor me da un certificado .crt, otro .pfx y el key. He consultado a soporte y por lo visto la función xhr.setClientCertificate si permite el uso de .crt y en este caso debería de poder usar .crt y el .key.

Muchas gracias por tu respuesta igualmente @pacosatu

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [23 Septiembre, 2019 11:25 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/19 "2019-09-23T11:25:55Z")

</div>

Hola davidramallo.

Los formatos **crt** , **key** y **pem** son equivalentes, la condición es que tengan la información del certificado en ASCII codifica en Base64 para que pueda enviarse correctamente por HTTP.

En el ejemplo que puse más arriba sustituye:  
certificado\_solo.pem por tu\_certificado.crt  
certificado\_clave\_privada.pem por tu\_clave\_certificado.key

Prueba una consulta al servicio web y nos cuentas.  
Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![aitor\_magallanes\_loz](https://avatars.discourse-cdn.com/v4/letter/a/b3f665/32.png) [@aitor\_magallanes\_loz](https://foros.velneo.com/u/aitor_magallanes_loz)\
**Post date:** [21 Julio, 2021 10:40 UTC](https://foros.velneo.com/t/xmlhttprequest-autenticacion-por-certificado/9358/20 "2021-07-21T10:40:46Z")

</div>

Buenos días a todos,

Siento echarle mas leña al fuego con este tema, pero me he encontrado con este problema y aun habiendo seguido los pasos citados por Paco para generar los PEM, a la hora de realizar la petición con dichos archivos siempre me salta un error 99, sin ningún tipo de descripción.  
Si lanzo la petición sin los certificados, se realiza correctamente pero me da error de autenticación.

He visto que los PEM tienen una información extra al comienzo, antes del texto codificado, ¿ese texto se debería mantener también o deberíamos quitarlo del fichero?

Adjunto un ejemplo del texto.

**\> Bag Attributes**  
\*\*\> localKeyID: \*\*  
**\> subject=C = ES, O = LENOVO, OU = Gailu ziurtagiria - Certificado de dispositivo, OU = , OU = PC**  
\*\*\> \*\*  
**\> issuer=C = ES, O = IZENPE S.A., OU = AZZ Ziurtagiri publikoa - Certificado publico SCA, CN = EAEko Herri Administrazioen CA - CA AAPP Vascas (2)**

> -----BEGIN CERTIFICATE-----  
> MIII9jCCBt6gAwIBAgIQPx/Z+IK7KUNg5rnyW1e3uTANBgkqhkiG9w0BAQsFADCB  
> nTELMAkGA1UEBhMCRVMxFDASBgNVBAoMC0laRU5QRSBTLkEuMTowOAYDVQQLDDFB  
> WlogWml1cnRhZ2lyaSBwdWJsaWtvYSAtIENlcnRpZmljYWRvIHB1YmxpY28gU0NB  
> MTwwOgYDVQQDDDNFQUVrbyBIZXJyaSBBZG1pb…  
> -----END CERTIFICATE-----
