JWT使用

263 阅读2分钟

生成私钥公钥

采⽤JWT私钥颁发令牌,公钥校验令牌,这⾥先使用keytool⼯具⽣成公钥私钥证书

⽣成密钥证书 下边命令⽣成密钥证书,采⽤RSA 算法每个证书包含公钥和私钥

创建⼀个⽂件夹,在该⽂件夹下执⾏如下命令⾏:

keytool -genkeypair -alias kaikeba -keyalg RSA -keypass kaikeba -keystore kaikeba.jks -storepass kaikeba

图片.png

Keytool 是⼀个java提供的证书管理⼯具

-alias:密钥的别名
-keyalg:使⽤的hash算法
-keypass:密钥的访问密码
-keystore:密钥库⽂件名
-storepass:密钥库的访问密码

查询证书信息

keytool -list -keystore kaikeba.jks

删除别名

keytool -delete -alias kaikeba -keystore kaikeba.jsk

导出公钥

openssl是⼀个加解密⼯具包,这⾥使⽤openssl来导出公钥信息。

安装 openssl:slproweb.com/products/Wi…

安装资料⽬录下的Win64OpenSSL-1_1_0g.exe

配置openssl的path环境变量,如下图:

图片.png

cmd进⼊kaikeba.jks⽂件所在⽬录执⾏如下命令(如下命令在windows下执⾏,会把-变成中⽂⽅式,请将它改成英⽂的-):

keytool -list -rfc --keystore kaikeba.jks | openssl x509 -inform pem -pubkey

图片.png

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAm

t47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnh

cP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEm

oLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/

iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZS

xtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv

9QIDAQAB

-----END PUBLIC KEY-----

将上边的公钥拷⻉到⽂本public.key⽂件中,放到资源服务器中。

JWT测试

pom.xml

引⼊oauth2依赖构件

<!--oauth2-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

kaikeba.jks

测试需要公钥和私钥,准备好

测试代码

public class JwtTest {
    //⽣成⼀个jwt令牌
    @Test
    public void testCreateJwt() throws Exception {
        //证书⽂件
        String key_location = "kaikeba.jks";
        //密钥库密码
        String keystore_password = "kaikeba";
        //访问证书路径
        ClassPathResource resource = new ClassPathResource(key_location);
        //密钥⼯⼚
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystore_password.toCharArray());

        //密钥的密码,此密码和别名要匹配
        String keypassword = "kaikeba";
        //密钥别名
        String alias = "kaikeba";
        //密钥对(密钥和公钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, keypassword.toCharArray());

        //私钥
        RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();
        //定义payload信息
        Map<String, Object> tokenMap = new HashMap<String, Object>();
        tokenMap.put("id", "123");
        tokenMap.put("name", "malong");
        tokenMap.put("roles", "r01,r02");
        tokenMap.put("ext", "1");
        //⽣成jwt令牌
        Jwt jwt = JwtHelper.encode(new ObjectMapper().writeValueAsString(tokenMap), new RsaSigner(aPrivate));

        //取出jwt令牌
        String token = jwt.getEncoded();
        System.out.println(token);
    }

    //资源服务使⽤公钥验证jwt的合法性,并对jwt解码
    @Test
    public void testVerify() {
        //jwt令牌
        String token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHQiOiIxIiwicm9sZXMiOiJyMDEscjAyIiwibmFtZSI6Im1hbG9uZyIsImlkIjoiMTIzIn0.B5H3JBVEl1Ntw_5mMqXGCDqDZn05IYYv8i Lex3xMpP6K7TlQ07W4zibgDSo5GwQbMblNL1hbS3vhbJRNg9XVuHYD - 6 VsmDO - muopPLZ70wS191jZg_LEKIV81GCcGfKsKYOqJ_B8tR7as7N4AFJnxYhFuppBK0TOnWqgIDH9s - Qa5y_h9fQHnB7qaKV3WJ7ks-- SkJUor5tzJTmmp74tFb - tAQE5lkq1oR068fNfTk8yL_6SaPqtFZIntCcZCQzXZCRzT6YaDOGXI9GciEjr6A5fg8V4Nk4xE 8 M1VE - 7 APDaYRU5HAB2XI5sb0bODsCJs6f2K1Q1N13Ff071vcZlzQ ";
        //公钥
        String publickey = "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtYpjt7NtpS1B51x6PUK7ryvKySK4V Qi7KUCGBm6kisErNM + FwdgKMbpQxTtWoYyXfQsWwuhBW45 + uF + Z5DUDaLtHlMV55eA5fkGLFZ1 F9ppZC + 2E tsy1CyPqA0Mx8R0 / HbMB1no4KTlQpqST7JjCdtwLWqUd68zDlfToIsWB1fHuYHbH / DCGUBmZb + 16805 / SjWkYvj3B6F + WJ8Gm47 / OJBH + wo7k4GWZ7OXdMcNnYWMyBfa4abjo7cxjoH L2fDanS6And4Sh3cZEJde4WgXsEktvR / EaZR7CeQzwzOg47 + 5 cCcFSYgmVfpDyLsBnFkG3WFs / qZ3yPzy + DQKLIF2wIDAQAB---- - END PUBLIC KEY -----";
        //校验jwt
        Jwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(publickey));

        //获取jwt原始内容
        String claims = jwt.getClaims();
        System.out.println(claims);
        try {
            Map<String, String> map = new ObjectMapper().readValue(claims, Map.class);
            System.out.println(map.get("user_name"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}