使用 Sping Boot 在 Cloud Foundry 上加密属性

问题描述

我有一个 Spring Boot 应用程序,它的属性文件中有一些加密值 例如spring.security.user.password=ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm) 我正在使用 jasypt 即时解密这些。这在本地运行正常。

但是,当我在 Cloud Foundry 上部署应用程序时,我的属性文件现在从 vcap 环境变量中提取值。 例如 spring.security.user.password=${vcap.services.myconfig.credentials.user.password}

在 PCF 中,该值添加

user.password = ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm)

但是现在我的应用程序无法启动,我收到一条错误消息

错误 22 --- [主要] o.s.b.web.embedded.tomcat.TomcatStarter:错误 启动Tomcat上下文。例外: org.springframework.beans.factory.UnsatisfiedDependencyException。 消息:使用名称创建 bean 时出错 类路径资源中定义的“securityFilterChainRegistration” [org/springframework/boot/autoconfigure/security/servlet/SecurityFilterautoConfiguration.class]: 通过方法表达的不满足的依赖 'securityFilterChainRegistration' 参数 0;嵌套异常是 org.springframework.boot.context.properties.ConfigurationPropertiesBindException: 创建带有名称的 bean 时出错 'spring.security-org.springframework.boot.autoconfigure.security.SecurityProperties': 无法将属性绑定到“SecurityProperties”: 前缀=spring.security,ignoreInvalidFields=false, ignoreUnkNownFields=true;嵌套异常是 org.springframework.boot.context.properties.bind.BindException:失败 将“spring.security.user.password”下的属性绑定到 java.lang.String

是否有任何原因让我想念为什么这在本地有效但在 Cloud Foundry 上无效?

更新

cf env returns ...

    
System-Provided:
{
 "VCAP_SERVICES": {
  "user-provided": [
   {
    "binding_name": null,"credentials": {
     "JAVA_OPTS": "-Dspring.security.user.password=ENC\\\\(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm\\\\)","user.password": "ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm)"
    },"instance_name": "myconfig","label": "user-provided","name": "myconfig","syslog_drain_url": "","tags": [],"volume_mounts": []
   }
  ]
 }
}

这会导致 JAVA_OPTS 版本有效以及无法解析的 user.password 属性

解决方法

试试这个:

JAVA_OPTS=-Dspring.security.user.password=ENC\\(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm\\)