SuperAPI AI 工具集

keystore-credstore

部署与运维

查看项目

更新于 10-16 10:15

技能介绍

用途 该技能面向 SAP BTP Neo Java 应用向 Cloud Foundry 的迁移场景,专门替换 Neo 的 KeyStoreService 与 PasswordStorage JNDI 资源,改为使用 SAP Credential Store 服务,通过 mTLS 认证和 REST API 访问凭据。

适用检测条件 当出现以下模式时技能生效:

  • web.xml 中存在 <resource-ref>,其 res-ref-name 为 KeyStoreService、res-type 为 com.sap.cloud.crypto.keystore.api.KeyStoreService,或 res-ref-name 为 PasswordStorage、res-type 为 com.sap.cloud.security.password.PasswordStorage。
  • Java 源码中导入 com.sap.cloud.crypto.keystore.api.KeyStoreService 或 com.sap.cloud.security.password.PasswordStorage,并使用 @Resource(name = "KeyStoreService") 或 @Resource(name = "PasswordStorage") 注入。

前置条件 工作目录必须位于由 jakarta-java25-migration 或 neo-to-cf-migration-orchestrator 创建的 -cf-migration 副本内,若当前目录不以 -cf-migration 结尾,需先切换。调用本技能前必须先调用 sdk-replacement 技能以配置 SAP Cloud SDK。同时要求子账户中具备 Credential Store 授权(entitlement)。

转换步骤

  1. 从 web.xml 中移除 KeyStoreService 与 PasswordStorage 的 <resource-ref> 声明。
  2. 从 assets/ 复制辅助类到项目,扁平放置在 src/main/java/com/example/document/ 下,包括 ServiceCredentials.java、ServiceCredentialsAccessor.java、CertificateParser.java、KeyParser.java、SSLContextProvider.java、CredStoreResponse.java、CredStoreRequestBuilder.java、CredStoreClient.java。这些类负责从 VCAP_SERVICES 读取服务凭据、解析 PEM 证书(X.509)与 PKCS#1 私钥、为 mTLS 创建内存 PKCS12 密钥库的 SSLContext,以及通过 java.net.http.HttpClient 调用 Credential Store REST API。这些类无 Lombok 依赖,手写 getter,可在 JDK 25 下正常构建。包名 com.example.document 为占位符,复制时需改为项目自身包名并同步更新导入。需要在 pom.xml 中添加 scp-cf 与 jakarta.servlet-api 依赖,并通过 cf-tomcat-bom 与 sdk-modules-bom 管理版本。
  3. 更新应用代码。Neo 的 HTTP URL 契约不再保留,新的契约以命名空间和别名为基础:GET /keystore?namespace=<ns> 列出命名空间内所有凭据;GET /keystore?namespace=<ns>&alias=<name> 按键别名获取单个凭据;无 namespace 时返回 400 Bad Request 及正文 Namespace is required!。密码存储应用对应为 GET /?namespace=<ns>&alias=<name>。必须删除原 Neo 中基于 method=getKeyStore、keyStoreName、password 的校验逻辑,改用命名空间校验。web.xml 需在移除 <resource-ref> 的同时把 servlet 映射到 /keystore(密码类应用映射到 /)。原先导入 javax.servlet.* 的 Neo 辅助类需迁移到 jakarta.servlet.*。
  4. 更新 MTA 描述符。credstore 资源必须声明为 org.cloudfoundry.existing-service,不能声明为 managed-service,也不能添加 parameters.service / service-plan 块,否则部署时 broker 会因非法参数而拒绝。credstore 实例及其 mTLS 配置、命名空间与别名由空间操作员在 MTA 之外手动配置并跨应用共享;SAP BTP 对 credstore standard 有每空间 1 个实例的限制。模块构建包为 sap_java_buildpack_jakarta,需显式固定运行时 JRE,例如通过 JBP_CONFIG_COMPONENTS 与 JBP_CONFIG_SAP_MACHINE_JRE 指定 SapMachine 25,并保持 pom.xml 编译目标一致,否则会出现 UnsupportedClassVersionError 与 HTTP 500。
  5. 在 Credential Store 中创建凭据,可通过 BTP Cockpit(Service Marketplace → Credential Store → Manage Instance)或 Credential Store 命令行方式完成。

资源实例供应 供应前需确认环境类型:开发/测试使用 free 计划(10 个凭据,0.1 MB);生产使用 standard 计划(100,000 个凭据,100 MB)。示例命令为 cf create-service credstore free credstore-service -c '{"authentication":{"type":"mtls"}}' 或 cf create-service credstore standard credstore-service -c '{"authentication":{"type":"mtls"}}'。free 计划需要在子账户中配置 Credential Store 授权(BTP Cockpit → Global Account → Entitlements → Add Service Plans → Credential Store → free)。

限制 该技能不负责创建 credstore 实例、定义其 mTLS 配置,也不负责填充命名空间与别名,这些属于空间操作员一次性完成的每空间设置。