为Java中的JWT正确生成证书

问题描述 投票:0回答:1

我正在尝试使用此处给出的简单示例:

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个回答
0
投票

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

readKeyAsBytes函数需要二进制数据。

DER代表杰出的编码规则;它是二进制格式。 PEM只是DER二进制数据的base64编码表示形式,其前有一个标头,后有一个页脚。但这不是ASCII文本,不是二进制。

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

PEM文件将如下所示:

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

祝你好运

© www.soinside.com 2019 - 2024. All rights reserved.