首页 > 编程知识 正文

springsecurity详解,feignclient调用第三方接口

时间:2023-05-04 19:33:10 阅读:135871 作者:4509

私钥和公钥的使用1、私钥1.1、密钥证书2的生成、公钥2.1、公钥3的导出、测试3.1、使用私钥生成JWT令牌3.2、使用公钥验证JWT令牌

Spring Security经常使用私钥/公钥对进行安全验证。 认证服务使用私钥文件生成JWT令牌,资源服务保存与私钥文件相对应的公钥文件。 如果您当前拥有用于访问资源服务资源的JWT令牌,则资源服务不需要向认证服务请求认证。 资源服务器本身使用公钥文件进行身份验证,减少了身份验证服务器的压力和响应时间。 简单介绍公钥和私钥的使用。

1、私钥

JWT令牌的生成采用了非对称加密算法,因此可以在认证服务器上维护私钥文件,并使用该私钥生成JWT。

1.1、生成密钥证书java提供用于管理证书的Keytool工具,并使用Keytool生成密钥文件。 如下所示。

在桌面上创建新文件夹JWT。 是空的。 访问此空文件,在当前目录中打开cmd窗口,然后执行以下命令:

keytool-genkey pair-aliasyczkey-keyalg RSA-keypassyanchengzhi-keystoreycz.keystore-storepassycz 123456参数如下

-alias :密钥的别名。 - keyalg :使用散列算法。 -keypass :密钥的访问密码。 -keystore :密钥库的文件名。 ycz.keystore保存生成的证书。 -storepass :密钥库的访问密码。 请注意,要区分密钥库的访问口令和密钥的访问口令。

按照提示完成输入,结果成功了。 请看一下JWT目录:

已生成私钥文件。 请确认内容。

在普通的文本工具中看不到。 可以使用以下命令查看证书信息:

keytool-list-keystoreycz.keystore

如果是证明书的内容的话,还是读不出来。 需要专业的工具。

2、公钥从私钥中提取,当时生成时已生成公钥/私钥对。 公钥文件可以位于资源服务器中,资源服务器本身可以验证JWT令牌的有效性。

2.1、导出公钥需要使用解密工具包。 这里使用openssl。 这是一个很好的解密工具包。 这个需要先下载。 安装完成后的目录如下。

无论是下载并安装了exe文件,还是解压并直接使用zip文件,都请确保上次环境变量设置成功。

否则就不能使用openssl的命令。 验证配置是否成功:

安装成功了。

然后,可以使用openssl解密私钥文件。 转到包含私钥的目录,在当前目录下打开cmd窗口,然后执行以下命令:

keytool-list-RFC---keystoreycz.keystore|OpenSSL x509-inform PEM-pubkey

用圆圈包围的是公钥的内容,是完全复制的:

粘贴到文本工具中,删除换行符,并将其组合为一行。

请不要自己添加或删除任何东西。 否则,最后公钥和私钥将不成对。 然后,保存为txt文件即可:

3、测试然后在程序中测试JWT令牌的生成以及公钥和私钥对。

3.1、使用私钥生成JWT令牌必须在引入了spring security依赖和oauth依赖的项目中进行测试。

首先放入私钥文件。

直接写在测试类上:

@ springboottest @ run with (spring runner.class ) publicclasstestmatch(/测试使用私钥文件生成JWT令牌@ test public void testgengent //密钥库密码string key _ store _ pass=' ycz 123456 '; //密钥库文件的位置classpathresourceresource=newclasspathresource (keystore ); //密钥库别名String alias='yczkey '; //密钥访问密码String key_pass='yanchengzhi '; //密钥工厂keystorekeyfactorykeyfactory=newkeystorekeyfactory (resource,key_store_pass.toCharArray ) ); //密钥对(私钥和公钥) key pair key pair=keyfactory.getkey pair (alias,key_pass.toCharArray ) ); //从密钥对获取私钥RSAP

rivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); //构建JWT令牌的内容 Map<String,Object> body = new HashMap<>(); body.put("name","yanchengzhi"); body.put("address","湖北"); body.put("age",25); body.put("state","single"); //map转成JSON串 String bodyString = JSON.toJSONString(body); //使用私钥生成JWT令牌 Jwt jwt = JwtHelper.encode(bodyString, new RsaSigner(privateKey)); //获取JWT令牌 String encode = jwt.getEncoded(); System.out.println(encode); }}

执行这个方法,控制台:

JWT令牌生成成功了。

3.2、使用公钥校验JWT令牌

先将公钥文件放进来:

我这里将公钥和私钥文件放在同一个工程下了,为了测试简单点吧,实际上用的时候私钥文件是存放在认证服务中的,公钥文件放在接入了SpringSecurity的资源服务中。

直接在TestMatch类中添加以下内容:

// 测试使用公钥校验JWT令牌 @Test public void testMatchJwt() { //jwt令牌,上面生成的直接复制过来 String jwtString = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoi5rmW5YyXIiwibmFtZSI6InlhbmNoZW5nemhpIiwic3RhdGUiOiJzaW5nbGUiLCJhZ2UiOjI1fQ.lr9qMMrs0YRN-T2TqBsAX3qoIxD6bHqRks6zk1LWwWORMlLQJb4t6RYXJK8fkKOimUPhFzzI828qc4UBsPrJetkT5NWtUFZjhFu-fhpqHgUqi1t_Q_BvJc1nHU5wbdupYxhCu8c8jJ89BB1xkrvaW4y5Queqe2vz2XbDdSDMKHqMKEjOCLCL-1xB8ixCpGRlwRkid5aXhuZu4tK9LTE7pVvX-dKnoElzqBadhD00W1utnietYt0k8Hz-bTDbnWaTjg2ln8-XGu3a2MGnqyPsL70PQmE62etaUj8Ax8yS1nr7AGlLUSShNkjasEDKEgispv8dnIcIMUiEzcDx3toyuw"; //公钥文件名称 String publicKeyName = "publickey.txt"; //获取公钥资源 ClassPathResource resource = new ClassPathResource(publicKeyName); try { //获取资源文件 File file = resource.getFile(); //字符输入流 Reader reader = new FileReader(file); char[] chs = new char[(int) file.length()]; //读取 int len = reader.read(chs); //获取公钥内容 String public_key = new String(chs,0,len); //校验JWT Jwt jwt = JwtHelper.decodeAndVerify(jwtString, new RsaVerifier(public_key)); //获取jwt令牌的内容 String claims = jwt.getClaims(); System.out.println(claims); //关闭流 reader.close(); } catch (IOException e) { e.printStackTrace(); } }

执行这个方法,控制台:

内容获取出来了,说明公钥校验JWT令牌成功,否则的话内容获取不出来,也间接说明公钥和私钥是匹配上的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。