Spring Cloud(Dalston.SR5)--Config 集群配置中心-加解密

实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 SVN 仓库中,最常见的就是数据库密码。Spring Cloud Config 为这类敏感数据提供了加密和解密的功能,加密后的密文在传输给客户端前会进行解密。配置服务支持对称加密(AES算法)和非对称加密(RSA算法)。

在使用配置服务的加密和解密功能,首先必须安装 JCE(Java Cryptography Extension),可以到 Oracle 的官方网站下载(下载地址),解压缩后会得到 local_policy.jar 和 US_export_policy.jar 两个 jar 包,将其复制到 $JAVA_HOME/jre/lib/security 目录中,即可完成安装。

   

  • 对称加密配置

    对称加密使用一套密钥来进行加密和解密,我们需要在配置服务的 src/main/resources 目录下创建 bootstrap.yml (application.yml 配置不生效)配置文件,来配置使用对称加密的密钥,如下:

    #对称加密密钥配置

    encrypt:

    key:9918292382837237

    配置了密钥后,可以启动项目,访问 http://localhost:8080/encrypt/status 可以查看密钥的配置是否正确,如果出现 {"status":"OK"} 表示密钥配置正确,如果出现 {"description":"No key was installed for encryption service","status":"NO_KEY"} 表示配置有错误,需要确认 JCE 的安装及密钥配置。

  • 非对称加密配置

    非对称加密使用的是一对密钥,使用公钥加密私钥解密,可以使用 keytool 工具生成一对密钥用于加密和解密,生成密钥的命令如下:

    keytool -genkeypair -alias "config-server-key" -keyalg "RSA" -keystore "e:\temp\config-server-key.keystore" -validity 3560

    生成非对称密钥后,将生成的密钥库文件复制到 src/main/resources 目录下,并将相关信息配置到配置服务中,我们需要在配置服务的 src/main/resources 目录下创建 bootstrap.yml (application.yml 配置不生效)配置文件,来配置使用非对称加密的密钥,如下:

    #非对称加密配置

    encrypt:

    key-store:

    #密钥库文件路径

    location:classpath:/config-server-key.keystore

    #密钥库密码

    password:liyong

    #密钥库的别名

    alias:config-server-key

    #密钥密码

    secret:liyong

       

    同样,配置了密钥后,可以启动项目,访问 http://localhost:8080/encrypt/status 可以查看密钥的配置是否正确,如果出现 {"status":"OK"} 表示密钥配置正确,如果出现 {"description":"No key was installed for encryption service","status":"NO_KEY"} 表示配置有错误,需要确认 JCE 的安装及密钥配置。

  • 加密和解密数据

    在配置好密钥后,我们可以通过访问配置服务的 /encrypt 和 /decrypt 端点来进行加密或者解密,需要使用 HTTP 的 POST 方法,将需要加密的内容或者密文放在请求体中,如下:

    POST http://localhost:8080/encrypt HTTP/1.1

    User-Agent: Fiddler

    Host: localhost:8080

    Content-Length: 30

    Authorization: Basic bGl4dWU6bGl5b25n

    Content-Type: text/plain;charset=UTF-8

       

    这个是明文,需要加密

       

    请求返回的响应体内容就是加密后的密文,如下:

    HTTP/1.1 200

    X-Application-Context: spring-cloud-config:subversion:8080

    X-Content-Type-Options: nosniff

    X-XSS-Protection: 1; mode=block

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate

    Pragma: no-cache

    Expires: 0

    X-Frame-Options: DENY

    Strict-Transport-Security: max-age=31536000 ; includeSubDomains

    Content-Type: text/plain;charset=UTF-8

    Content-Length: 408

    Date: Tue, 24 Apr 2018 13:15:56 GMT

       

    AQBBSHmmQXVq/NvFdIWHGZo1I6KwSMX8ySp/YkMoWpUGA+h4lczFvHbtkprkuvPNxqQ79V4ZnmoIsFKTJwgBAY6YDhQrqDnli51Q7LZTDOCMWjerdWZrzBog01bz5bFsDJGTPSz0dvYg8uJXzD09e7o7BGguJ3upgnNMuA4hpfVrSENhLZg1DfoudJDVWj1WwHyIUGeAM1kq1FzoMAkiYi0ifP0N59JugH8AsHN6Cs2Pb3TmQwiXDJ36ejvM5zyByANxSGRtHjV0jXWK23shVGjs0Pn9oWMLkpsT7/U2qDPNpGUYIUTKsQsz/BncsaLJY1OODWQ1xgMEnBXafIKkBEgQHLRpQmnzWdBIKx6fU483D7rGuSF7Et3xXFMZ9ztGb93FinIIbwRR1WD4eTjyKHQ1

    我们使用密文提交 /decrypt 进行解密,将密文放入请求体中,如下:

    POST http://localhost:8080/decrypt HTTP/1.1

    User-Agent: Fiddler

    Host: localhost:8080

    Content-Length: 408

    Authorization: Basic bGl4dWU6bGl5b25n

    Content-Type: text/plain;charset=UTF-8

       

    AQBBSHmmQXVq/NvFdIWHGZo1I6KwSMX8ySp/YkMoWpUGA+h4lczFvHbtkprkuvPNxqQ79V4ZnmoIsFKTJwgBAY6YDhQrqDnli51Q7LZTDOCMWjerdWZrzBog01bz5bFsDJGTPSz0dvYg8uJXzD09e7o7BGguJ3upgnNMuA4hpfVrSENhLZg1DfoudJDVWj1WwHyIUGeAM1kq1FzoMAkiYi0ifP0N59JugH8AsHN6Cs2Pb3TmQwiXDJ36ejvM5zyByANxSGRtHjV0jXWK23shVGjs0Pn9oWMLkpsT7/U2qDPNpGUYIUTKsQsz/BncsaLJY1OODWQ1xgMEnBXafIKkBEgQHLRpQmnzWdBIKx6fU483D7rGuSF7Et3xXFMZ9ztGb93FinIIbwRR1WD4eTjyKHQ1

    请求返回的响应体内容就是解密后的明文,如下:

    HTTP/1.1 200

    X-Application-Context: spring-cloud-config:subversion:8080

    X-Content-Type-Options: nosniff

    X-XSS-Protection: 1; mode=block

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate

    Pragma: no-cache

    Expires: 0

    X-Frame-Options: DENY

    Strict-Transport-Security: max-age=31536000 ; includeSubDomains

    Content-Type: text/plain;charset=UTF-8

    Content-Length: 30

    Date: Tue, 24 Apr 2018 13:19:02 GMT

       

    这个是明文,需要加密

       

  • SVN 存储加密数据

    在 SVN 仓库中的 yml 或者 ptoperties 配置文件中,使用 "{cipher}密文" 的格式来保存加密后的数据,例如,密钥为 myKey,MySQL 数据库的密码为 liyong,那么密文为 16bf88a2362c6b7a60c28c8608ab4a80f4b497dc294731f151e7822ac565a899,那我们配置在 SVN 仓库的配置文件需要如下配置:

    spring:

    application:

    name:spring-cloud-config-client-dev

    server:

    port:8013

    info:

    name:refresh

    desc:aa

    mysql:

    passwd:'{cipher}b60b034ba08e4f4d02135a5a1eb31679506667afe91e0da7245fafdd9b0a1d19'

       

    启动配置服务后,访问 http://localhost:8080/test/spring-cloud-config-client-dev.yml 可以看到浏览器的输出:

    info:

    desc:aa

    name:refresh

    mysql:

    passwd:liyong

    server:

    port:8013

    spring:

    application:

    name:spring-cloud-config-client-dev

       

       

posted @ 2018-05-17 23:08  立3807  阅读(667)  评论(0编辑  收藏  举报