千家信息网

Spring Cloud Config - RSA简介以及使用RSA加密配置文件

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,简介RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的。因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以称
千家信息网最后更新 2026年10月31日Spring Cloud Config - RSA简介以及使用RSA加密配置文件

简介

RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的。因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以称为非对称加密。Private Key和Public Key有互操作性,即用private key加密的可以用public key解密,用public key加密的可以用private key解密。传统的单向认证则只用public key进行加密,有private key的一方才可进行解密。例如,一个web服务器会有一对private key和public key。浏览器客户端保存着服务器的public key。当客户端需要向服务器发送数据时,就用服务器的public key进行加密,然后服务器收到数据时,再用private key进行解密。客户端验证服务器是否为真实的服务器时,会根据服务器提供的public key和自己本地保存的public key作比较,一致的话才能验证服务器的真实性。

在我们的config server中,一些对加密要求比较高的可以采用RSA算法进行数据的加密和解密。

项目源码

Gitee码云

生成测试Keystore

我们需要使用jdk自带的keytool工具生成一个keystore,里边保存了private key的信息,使用如下命令行:

keytool -genkeypair -alias config-server-key -keyalg RSA -dname "CN=Config Server,OU=Xuqian,O=My Own Company,L=Beijing,S=Beijing,C=CN" -keypass changeit -keystore server.jks -storepass changeit

-genkeypair 参数即产生一对public key和private key。
-alias 指定key的别名,用于区分同一keystore中不同的key。
-keyalg 指定生成key的算法,这里使用默认的RSA
-dname 指定common name,即CN,用以验证key的身份。其中各项皆为自定义参数,OU为单位名称,O为组织名称,L为城市,S为省份/州,C为国家
-keypass 为key的密码
-keystore 为keystore的文件名
-storepass 访问keystore的密码

上述工具将产生的 privte key 保存在了名为server.jks的 key store 中。到目前为止,我们只产生了 private key,Spring Cloud Config Server 会根据我们提供的 key 的信息,每次会用程序生成一个 public key,参考如下源代码org.springframework.security.rsa.crypto.KeyStoreKeyFactory:

public KeyPair getKeyPair(String alias, char[] password) {    try {        synchronized (lock) {            if (store == null) {                synchronized (lock) {                    // 根据配置提供的 keystore 文件地址和密码获取 keystore 的实例对象                    store = KeyStore.getInstance("jks");                    store.load(resource.getInputStream(), this.password);                }            }        }        // 根据配置提供的 alias 和 password 从 keystore 中取得 private key        RSAPrivateCrtKey key = (RSAPrivateCrtKey) store.getKey(alias, password);        // 定义 Public Key 生成规则        RSAPublicKeySpec spec = new RSAPublicKeySpec(key.getModulus(),                key.getPublicExponent());        // 生成 Public Key        PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(spec);        return new KeyPair(publicKey, key);    }    catch (Exception e) {        throw new IllegalStateException("Cannot load keys from store: " + resource, e);    }}

这里使用了 Java Security API 来对key进行操作。参见注释。然后上边的信息通过 configserver 中的 bootstrap.xml 配置文件提供:

encrypt:  #key: Thisismysecretkey  key-store:    location: file://${user.home}/development/keys/server.jks    password: changeit    alias: config-server-key    secret: changeit

因为我们不能同时使用对称加密和非对称加密,所以我们把 encrypt.key 配置注释掉,然后指定非对称加密的参数:

  • location: Keystore 的文件路径
  • password: keystore 的密码
  • alias: key 的别名
  • secret: key的密码

测试

我们继续使用 encrypt API加密一项测试数据:

curl http://localhost:8888/encrypt -d 23456789

返回加密后的字符:

AQAPWOUOh5WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh37HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh3F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=

然后测试解密

curl http://localhost:8888/decrypt -d AQAPWOUOh5+bgtKc5E0d5Aba8VUKnzEXh37HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh3F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=

会返回

23456789

我们还可以修改web-client.yml来验证:

#test:  #password: '{cipher}94c1027141add9844ec47f0be13caebb6b38ed1dcf99811b1a5cd2b874c64407'user:  password: '{cipher}AQAPWOUOh5WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh37HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh3F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils='

注释掉 test.password,新增一个 user.password 使用加密后的配置值。然后提交的gitee仓库,通过 url 访问此配置文件:

http://localhost:8888/web-client/default

得到如下结果:

{    "name": "web-client",    "profiles": [        "default"    ],    "label": null,    "version": "3044a5345fb86d09a043ca7404b9e57c8c13c512",    "state": null,    "propertySources": [        {            "name": "https://gitee.com/zxuqian/spring-cloud-config-remote/web-client.yml",            "source": {                "message": "此条消息来自于远程配置仓库",                "management.endpoints.web.exposure.include": "*",                "user.password": "23456789"            }        }    ]}
加密 服务器 服务 配置 生成 文件 对称 密码 数据 测试 验证 信息 参数 客户 客户端 注释 算法 仓库 别名 名称 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖南永感互联网科技有限公司 高科技互联网 互联网 卓越科技 万易互联网科技有限公司 贷财互联网科技 融贸通互联网科技 齐家互联网科技有限公司 农村开互联网科技讲堂 上海宁丞科技互联网 青岛科技大学互联网大赛研究生 互联网科技产业特征 深圳育鹏互联网科技有限公司招聘 佛山市翊博互联网络科技有限公司 济南有互联网科技公司吗 怎样加入科技互联网 黑云互联网科技有限公司 九思连强互联网电子科技有限公司 长沙渺峰互联网科技有限公司 第三届互联网大会安防黑科技 互联网科技快速发展优美句子 互联网科技行业发展 互联网与科技金融数据 深圳科技互联网 狮子座互联网科技有限公司 伴你行互联网科技有限公司 互联网教育科技公司vipkid 青岛科技大学互联网大赛研究生 呼和浩特新华互联网科技学院 广州梦谷互联网科技有限公司领导 互联网科技接地气
0