使用 vertx 在 JWT 公钥/私钥身份验证中握手

Posted

技术标签:

【中文标题】使用 vertx 在 JWT 公钥/私钥身份验证中握手【英文标题】:Handshake in JWT public/private key authentication using vertx 【发布时间】:2019-08-12 22:09:54 【问题描述】:

我创建了一个小型 vertx 身份验证服务器,它使用公钥/私钥签名/生成 JWT 令牌。

        PrivateKey privateKey = CertUtil.getPrivateKey("config/private_key.der");
        PublicKey publicKey = CertUtil.getPublicKey("config/public_key.der");

        // Create a JWT Auth Provider
        JWTAuth jwt = JWTAuth.create(vertx, new JWTAuthOptions()
                .setPubSecKeys(List.of(new PubSecKeyOptions()
                        .setAlgorithm("RS256")
                        .setPublicKey(Base64.getEncoder().encodeToString(publicKey.getEncoded()))
                        .setSecretKey(Base64.getEncoder().encodeToString(privateKey.getEncoded())))));
        // protect the API
        router.route("/api/*").handler(JWTAuthHandler.create(jwt, "/api/new-token"));

        // this route is excluded from the auth handler
        router.get("/api/new-token").handler(ctx -> this.generateAndSendToken(ctx, jwt));

        // this is the secret API
        router.get("/api/protected").handler(ctx -> 
            ctx.response().putHeader("Content-Type", "text/plain");
            ctx.response().end("a secret you should keep for yourself...");
        );

        vertx.createHttpServer().requestHandler(router).listen(8080);

现在,当我从客户端访问 /api/new-token 时,我会从上面的身份验证服务器获得一个 JWT 令牌。但是我有一些悬而未决的问题:

auth-server 如何确保客户端拥有服务器公钥并且是真实的? 客户端如何将公钥发送到身份验证服务器? 如何使 /api/new-token 安全,以便只有合法客户端才能连接到它?

【问题讨论】:

【参考方案1】:

为什么不将此任务委托给KeyCloak 一个开源身份和访问管理。它将身份验证添加到您的应用程序中,并以最少的麻烦保护服务。

我们已经在我们的项目中使用了它并且效果很好!

要使用 Vert.x 插入它,您可以按照以下教程进行操作:

https://vertx.io/blog/vertx-3-and-keycloak-tutorial/ https://medium.com/@alexpitacci/vert-x-and-keycloak-working-together-9d459a5ebd9e http://paulbakker.io/java/jwt-keycloak-angular2/ https://piotrminkowski.wordpress.com/2017/09/15/building-secure-apis-with-vert-x-and-oauth2/

【讨论】:

以上是关于使用 vertx 在 JWT 公钥/私钥身份验证中握手的主要内容,如果未能解决你的问题,请参考以下文章

vertx 中的 JWT 身份验证引发未经授权的行为

在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名

SSH 使用公钥(不是私钥)进行身份验证

使用 JWT 进行身份验证时是不是可以消除私钥攻击向量?

如果有人得到我的私钥和公钥,JWT 会发生啥?

如何在 Java 中使用令牌和公钥验证 JWT 签名