当前位置: 首页 > 科技观察

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

时间:2023-03-19 17:51:53 科技观察

在微服务架构中,我们通常采用DevOps的组织方式来减少团队间沟通带来的巨大成本,加速微服务应用能力的交付。这意味着原本由运维团队掌控的线上信息将交给微服务所属组织的成员维护,其中将包含大量的敏感信息,例如:数据库账号和密码。显然,如果我们直接将敏感信息以明文形式存储在微服务应用的配置文件中,是非常危险的。针对这个问题,SpringCloudConfig提供了加解密属性的功能来保护配置文件中的信息安全。例如下面的例子:spring.datasource.username=didisring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b在SpringCloudConfig中,在属性值前使用{cipher}前缀来标记内容为客户端加密值。加载配置时,配置中心会自动解密以{cipher}为前缀的值。通过这种机制的实现,运维团队可以安全地将在线信息的加密资源交给微服务团队,而不用担心这些敏感信息的泄露。下面介绍如何在配置中心使用该功能。前提条件在使用SpringCloudConfig的加解密功能时,有一个必要的前提条件是我们需要注意的。为了启用这个功能,我们需要在配置中心的运行环境中安装无限长度的JCE版本(UnlimitedStrengthJavaCryptographyExtension)。虽然JRE自带了JCE功能,但是默认使用的是限长版本。我们可以从Oracle官网下载。它是一个压缩包。解压后可以看到如下三个文件:README.txtlocal_policy.jarUS_export_policy.jar我们需要将local_policy.jar和US_export_policy.jar这两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来默认的内容.至此,加解密的准备工作就完成了。相关端点完成JCE安装后,就可以尝试启动配置中心了。在控制台中,会输出一些配置中心特有的端点,主要包括:/encrypt/status:查看加密功能状态的端点/key:查看密钥的端点/encrypt:加密requestedbodycontent/decrypt:解密请求body内容的端点可以尝试通过GET请求访问/encrypt/status端点,我们会得到如下内容:{"description":"Nokeywasinstalledforencryptionservice","status":"NO_KEY"}返回表示当前配置中心的加密功能还不能使用,因为没有为加密服务配置对应的密钥。配置密钥,我们可以直接在配置文件中通过encrypt.key属性指定密钥信息(对称密钥),例如:encrypt.key=didispace添加以上配置信息后,重启配置中心,然后访问/encrypt/status端点,我们会得到如下内容:{"status":"OK"}至此,我们配置中心的加解密功能就可以使用了,所以尝试访问/encrypt和/decrypt端点以执行加密和解密功能。注意这两个端点都是POST请求,加解密信息需要通过请求体发送。比如,以curl指令为例,我们可以通过下面的方式调用加密与解密端点:$curllocalhost:7001/encrypt-ddidispace3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7$curllocalhost:7001/decrypt-d3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7didispace这里,我们通过配置encrypt.key参数来指定密钥的Theimplementationusessymmetricencryption.该方法实现起来比较简单,只需要配置一个参数即可。另外,我们还可以使用环境变量ENCRYPT_KEY来配置,这样就可以对外存储密钥信息了。非对称加密SpringCloudConfig的配置中心不仅可以使用对称加密,还可以使用非对称加密(例如:RSA密钥对)。非对称加密的密钥生成和配置虽然比较复杂,但是安全性更高。下面详细介绍一下非对称加密的使用方法。首先,我们需要通过keytool工具生成密钥对。keytool是JDK中的密钥和证书管理工具。它使用户能够管理他们自己的公钥/私钥对和相关证书,用于(通过数字签名)自我认证(用户向其他用户/服务认证自己)或数据完整性和认证服务。该工具包含在JDK1.4之后的版本中,其位置为:%JAVA_HOME%\bin\keytool.exe。生成密钥的具体命令如下:$keytool-genkeypair-aliasconfig-server-keyalgRSA-keystoreconfig-server.keystore输入keystore密码:再次输入新密码:你的名字和姓氏是什么?[Unknown]:zhaiyongchao你的组织单位名称是什么你所在的省/市/自治区?[Unknown]:province这个单位的两个字母的国家/地区代码是什么?[未知]:chinaCN=zhaiyongchao,OU=company,O=organization,L=city,ST=province,C=china对吗?[No]:yEnterthekeypasswordof(ifitisthesameasthekeystorepassword,pressEnter):Enterthenewpasswordagain:另外,如果我们不想输入那些提示信息步骤一步一步,我们可以直接使用-dname来指定,keystore密码和key密码可以直接使用-storepass和-keypass来指定。因此,我们可以直接通过以下命令创建与上述命令相同的keystore:$keytool-genkeypair-aliasconfig-server-keyalgRSA\-dname"CN=zhaiyongchao,OU=company,O=organization,L=city,ST=province,C=china"\-keypass222222\-keystoreconfig-server.keystore\-storepass111111\默认情况下,上述命令创建的密钥只有90天有效。如果我们想调整它的有效期,我们可以通过添加-validity参数来实现。例如,我们可以通过以下命令将密钥的有效期延长至一年:$keytool-genkeypair-aliasconfig-server-keyalgRSA\-dname"CN=zhaiyongchao,OU=company,O=organization,L=city,ST=province,C=china"\-keypass222222\-keystoreconfig-server.keystore\-storepass111111\-validity365\以上三种命令生成方式,最后会在当前执行目录下生成一个config-server.keystore文件命令。接下来我们需要将其保存在配置中心的文件系统中的某个位置,比如当前用户目录下,然后在配置中心添加相关的配置信息:encrypt.key-store.location=file://${user.home}/config-server.keystoreencrypt.key-store.alias=config-serverencrypt.key-store.password=111111encrypt.key-store.secret=222222如果我们把config-server.keystore放在配置中在中心的src/main/resource目录下,也可以直接这样配置:encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也可以通过环境变量进行配置,它们对应的具体变量名如下:ENCRYPT_KEY_STORE_LOCATIONENCRYPT_KEY_STORE_ALIASENCRYPT_KEY_STORE_PASSWORDENCRYPT_KEY_STORE_SECRET通过环境变量配置keystore相关信息以获得更好的安全性,所以我们可以设置敏感的是一个不错的选择将配置中心的密码信息存放在环境变量中。【本文为专栏作家“翟永超”原创稿件,转载请联系作者获得授权】点此查看该作者更多好文