Foros de consultas y discusión

Asserts SSO en librerías SAML2

Mathías De León, modificado hace 6 años.

Asserts SSO en librerías SAML2

Youngling Mensajes: 4 Fecha de incorporación: 26/05/17 Mensajes recientes
Estimados, estoy intentando utilizar el servicio para el login del proyecto de Tecnólogo.
A partir del .pfx provisto genero la private key ingresando la contraseña con el comando:
openssl pkcs12 -in ANCCA - Prueba EMPRESA.pfx -nocerts -out key.pem -nodes
y exporto el certificado con:
openssl pkcs12 -in ANCCA - Prueba EMPRESA.pfx -nokeys -out cert.pem

Como ya han mencionado en otros hilos del foro he usado la librería saml2-js pasando los siguientes parámetros:
var sp_options = {
  entity_id: "https://tecnologo.edu.uy/",
  private_key: fs.readFileSync("[b]key.pem[/b]").toString(),
  certificate: fs.readFileSync("[b]cert.pem[/b]").toString(),
  assert_endpoint: "https://tecnologo.edu.uy/acs"
};
var sp = new saml2.ServiceProvider(sp_options);

// Create identity provider
var idp_options = {
  sso_login_url: "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SSO",
  sso_logout_url: "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SLO",
  certificates: [fs.readFileSync("[b]cert.pem"[/b]).toString(), fs.readFileSync("[b]cert.pem[/b]").toString()]
};

Obtenemos la siguiente respuesta (Operation failed - The request does not meet security requirements.N/A)

<AuthnRequest xmlns="urn:oasis:names:tc:SAML:2.0:protocol"
              xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
              Version="2.0"
              ID="_5d4e260ccbfab70644723e0d35d7b605eb9bdd3ff6"
              IssueInstant="2017-05-31T14:47:10.426Z"
              Destination="https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SSO"
              AssertionConsumerServiceURL="https://tecnologo.edu.uy/acs"
              ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
              >
    <saml:Issuer>https://tecnologo.edu.uy/</saml:Issuer>
    <NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
                  AllowCreate="true"
                  />
</AuthnRequest>

También he intentado enviar el Agesic-Coesys-Testing.cer que nos dio Montse en vez del .pem generado y varias combinaciones de .crt, .cer, .pem obteniendo siempre el mismo error.

<AuthnRequest xmlns="urn:oasis:names:tc:SAML:2.0:protocol"
              xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
              Version="2.0"
              ID="_f975f153f90a2633dd7cc0ed3232bd28ab85c8e597"
              IssueInstant="2017-05-31T14:48:53.427Z"
              Destination="https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SSO"
              AssertionConsumerServiceURL="https://tecnologo.edu.uy/acs"
              ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
              >
    <saml:Issuer>https://tecnologo.edu.uy/</saml:Issuer>
    <NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
                  AllowCreate="true"
                  />
</AuthnRequest>

Podrían indicarme que puedo estar haciendo mal o cual es el procedimiento adecuando para la conversión de los certificados?,

Desde ya muchas gracias.
Saludos.
thumbnail
Francisco Perdomo, modificado hace 6 años.

RE: Asserts SSO en librerías SAML2

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Buenas, aparentemente el problema está en la firma que no la estarías pasando bien,

El log dice lo siguiente:
​​​​​​​11:47:01.978 [http-apr-8080-exec-20] [EGOV-SESSION-ID:144197CD29ABBCBEB183E818FD3E0EEE] ERROR org.opensaml.saml2.binding.security.SAML2AuthnRequestsSignedRule -
SPSSODescriptor for entity ID 'https://tecnologo.edu.uy/' indicates AuthnRequests must be signed, but inbound message was not signed
11:47:01.978 [http-apr-8080-exec-20] [EGOV-SESSION-ID:144197CD29ABBCBEB183E818FD3E0EEE] WARN  edu.internet2.middleware.shibboleth.idp.profile.saml2.SSOProfileHandler - Message did not meet security requirements
org.opensaml.ws.security.SecurityPolicyException: Inbound AuthnRequest was required to be signed but was not
    at org.opensaml.saml2.binding.security.SAML2AuthnRequestsSignedRule.evaluate(SAML2AuthnRequestsSignedRule.java:89) ~[opensaml-2.5.3.jar:na]
​​​​​​​Asegúrate que se está mandando al firma junto con el request.
Chequea también que el algoritmo de encriptación que usa es SHA256 y no SHA1, porque podría darse que te ignora la firma porque usa otro algoritmo.

Cualquier otra consulta sigue preguntando que estoy a las órdenes!
Mathías De León, modificado hace 6 años.

RE: Asserts SSO en librerías SAML2

Youngling Mensajes: 4 Fecha de incorporación: 26/05/17 Mensajes recientes
Hola Francisco, desde ya gracias por tu pronta respuesta. Realmente estoy bastante entreverado con la generación de estos archivos que se envían.

