
Hola comunidad SAP,
en el contexto de un proyecto de migración de SAP CPI Neo a SAP IS Cloud Foundry (CF) Environment, estaba buscando una solución para generar una notificación para los administradores sobre el vencimiento de las claves de servicio (certificados) en SAP BTP CF por correo electrónico. Encontré algunas soluciones para certificados en el almacén de claves, pero ninguna solución para las claves de servicio, así que creé una en forma de iFlow.
Al realizar una migración de SAP CPI en Neo Environment a SAP Integration Suite en Cloud Foundry, encontrará varias diferencias entre los dos sistemas. Ya existen muchos Blogs y Guías con información detallada sobre las diferencias y mejores prácticas para Migración de Neo Environment a Multi-Cloud Foundation (Cloud Foundry y Kyma)pero me gustaría centrarme principalmente en un punto:
Para configurar conexiones HTTP entrantes para el procesamiento de flujo de integración en SAP Cloud Foundry Environment, es necesario crear una instancia de servicio y una clave de servicio para la autenticación entrante (Ayuda SAP). Según su caso de uso, puede crear tres tipos diferentes de claves de servicio:
Para obtener más información, consulte ayuda.sap
Si su caso de uso requiere Certificado externo Por ejemplo, para la autenticación entrante de SAP ERP-Systems a SAP Integration Suite, puede agregar un certificado de cliente remitente (proporcionado por el administrador del remitente) a la clave de servicio y mantener la fecha de validez (válida hasta).
Para garantizar una comunicación constante, es importante renovar los certificados antes de que caduquen.
En primer lugar, busqué la posibilidad de recuperar la información de la clave de servicio llamando al punto final de CF-API. Dependiendo de su entorno, puede encontrar el punto final de su API de Cloud Foundry en una de sus subcuentas.
Para obtener la información de la clave de servicio, es necesario usar la API cloud_controller, se puede encontrar la documentación para V3 aquí (V2 ya está en desuso).
La API de Cloud Foundry V3 está protegida mediante OAuth 2. Se espera que los clientes presenten un token de portador válido a través del encabezado HTTP, que se puede obtener del servidor UUA de Cloud Foundry o a través de CF CLI.
La única solución que funcionó en mis pruebas se basó en lo siguiente correo:
Probé diferentes versiones para obtener un token de autorización válido para CF-API, pero la solución a continuación fue la única que funcionó para mí con Postman.
SAP Integration Suite ofrece tres opciones para los materiales de seguridad de OAuth2: credenciales de cliente de OAuth2, afirmación de portador de SAML de OAuth2 y código de autorización de OAuth2. Ninguno de ellos funcionará con la contraseña grant_type. Una forma de obtener un token es crear los datos de autorización necesarios para una solicitud GET a través de groovyscript en CPI:
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import com.sap.it.api.ITApiFactory;
import com.sap.it.api.securestore.SecureStoreService;
import com.sap.it.api.securestore.UserCredential;
def Message processData(Message message) {
//get User from Configuration
def map = message.getProperties();
String user = map.get("ApiUserCredentials");
//service to get the credentials
def service = ITApiFactory.getApi(SecureStoreService.class, null);
//get user credential
def userCred = service.getUserCredential(user);
if (userCred == null){
throw new IllegalStateException("No User credential found for alias" + user);}
//HTTP Parameters value
String grant_type = "password";
String username = userCred.getUsername();
String password = new String(userCred.getPassword());
//Query
def query = "grant_type=" + grant_type + "&username=" + username + "&password=" + password;
message.setBody(query);
return message;
}
(Residencia en correo)
4. Adaptador HTTP de usuario para obtener un token
Recibirá una respuesta en el siguiente formato:
{
"access_token": "<Token>",
"token_type": "bearer",
"id_token": "<id_toke>",
"refresh_token": "<refresh_token<",
"expires_in": 1199,
"scope": "openid uaa.user cloud_controller.read password.write cloud_controller.write",
"jti": "<jti>"
}
5. Use una secuencia de comandos adicional para extraer el token del cuerpo de la respuesta y configurarlo como encabezado de autorización
import com.sap.gateway.ip.core.customdev.util.Message;
import groovy.json.*
def Message processData(Message message) {
def json = new JsonSlurper().parseText(message.getBody(String));
message.setHeader("Authorization", json.token_type + " " + json.access_token)
message.setBody()
return message;
}
Los objetos necesarios se pueden encontrar en la entidad «service_credential_bindings». Para enumerar todos los service_credential_bindings, debe usar la siguiente definición y parámetros:
OBTENER /v3/service_credential_bindings
Nombre | Tipo | Descripción |
---|---|---|
service_instance_guids | lista de cadenas | Lista delimitada por comas de GUID de instancias de servicio para filtrar |
tipo | lista de cadenas | Tipo de enlace de credencial por el que filtrar. Los valores válidos son: app o key |
Encontrará service_instance_guids en los detalles de sus service_instances.
Recibirá una lista de recursos del tipo «clave». Como no contienen el campo “válido hasta” es necesario verificar los detalles de cada Clave de Servicio. La URL para verificar los detalles ya se proporciona para cada recurso en el cuerpo
[..]
"links": {
"self": {
"href": "https://host/v3/service_credential_bindings/<guid>"
},
"details": {
"href": "https://host/v3/service_credential_bindings/<guid>/details"
},
7. Convierta y divida los mensajes en XPath “//resources”
8. Para cada mensaje generado, llame a un proceso de integración local que extraiga la URL del punto final para los detalles clave del servicio y envíe una solicitud HTTP.
Como el token de autorización tiene una validez muy larga, no es necesario generar un nuevo token y agregarlo a los encabezados, por lo que puede reutilizar el token que ya estaba configurado como encabezado de autorización. Si tiene problemas aquí, es posible que deba recuperar un nuevo token de autorización.
Recibirá toda la información necesaria para cada clave de servicio
"certificatedetails": {
"issuerdn": "CN=DigiCert TLS RSA SHA256 2020 CA1,O=DigiCert Inc,C=US",
"subjectdn": "<subjectdn>",
"validuntil": "2023-05-03T23:59:59.000Z",
"serialnumber": "<serialnumber>"
}
9. Extraiga el valor «válido hasta» en un modificador de contenido
10. Use un script para verificar los días hasta el vencimiento y configúrelos como propiedad
11. Cree un enrutador con días configurables hasta el vencimiento
12. Use un modificador de contenido para crear un cuerpo de correo y un adaptador de correo de usuario para enviar información por correo a los administradores
Así que el resultado podría verse así:
En esta publicación, traté de proporcionar una breve explicación para crear un iFlow para generar notificaciones por correo electrónico para las claves de servicio que caducan en diferentes instancias de servicio. Esta es solo una forma que funcionó para mí, pero si alguien tiene una mejor solución, especialmente cómo obtener un token para CF-API, estoy abierto a mejoras. ¡Muchas gracias!
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073