4

我正在尝试使用 Spring 配置服务器和客户端加密和解密配置属性。我有spring boot应用程序(服务器和客户端),使用服务器我加密了密码属性,在客户端我试图使用相同的密钥解密它但出现错误。我正在尝试启用配置服务器客户端来解密这些最初由配置服务器加密的属性。以下是我遵循的步骤:

  1. 安装 Full-strength JCE 并替换 JRE lib/security 中的 2 个策略文件

  2. 使用 keytool 生成密钥

    keytool -genkeypair -alias config-server-key -keyalg RSA \
    -keysize 4096 -sigalg SHA512withRSA -dname "CN=*.domain.com,OU=EUS,O=eusdom,L=City,S=WA,C=US" \
    -keypass keyPass -keystore config-server.jks -storepass keys3crt
    
  3. 向 pom 文件添加了云安全依赖项(在配置服务器和客户端 pom 中添加了这些)

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-rsa</artifactId>
    <version>1.0.1.RELEASE</version>
    </dependency>
    
  4. 将加密相关配置(配置服务器和客户端使用的值相同)添加到bootstrap.yml也尝试过application.yml

    encrypt:
    key-store:
        location: file:///D:/encrypt-server/config-server.jks
        password: keyPass
        alias: config-server-key
        secret: keys3crt
    
  5. 我的配置服务器引导程序看起来像这样

    spring:
      application:
        name: config-service
      cloud:
        config:
            server:
                git:
                    uri: https://github.com/<>/spring-config-repo
                encrypt:
                    enabled: false
    server:
      port: 8888
    
  6. 使用配置服务器加密密码属性

    curl -X POST --data-urlencode d3v3L \  http://localhost:8888/encrypt
    
  7. 尝试使用配置服务器解密属性

    curl  http://localhost:8888/decrypt  -d <encryptedVale>
    

我得到以下错误

    {"timestamp":1472667297292,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalStateException","message":"Cannot decrypt","path":"/decrypt"}
  1. 我尝试使用配置客户端打印加密属性(注意:我已经添加了依赖项并根据 3,4 加密密钥详细信息)

    @RefreshScope
    @Component
    @RestController
    public class Greeter {
    
    @Value("${cassandra.hostnames}")
    String hostnames;
    
    @Value("${cassandra.username}")
    String userName;
    
    @Value("${cassandra.password}")
    String passWord;
    
    @RequestMapping(value = "/", produces = "application/json")
    public List<String> index(){
        List<String> env = Arrays.asList(
            "userName is: " + userName,
            "passWord is: " + passWord,
    );
    return env;
    }
    

    }

  2. 我收到java.lang.IllegalStateException: Cannot decrypt: key=cassandra.password错误

  3. 注意:我尝试在配置服务器中解密

     encrypt:
      enabled: false
    

    如果我在这里遗漏任何东西,请告诉我。感谢任何帮助。

4

1 回答 1

0

默认情况下不再启用用于启用非对称加密的引导配置。如果您的项目需要它,可以通过属性或新的启动器重新启用它。可以在 [这里] [1] 找到指南:https ://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes#break-changes

要在大于 2.3.x 的 Spring Boot 版本中启用引导,我们需要添加 #SpringCloud 引入的新启动器依赖项。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>3.0.1</version>
    </dependency>
于 2021-02-16T11:14:33.113 回答