我正在尝试使用此处给出的简单示例:
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);
不幸的是,获得公钥和私钥的密钥实例并不是那么简单。
openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out pkcs8.der -nocrypt
现在我可以将私钥加载为:
val privateKey = readKeyAsBytes("pkcs8.der")
.run { PKCS8EncodedKeySpec(this) }
.run { KeyFactory.getInstance("RSA").generatePrivate(this) }
as RSAPrivateKey
但是,这对于生成公共密钥不起作用:
val publicKey = readKeyAsBytes("publickey.crt")
.run { X509EncodedKeySpec(this) }
.run { KeyFactory.getInstance("RSA").generatePublic(this) }
as RSAPublicKey
因为它失败,并显示InvalidKeyException: invalid key format
。我不确定.getInstnace(RSA)
在这里是否正确,但是我也无法使其与其他任何功能一起使用。我猜公钥不是X509格式,但是我似乎无法设法将其转换为它。
您说您将私钥文件'private_key.pem'转换为DER格式,但是您也将公钥转换为DER格式。
readKeyAsBytes函数需要二进制数据。
DER代表杰出的编码规则;它是二进制格式。 PEM只是DER二进制数据的base64编码表示形式,其前有一个标头,后有一个页脚。但这不是ASCII文本,不是二进制。
如果您使用文本编辑器打开文件,则DER文件将是一堆疯狂的无法读取的东西。
PEM文件将如下所示:
-----BEGIN CERTIFICATE-----
MIIGuzCCBaOgAwIBAgIUT2q/veSq2N3hq+1QSqfrZo6SW8IwDQYJKoZIhvcNAQEL
...
Wu/svFTqcFBje8FiO98kFwJwSuajwt9l2mToy7W7PkQ+WARIOLR/7pcNh27O99Y=
-----END CERTIFICATE-----
祝你好运