Spring Cloud构建微服务架构:分布式配置中心(加密解密)

Spring Cloud构建微服务架构:分布式配置中心(加密解密)

作者:翟永超 2018-05-23 15:58:27

开发

开发工具

架构

分布式 在微服务架构中,我们通常都会采用DevOps的组织方式来降低因团队间沟通造成的巨大成本,以加速微服务应用的交付能力。

在微服务架构中,我们通常都会采用DevOps的组织方式来降低因团队间沟通造成的巨大成本,以加速微服务应用的交付能力。这就使得原本由运维团队控制的线上信息将交由微服务所属组织的成员自行维护,其中将会包括大量的敏感信息,比如:数据库的账户与密码等。很显然,如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。针对这个问题,Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。

[[230203]]

比如下面的例子:

  1. spring.datasource.username=didi 
  2. spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b 

在Spring Cloud Config中通过在属性值前使用{cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有{cipher}前缀的值进行解密。通过该机制的实现,运维团队就可以放心的将线上信息的加密资源给到微服务团队,而不用担心这些敏感信息遭到泄露了。下面我们来具体介绍如何在配置中心使用该项功能。

使用前提

在使用Spring Cloud Config的加密解密功能时,有一个必要的前提需要我们注意。为了启用该功能,我们需要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。虽然,JCE功能在JRE中自带,但是默认使用的是有长度限制的版本。我们可以从Oracle的官方网站中下载到它,它是一个压缩包,解压后可以看到下面三个文件:

  1. README.txt 
  2. local_policy.jar 
  3. US_export_policy.jar 

我们需要将local_policy.jar和US_export_policy.jar两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。到这里,加密解密的准备工作就完成了。

相关端点

在完成了JCE的安装后,可以尝试启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

  • /encrypt/status:查看加密功能状态的端点
  • /key:查看密钥的端点
  • /encrypt:对请求的body内容进行加密的端点
  • /decrypt:对请求的body内容进行解密的端点

可以尝试通过GET请求访问/encrypt/status端点,我们将得到如下内容:

  1.   "description""No key was installed for encryption service"
  2.   "status""NO_KEY" 

该返回说明当前配置中心的加密功能还不能使用,因为没有为加密服务配置对应的密钥。

配置密钥

我们可以通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥),比如:

  1. encrypt.key=didispace 

加入上述配置信息后,重启配置中心,再访问/encrypt/status端点,我们将得到如下内容:

  1.   "status""OK" 

此时,我们配置中心的加密解密功能就已经可以使用了,不妨尝试访问一下/encrypt和/decrypt端点来进行加密和解密的功能。注意,这两个端点都是POST请求,加密和解密信息需要通过请求体来发送。比如,以curl命令为例,我们可以通过下面的方式调用加密与解密端点:

  1. $ curl localhost:7001/encrypt -d didispace 
  2. 3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7 
  3.  
  4. $ curl localhost:7001/decrypt -d  3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7 
  5. didispace 

这里,我们通过配置encrypt.key参数来指定密钥的实现方式采用了对称性加密。这种方式实现比较简单,只需要配置一个参数即可。另外,我们也可以使用环境变量ENCRYPT_KEY来进行配置,让密钥信息外部化存储。

非对称加密

Spring Cloud Config的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如:RSA密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。下面,我们来具体介绍一下如何使用非对称加密。

首先,我们需要通过keytool工具来生成密钥对。keytool是JDK中的一个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在JDK 1.4以后的版本中都包含了这一工具,它的位置在:%JAVA_HOME%\bin\keytool.exe。

生成密钥的具体命令如下:

  1. $ keytool -genkeypair -alias config-server -keyalg RSA -keystore config-server.keystore 
  2. 输入密钥库口令: 
  3. 再次输入新口令: 
  4. 您的名字与姓氏是什么? 
  5.   [Unknown]:  zhaiyongchao 
  6. 您的组织单位名称是什么? 
  7.   [Unknown]:  company 
  8. 您的组织名称是什么? 
  9.   [Unknown]:  organization 
  10. 您所在的城市或区域名称是什么? 
  11.   [Unknown]:  city 
  12. 您所在的省/市/自治区名称是什么? 
  13.   [Unknown]:  province 
  14. 该单位的双字母国家/地区代码是什么? 
  15.   [Unknown]:  china 
  16. CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china是否正确? 
  17.   [否]:  y 
  18.  
  19. 输入 <config-server> 的密钥口令 
  20.         (如果和密钥库口令相同, 按回车): 
  21. 再次输入新口令: 

另外,如果我们不想逐步的输入那些提示信息,可以使用-dname来直接指定,而密钥库口令与密钥口令可使用-storepass和-keypass来直接指定。所以,我们可以通过下面的命令直接创建出与上述命令一样的密钥库:

  1. $ keytool -genkeypair -alias config-server -keyalg RSA \  
  2.   -dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \ 
  3.   -keypass 222222 \ 
  4.   -keystore config-server.keystore \ 
  5.   -storepass 111111 \ 

默认情况下,上述命令创建的密钥只有90天有效期。如果我们想要调整它的有效期,可以通过增加-validity参数来实现,比如我们可以通过下面的命令,让密钥的有效期延长到一年:

  1. $ keytool -genkeypair -alias config-server -keyalg RSA \  
  2.   -dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \ 
  3.   -keypass 222222 \ 
  4.   -keystore config-server.keystore \ 
  5.   -storepass 111111 \ 
  6.   -validity 365 \ 

上述的三种命令生成方式,最终都会在命令的当前执行目录下生成一个config-server.keystore文件。下面,我们需要将它保存在配置中心的文件系统中的某个位置,比如放在当前的用户目录下,然后在配置中心中加入相关的配置信息:

  1. encrypt.key-store.location=file://${user.home}/config-server.keystore 
  2. encrypt.key-store.alias=config-server 
  3. encrypt.key-store.password=111111 
  4. encrypt.key-store.secret=222222 

如果我们将config-server.keystore放在配置中心的src/main/resource目录下,也可以直接这样配置:encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也可以通过环境变量的方式进行配置,它们对应的具体变量名如下:

  1. ENCRYPT_KEY_STORE_LOCATION 
  2. ENCRYPT_KEY_STORE_ALIAS 
  3. ENCRYPT_KEY_STORE_PASSWORD 
  4. ENCRYPT_KEY_STORE_SECRET 

通过环境变量来配置密钥库相关信息可以获得更好的安全性,所以我们可以将敏感的口令信息存储在配置中心的环境变量中是一种不错的选择。

【本文为51CTO专栏作者“翟永超”的原创稿件,转载请通过51CTO联系作者获取授权】

戳这里,看该作者更多好文

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/287358.html<

(0)
管理的头像管理
上一篇2025-05-15 20:04
下一篇 2025-05-15 20:06

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注