Spring Cloud Config RSA简介及使用RSA加密配置文件的方法
SpringCloud为开发人员提供了一系列的工具来快速构建分布式系统的通用模型。例如:配置管理、服务发现、断路由、智能路由、微代理、控制总线、一次性Token、全局锁、决策竞选、分布式session、集群状态等等。分布式系统的协助需要一大堆的模型,使用SpringCloud开发者能快速的建立支持实现这些模式的服务和应用程序。他们将适用于任何分布式环境,无论是开发者的个人电脑还是生产环境,还是云平台。
特性
SpringCloud专注于提供良好开箱即用的典型方案和可扩展方式。
- 分布式/版本化配置
- 服务注册/服务发现
- 路由
- 服务间调用
- 负载均衡
- 断路器
- 全局锁
- 领导选取和集群状态监控
- 分布式消息
简介
RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的。因为RSA算法会涉及PrivateKey和PublicKey分别用来加密和解密,所以称为非对称加密。PrivateKey和PublicKey有互操作性,即用privatekey加密的可以用publickey解密,用publickey加密的可以用privatekey解密。传统的单向认证则只用publickey进行加密,有privatekey的一方才可进行解密。例如,一个web服务器会有一对privatekey和publickey。浏览器客户端保存着服务器的publickey。当客户端需要向服务器发送数据时,就用服务器的publickey进行加密,然后服务器收到数据时,再用privatekey进行解密。客户端验证服务器是否为真实的服务器时,会根据服务器提供的publickey和自己本地保存的publickey作比较,一致的话才能验证服务器的真实性。
在我们的configserver中,一些对加密要求比较高的可以采用RSA算法进行数据的加密和解密。
项目源码
Gitee码云
生成测试Keystore
我们需要使用jdk自带的keytool工具生成一个keystore,里边保存了privatekey的信息,使用如下命令行:
keytool-genkeypair-aliasconfig-server-key-keyalgRSA-dname"CN=ConfigServer,OU=Xuqian,O=MyOwnCompany,L=Beijing,S=Beijing,C=CN"-keypasschangeit
-keystoreserver.jks-storepasschangeit
-genkeypair参数即产生一对publickey和privatekey。
-alias指定key的别名,用于区分同一keystore中不同的key。
-keyalg指定生成key的算法,这里使用默认的RSA
-dname指定commonname,即CN,用以验证key的身份。其中各项皆为自定义参数,OU为单位名称,O为组织名称,L为城市,S为省份/州,C为国家
-keypass为key的密码
-keystore为keystore的文件名
-storepass访问keystore的密码
上述工具将产生的privtekey保存在了名为server.jks的keystore中。到目前为止,我们只产生了privatekey,SpringCloudConfigServer会根据我们提供的key的信息,每次会用程序生成一个publickey,参考如下源代码
org.springframework.security.rsa.crypto.KeyStoreKeyFactory:
publicKeyPairgetKeyPair(Stringalias,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中取得privatekey RSAPrivateCrtKeykey=(RSAPrivateCrtKey)store.getKey(alias,password); //定义PublicKey生成规则 RSAPublicKeySpecspec=newRSAPublicKeySpec(key.getModulus(), key.getPublicExponent()); //生成PublicKey PublicKeypublicKey=KeyFactory.getInstance("RSA").generatePublic(spec); returnnewKeyPair(publicKey,key); } catch(Exceptione){ thrownewIllegalStateException("Cannotloadkeysfromstore:"+resource,e); } }
这里使用了JavaSecurityAPI来对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的密码
测试
我们继续使用encryptAPI加密一项测试数据:
curlhttp://localhost:8888/encrypt-d23456789
返回加密后的字符:
AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
然后测试解密
curlhttp://localhost:8888/decrypt-dAQAPWOUOh4+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
会返回
23456789
我们还可以修改web-client.yml来验证:
#test: #password:'{cipher}94c1027141add9844ec47f0be13caebb6b38ed1dcf99811b1a5cd2b874c64407' user: password:'{cipher}AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/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" } } ] }
总结
以上所述是小编给大家介绍的SpringCloudConfigRSA简介及使用RSA加密配置文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!