- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring Cloud微服务架构的构建:分布式配置中心(加密解密功能)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
要会用,首先要了解。图懒得画,借鉴网上大牛的图吧,springcloud组建架构如图:
微服务架构的应用场景:
1、系统拆分,多个子系统 。
2、每个子系统可部署多个应用,应用之间负载均衡实现 。
3、需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现.
4、所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个url请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡.
5、服务之间有时候也需要相互访问。例如有一个用户模块,其他服务在处理一些业务的时候,要获取用户服务的用户数据.
6、需要一个断路器,及时处理服务调用时的超时和错误,防止由于其中一个服务的问题而导致整体系统的瘫痪.
7、还需要一个监控功能,监控每个服务调用花费的时间等.
引言 。
在微服务架构中,我们通常都会采用devops的组织方式来降低因团队间沟通造成的巨大成本,以加速微服务应用的交付能力。这就使得原本由运维团队控制的线上信息将交由微服务所属组织的成员自行维护,其中将会包括大量的敏感信息,比如:数据库的账户与密码等。很显然,如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。针对这个问题,spring cloud config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。比如下面的例子:
1
2
|
spring.datasource.username=didi
spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b
|
在spring cloud config中通过在属性值前使用{cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有{cipher}前缀的值进行解密。通过该机制的实现,运维团队就可以放心的将线上信息的加密资源给到微服务团队,而不用担心这些敏感信息遭到泄露了。下面我们来具体介绍如何在配置中心使用该项功能.
使用前提 。
在使用spring cloud config的加密解密功能时,有一个必要的前提需要我们注意。为了启用该功能,我们需要在配置中心的运行环境中安装不限长度的jce版本(unlimited strength java cryptography extension)。虽然,jce功能在jre中自带,但是默认使用的是有长度限制的版本。我们可以从oracle的官方网站中下载到它,它是一个压缩包,解压后可以看到下面三个文件:
1
2
3
|
readme.txt
local_policy.jar
us_export_policy.jar
|
我们需要将local_policy.jar和us_export_policy.jar两个文件复制到$java_home/jre/lib/security目录下,覆盖原来的默认内容。到这里,加密解密的准备工作就完成了.
相关端点 。
在完成了jce的安装后,可以尝试启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:
可以尝试通过get请求访问/encrypt/status端点,我们将得到如下内容:
1
2
3
4
|
{
"description"
:
"no key was installed for encryption service"
,
"status"
:
"no_key"
}
|
该返回说明当前配置中心的加密功能还不能使用,因为没有为加密服务配置对应的密钥.
配置密钥 。
我们可以通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥),比如:
1
|
encrypt.key=didispace
|
加入上述配置信息后,重启配置中心,再访问/encrypt/status端点,我们将得到如下内容:
1
2
3
|
{
"status"
:
"ok"
}
|
此时,我们配置中心的加密解密功能就已经可以使用了,不妨尝试访问一下/encrypt和/decrypt端点来进行加密和解密的功能。注意,这两个端点都是post请求,加密和解密信息需要通过请求体来发送。比如,以curl命令为例,我们可以通过下面的方式调用加密与解密端点:
1
2
3
4
5
|
$ curl localhost:
7001
/encrypt -d didispace
3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
$ curl localhost:
7001
/decrypt -d 3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
didispace
|
这里,我们通过配置encrypt.key参数来指定密钥的实现方式采用了对称性加密。这种方式实现比较简单,只需要配置一个参数即可。另外,我们也可以使用环境变量encrypt_key来进行配置,让密钥信息外部化存储.
非对称加密 。
spring cloud config的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如:rsa密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。下面,我们来具体介绍一下如何使用非对称加密.
首先,我们需要通过keytool工具来生成密钥对。keytool是jdk中的一个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在jdk 1.4以后的版本中都包含了这一工具,它的位置在:%java_home%\bin\keytool.exe.
生成密钥的具体命令如下:
$ keytool -genkeypair -alias config-server -keyalg rsa -keystore config-server.keystore 输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [unknown]: zhaiyongchao 您的组织单位名称是什么? [unknown]: company 您的组织名称是什么? [unknown]: organization 您所在的城市或区域名称是什么? [unknown]: city 您所在的省/市/自治区名称是什么? [unknown]: province 该单位的双字母国家/地区代码是什么? [unknown]: china cn=zhaiyongchao, ou=company, o=organization, l=city, st=province, c=china是否正确? [否]: y 。
输入 <config-server> 的密钥口令 (如果和密钥库口令相同, 按回车): 再次输入新口令
另外,如果我们不想逐步的输入那些提示信息,可以使用-dname来直接指定,而密钥库口令与密钥口令可使用-storepass和-keypass来直接指定。所以,我们可以通过下面的命令直接创建出与上述命令一样的密钥库:
1
2
3
4
5
|
$ keytool -genkeypair -alias config-server -keyalg rsa \
-dname
"cn=zhaiyongchao, ou=company, o=organization, l=city, st=province, c=china"
\
-keypass
222222
\
-keystore config-server.keystore \
-storepass
111111
\
|
默认情况下,上述命令创建的密钥只有90天有效期。如果我们想要调整它的有效期,可以通过增加-validity参数来实现,比如我们可以通过下面的命令,让密钥的有效期延长到一年:
1
2
3
4
5
6
|
$ keytool -genkeypair -alias config-server -keyalg rsa \
-dname
"cn=zhaiyongchao, ou=company, o=organization, l=city, st=province, c=china"
\
-keypass
222222
\
-keystore config-server.keystore \
-storepass
111111
\
-validity
365
\
|
上述的三种命令生成方式,最终都会在命令的当前执行目录下生成一个config-server.keystore文件。下面,我们需要将它保存在配置中心的文件系统中的某个位置,比如放在当前的用户目录下,然后在配置中心中加入相关的配置信息:
1
2
3
4
|
encrypt.key-store.location=file:
//${user.home}/config-server.keystore
encrypt.key-store.alias=config-server
encrypt.key-store.password=
111111
encrypt.key-store.secret=
222222
|
如果我们将config-server.keystore放在配置中心的src/main/resource目录下,也可以直接这样配置:encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也可以通过环境变量的方式进行配置,它们对应的具体变量名如下:
1
2
3
4
|
encrypt_key_store_location
encrypt_key_store_alias
encrypt_key_store_password
encrypt_key_store_secret
|
通过环境变量来配置密钥库相关信息可以获得更好的安全性,所以我们可以将敏感的口令信息存储在配置中心的环境变量中是一种不错的选择.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://blog.didispace.com/spring-cloud-starter-dalston-3-2/ 。
最后此篇关于Spring Cloud微服务架构的构建:分布式配置中心(加密解密功能)的文章就讲到这里了,如果你想了解更多关于Spring Cloud微服务架构的构建:分布式配置中心(加密解密功能)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 Cloud Run 服务,它通过 SQLAlchemy 访问 Cloud SQL 实例.但是,在 Cloud Run 的日志中,我看到 CloudSQL connection failed.
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
在将 docker 容器镜像部署到 Cloud Run 时,我可以选择一个区域,这很好。 Cloud Run 将构建委托(delegate)给 Cloud Build,后者显然会创建两个存储桶来实现这
我正在尝试将 Cloud Functions 用作由 PubSub 触发的异步后台工作程序,并进行更长时间的工作(以分钟为单位)。完整代码在这里https://github.com/zdenulo/c
这是/etc/cloud/cloud.cfg的内容Ubuntu云16.04镜像: # The top level settings are used as module # and system co
如何从 Google Cloud Function 启动 Cloud Dataflow 作业?我想使用 Google Cloud Functions 作为启用跨服务组合的机制。 最佳答案 我已经包含了
我想使用 Cloud Shell 在我的第二代 Cloud Sql 实例上运行数据库迁移。 我找到了一个 example in the docs关于如何使用 gcloud 进行连接.但是当我运行命令时
我正在尝试使用 Google Cloud PubSub和我的 Google Cloud Dataproc群集,我收到如下身份验证范围错误: { "code" : 403, "errors" :
这是我的用例。 我已经有一个以私有(private)模式部署的 Cloud Run 服务。 (与云功能相同的问题) 我正在开发使用此 Cloud Run 的新服务。我在应用程序中使用默认凭据进行身份验
如何连接到 Cloud SQL 上的数据库,而无需在容器中添加我的凭据文件? 最佳答案 使用 UNIX 域套接字 (Java) 从云运行(完全托管)连接到云 SQL At this time Clou
我有一个google-cloud-ml作业,需要从gs存储桶加载numpy .npz文件。我遵循了this example上关于如何从gs加载.npy文件的操作,但是由于.npz文件已压缩,因此它对我
我想创建链接到另一个项目中的 Cloud Source Repository 的 Cloud Build 触发器。但是当我在应该选择存储库的步骤中时,列表是空的。我尝试了不同的许可,但没有运气。谁能告
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
我需要更改我的项目 ID,因为要验证的 Firebase 身份验证链接在链接上显示了项目 ID,并且由于品牌 reshape ,项目名称已更改。根据我发现的信息,更改项目 ID 似乎不太可能。我正在考
用于部署我的 Angular 应用程序的 CI/CD 管道已关闭,但我看到 Google Cloud Run 在容器镜像更新后没有部署新修订版。 我已将 Cloud Build 设置为在 GitHub
报价https://cloud.google.com/load-balancing/docs/https/setting-up-https-serverless#enabling While Goog
Cloud Spanner 提供了两种不同的 API。 Cloud Spanner 读取与 Cloud Spanner SQL API 之间有什么区别? 最佳答案 在幕后,它们都使用相同的执行机制,因
我是 GCP 堆栈的新手,所以我对用于存储数据的 GCP 技术数量感到非常困惑: https://cloud.google.com/products/storage 虽然上面的文章中没有提到googl
我发现 Google Cloud Functions 的网络出站费用令人惊讶,我正在尝试了解发生这种情况的原因以及如何避免这种情况。 Stackdriver 监控表明有问题的函数是我的 ingest
我使用 Prisma使用 Cloud Run 和 Cloud SQL。在向 prisma.schema 提供 DATABASE_URL 后,它会在运行时抛出一个错误。 Can't reach data
我是一名优秀的程序员,十分优秀!