Nosotros contamos con un .idp-mateadata1.1.xml el cual lo seteo en la librería en:
[b]// Endpoint to retrieve metadata[/b]
app.get("[color=#ff8c00][b]idp-metadav1.1.xml[/b][/color]", function(req, res) {
  res.type('application/xml');
  res.send(sp.create_metadata());
});
​​​​​​​Por otro lado tenemos un .pfx (Con una contraseña para firmar) y un .cer 

a ese .pfx le hecho:
openssl pkcs12 -in certname.pfx -nocerts -out key.pem -nodes
para generar la private_key que envío (key.pem) - Ingresando la contraseña brindada

y luego:
openssl pkcs12 -in certname.pfx -nokeys -out cert.pem
para obtener el certificado cert.pem que envío.

a su vez como indico en el hilo inicial,  he enviado:
​​​​​​​var idp_options = {
  sso_login_url: "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SSO",
  sso_logout_url: "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SLO",
  certificates: [fs.readFileSync([color=#ff0000][b]"cert.crt")[/b].[/color]toString(), fs.readFileSync[color=#ff0000][b]("cert.crt"[/b][/color]).toString()]
};
​​​​​​​los certificados... tanto el crt creado anteriormente como el .cer que nos brindaron.

He intentado varias cosas, creo que esta es la correta, por lo que cuando me dices que no estoy firmando bien no comprendo en que paso debo hacerlo y cuales serían los comandos correspondientes.
​​​​​​​
Lo último que intenté fue:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
para generar un certificado autofirmado en SHA256 utilizando en vez de privateKey.key la key.pem generada anteriormente. Este proceso me pide determinada información cómo el código del País, ciudad, mail.. etc.. 
Creo que este paso es incorrecto pero no sé que más intentar.

Te agradezco desde ya cualquier guía que puedas brindarme.
​​​​​​​Saludos,
thumbnail
Francisco Perdomo, modificado hace 6 años.

RE: Asserts SSO en librerías SAML2

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Te animas a capturar el tráfico y pasarme el sigAlg y signtature?
Con esos parámetros se puede ver si se envió o no la firma (este es el chequeo que me parece pertinente hacer)
Si no se está enviando fíjate que los certificados estén en la carpeta correcta.

El camino que tomaste al principio era el correcto, porque tienes que usar EMPRESA.pfx

Saludos
Mathías De León, modificado hace 6 años.

RE: Asserts SSO en librerías SAML2

Youngling Mensajes: 4 Fecha de incorporación: 26/05/17 Mensajes recientes
Efectivamente no está enviando ni el SigAlg ni la signature, la ruta a los certificados está bien pero sólo envía el parámetro SAMLRequest:

[b]SAMLRequest[/b]: fZJRb9sgFIX/isW7jfGa2EOOq6zRtEjdGsVZH/oyYbhOkTB4XMjWfz+SrlJe2tejc8/HOaK9/TuZ7AQetbMrwoqS3HbtOoZnu4ffETBkyWBxRaK33AnUyK2YAHmQvF9/v+dVUfLZu+CkM+TVzFFM5uMLgQg+JCbJHt/gSSfZdrMiv+rFYjFAM1RMfKqhEhLE56ZWcmhG2aihuakrVteyqsZ0gBhhazEIG1JGyeq8XOYlO7CasyVflAVb3jyRbJO6aCvCBfUcwoyc0pDEHLQqZueDMMUxDkV8oSdWMKrVTFOxURug53dXdA9Ke5CB9v0DydZvFe6cxTiB78GftISf+/trgLTOuKMrQMVztJBIst3/vb5oq7Q9fjzV8GpC/u1w2OW7h/5Auva8ML9U9927rJZe29ofKXq72Tmj5Uv21flJhPfJaYGLolU+Xqw8WpxB6lGDSuWNcX/uPIgAKxJ8BEK7ll7/m+4f
He intentado todas las combinaciones posibles para armar el assert en los campos de la librería:

var sp_options = {
  entity_id: "https://tecnologo.edu.uy/",
  private_key: fs.readFileSync([b]"key.pem"[/b]).toString(),
  certificate: fs.readFileSync([b]"cert.pem"[/b]).toString(),
  assert_endpoint: "https://tecnologo.edu.uy/acs"
};
var sp = new saml2.ServiceProvider(sp_options);

// Create identity provider
var idp_options = {
  sso_login_url: "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SSO",
  sso_logout_url: "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SLO",
  certificates: [fs.readFileSync("[b]Agesic-Coesys-Testing.cer"[/b]).toString(), fs.readFileSync("[b]Agesic-Coesys-Testing.cer"[/b]).toString()]
};

key.pem
certificate.crt
cert.pem
ANCCA - Prueba EMPRESA.pfx
​​​​​​​Agesic-Coesys-Testing.cer
thumbnail
Francisco Perdomo, modificado hace 6 años.

RE: Asserts SSO en librerías SAML2

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
No soy experto en estas librerías porque he trabajado más que nada en OpenSAML pero mirando por arriba creo que te faltan asignaciones, por ejemplo: sign_get_request
Te recomiendo volver a mirar la documentación que es posible que haya alguna más que falte.

Fuerza que en un par de ajustes te sale el request!