【问题标题】:Correctly generating certificates for JWT in Java在 Java 中为 JWT 正确生成证书
【发布时间】:2020-04-24 01:25:44
【问题描述】:

我正在尝试使用这里给出的简单示例:

https://github.com/auth0/java-jwt

//HMAC
Algorithm algorithmHS = Algorithm.HMAC256("secret");

//RSA
RSAPublicKey publicKey = //Get the key instance
RSAPrivateKey privateKey = //Get the key instance
Algorithm algorithmRS = Algorithm.RSA256(publicKey, privateKey);

不幸的是,获取公钥和私钥的密钥实例并不是那么简单。

  1. 我关注How to create public and private key with openssl?生成公钥和私钥。
  2. 我将私钥转换为 DER 形式 openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out pkcs8.der -nocrypt
  3. 现在我可以将私钥加载为:

    val privateKey = readKeyAsBytes("pkcs8.der")
            .run { PKCS8EncodedKeySpec(this) }
            .run { KeyFactory.getInstance("RSA").generatePrivate(this) }
            as RSAPrivateKey
    
  4. 但是这对生成公钥不起作用:

    val publicKey = readKeyAsBytes("publickey.crt")
            .run { X509EncodedKeySpec(this) }
            .run { KeyFactory.getInstance("RSA").generatePublic(this) }
            as RSAPublicKey
    

因为 InvalidKeyException: invalid key format 失败。我不确定.getInstnace(RSA) 在这里是否正确,但我也无法让它与其他任何东西一起使用。我猜公钥不是 X509 格式,但我似乎无法将其转换为它。

【问题讨论】:

    标签: openssl jwt rsa x509 jwt-auth


    【解决方案1】:

    您说您将私钥文件“private_key.pem”转换为 DER 格式,但您是否也将公钥转换为 DER 格式。

    readKeyAsBytes 函数需要二进制数据。

    DER 代表 Distinguished encoding rules;它是一种二进制格式。 PEM 只是 DER 二进制数据的 base64 编码表示,前面有一个标题,后面有一个页脚。但它是 ascii 文本而不是二进制。

    如果您使用文本编辑器打开文件,DER 文件将是一堆疯狂的不可读的东西。

    PEM 文件如下所示:

    -----BEGIN CERTIFICATE----- 
    MIIGuzCCBaOgAwIBAgIUT2q/veSq2N3hq+1QSqfrZo6SW8IwDQYJKoZIhvcNAQEL 
    ...
    Wu/svFTqcFBje8FiO98kFwJwSuajwt9l2mToy7W7PkQ+WARIOLR/7pcNh27O99Y=
    -----END CERTIFICATE-----
    

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 2016-07-31
      • 1970-01-01
      • 2019-04-12
      • 2018-06-03
      • 2011-10-18
      相关资源
      最近更新 更多