3.6.3 JWT入门 Spring Security 提供对JWT的支持,本节我们使用Spring Security 提供的JwtHelper来创建JWT令牌,校验JWT令牌 等操作。 3.6.3.1 生成私钥和公钥 JWT令牌生成采用非对称加密算法 1、生成密钥证书 下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥 keytool -genkeypair -alias xckey -keyalg RSA -keypass xuecheng -keystore xc.keystore -storepass xuechengkeystore Keytool 是一个java提供的证书管理工具 -alias:密钥的别名 -keyalg:使用的hash算法 -keypass:密钥的访问密码 -keystore:密钥库文件名,xc.keystore保存了生成的证书 -storepass:密钥库的访问密码
查询证书信息: keytool -list -keystore xc.keystore
删除别名 keytool -delete -alias xckey -keystore xc.keystore
2、导出公钥 openssl是一个加解密工具包,这里使用openssl来导出公钥信息。 安装 openssl:http://slproweb.com/products/Win32OpenSSL.html 安装资料目录下的Win64OpenSSL-1_1_0g.exe 配置openssl的path环境变量,本教程配置在D:\OpenSSL-Win64\bin cmd进入xc.keystore文件所在目录执行如下命令: [mw_shl_code=applescript,true]keytool ‐list ‐rfc ‐‐keystore xc.keystore | openssl x509 ‐inform pem ‐pubkey [/mw_shl_code] 输入密钥库密码: 下边这一段就是公钥内容: -----BEGIN PUBLIC KEY----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAijyxMdq4S6L1Af1rtB8SjCZHNgsQG8JTfGy55eYvzG0B /E4AudR2prSRBvF7NYPL47scRCNPgLnvbQczBHbBug6uOr78qnWsYxHlW6Aa5dI5NsmOD4DLtSw8eX0hFyK5F j6ScYOSFBz9cd1nNTvx2+oIv0lJDcpQdQhsfgsEr1ntvWterZt/8r7xNN83gHYuZ6TM5MYvjQNBc5qC7Krs9wM7U oQuL+s0X6RlOib7/mcLn/lFLsLDdYQAZkSDx/6+t+1oHdMarChIPYT1sx9Dwj2j2mvFNDTKKKKAq0cv14Vrhz67Vj mz2yMJePDqUi0JYS2r0iIo7n8vN7s83v5uOQIDAQAB-----END PUBLIC KEY---- 将上边的公钥拷贝到文本文件中,合并为一行。 3.6.3.2 生成jwt令牌 在认证工程创建测试类,测试jwt令牌的生成与验证。


[mw_shl_code=applescript,true]//生成一个jwt令牌 @Test public void testCreateJwt(){    
//证书文件  
   String key_location = "xc.keystore";    
//密钥库密码  
   String keystore_password = "xuechengkeystore";    
//访问证书路径   
  ClassPathResource resource = new ClassPathResource(key_location);  
   //密钥工厂  
   KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,  keystore_password.toCharArray());
    //密钥的密码,此密码和别名要匹配
String keypassword = "xuecheng";   
  //密钥别名    
String alias = "xckey";  
   //密钥对(密钥和公钥)   
  KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypassword.toCharArray());   
  //私钥  
   RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();  
   //定义payload信息     Map<String, Object> tokenMap = new HashMap<>();  
   tokenMap.put("id", "123");   
  tokenMap.put("name", "mrt");  
   tokenMap.put("roles", "r01,r02");    
tokenMap.put("ext", "1");   
  //生成jwt令牌   
  Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(aPrivate));   
  //取出jwt令牌    
String token = jwt.getEncoded();  
   System.out.println("token="+token);   }  
[/mw_shl_code]