【问题标题】:Quarkus MP-JWT: how to generate the key pair?Quarkus MP-JWT:如何生成密钥对?
【发布时间】:2021-01-06 07:04:11
【问题描述】:

我正在尝试解决此处介绍的 RBAC 授权示例:https://quarkus.io/guides/security-jwt#generate-jwt-tokens。 GenerateToken 类的代码与示例中的代码几乎相同,我只是删除了声明:

public class GenerateToken
{
  public static void main(String[] args)
  {
    String token = Jwt.issuer("CN=me, OU=quarkus, O=quarkus, C=FR").upn("me").groups(new HashSet<>(Arrays.asList("User", "Admin"))).sign();
    log.info (">>> GenerateToken.main(): Token is {}", token);
  }
}

现在我需要生成私钥和公钥 .pem 文件。我写了以下脚本:

keytool -genkey -keyalg RSA -keystore ./jks/selfsigned.jks -keysize 2048 -dname "CN=me,OU=quarkus,O=quarkus,C=FR" 
keytool -exportcert -keystore ./jks/selfsigned.jks -rfc -file src/main/resources/META-INF/resources/public-key.pem
keytool -importkeystore -srckeystore ./jks/selfsigned.jks -destkeystore ./jks/selfsigned.p12 -srcstoretype jks -deststoretype pkcs12 
openssl pkcs12 -in ./jks/selfsigned.p12 -nodes -nocerts -out src/test/resources/private-key.pem

据我所知,private-key.pem 和 public-key.pem 文件生成正确。但是运行 GenerateToken 类会引发以下异常:

mvn exec:java -Dexec.classpathScope=test -Dsmallrye.jwt.sign.key-location=private-key.pem
[INFO] Scanning for projects...
... 
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ eclipse-microprofile ---
[WARNING] 
java.lang.NullPointerException
    at io.smallrye.jwt.build.impl.JwtSignatureImpl.keyAlgorithm (JwtSignatureImpl.java:186)
    at io.smallrye.jwt.build.impl.JwtSignatureImpl.signInternal (JwtSignatureImpl.java:150)
    at io.smallrye.jwt.build.impl.JwtSignatureImpl.sign (JwtSignatureImpl.java:72)
    at ... GenerateToken.main (GenerateToken.java:14)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:282)
    at java.lang.Thread.run (Thread.java:834)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.572 s
[INFO] Finished at: 2020-09-19T18:10:50+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:java (default-cli) on project eclipse-microprofile: An exception occured while executing the Java class. null: NullPointerException -> [Help 1]

使用提供的 publicKey.pem 和 privateKey.pem 运行原始示例,当然可以正常工作。我在这里做错了什么?

非常感谢。

西摩玻璃

【问题讨论】:

    标签: keytool quarkus jwt-auth


    【解决方案1】:

    我正在回答我自己的问题。由于某种原因,keytool 似乎不适用于 MP-JWT,但 openssl 可以。因此,下面的命令将按预期工作,而不是上面的脚本:

    openssl req -x509 -newkey rsa:2048 -nodes -keyout src/test/resources/private-key.pem -out src/main/resources/META-INF/resources/public-key.pem -days 365 -subj "/C=FR/O=quarkus/CN=me"
    

    这将创建一个新的自签名证书并在文件 src/main/resources/META-INF/resources/public-key.pem 中提取其公钥,并在 src/test/resources/private- 中提取私有密钥密钥.pem。现在,运行 mvn exec:java 就可以了:

    mvn exec:java -Dexec.mainClass=org.acme.security.jwt.GenerateToken -Dexec.classpathScope=test -Dsmallrye.jwt.sign.key-location=private-key.pem
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] ----< fr.simplex-software.aws.lambda.quarkus:eclipse-microprofile  >-----
    [INFO] Building eclipse-microprofile 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar   ]---------------------------------
    [INFO] 
    [INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ eclipse-microprofile ---
    sept. 21, 2020 5:10:24 PM fr.simplex_software.aws.lambda.quarkus.GenerateToken  main
    INFO: >>> GenerateToken.main(): Token is eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJDTj1uZHVtaW5pbCwgTz1TaW1wbGV4U29mdHdhcmUsIEM9RlIiLCJ1cG4iOiJuZHVtaW5pbCIsImdyb3VwcyI6WyJVc2VyIiwiQWRtaW4iXSwiaWF0IjoxNjAwNzAxMDIzLCJleHAiOjE2MDA3MDEzMjMsImp0aSI6Ik91U0kzM19PSVVYbkJCLWpkTjZyUmcifQ.L1RbrJ89nbaE2_xfiDaaVZ5Y00n8U3W5SFUhuwb6sgFaSXExFhziPYjhsqTZO5Rv0DRiz48GkmveP70c5EShS4gNuq8fw1ifvzUF4001oY4Pkgs-ZDZyTmjgWr9GElVr0nOGBhFE9qLMbCF9YcJt-dUgq0JzK93gj3BKi9wWpzFSPRdIZn9f6Xs-FPL7TyNwoHYEm4UYHY5AdxE4lsw0BbGCIgUUKZEO8iFsuOiEUvgosYiIwGdPC-16kOC-xINq2ObzPdHOZixEZGh9xb3tYFALxfxKX8UznckiMbXwc36qQ6WorJA1mPPuyMCKjE310rZzSx9fDiaO0-wGDAkq0A
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.768 s
    [INFO] Finished at: 2020-09-21T17:10:24+02:00
    [INFO] ------------------------------------------------------------------------
    

    【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2017-10-15
    • 2017-07-30
    • 2017-11-05
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多