はじめに
JWTなどで、サーバ上にある公開鍵・秘密鍵を使って署名・検証したいケースがあります。
JWTのライブラリ側で、キーペア作るメソッドを提供していると思いますが、それを使った場合、アプリを起動をする度にキーペアが生成されます。起動のたびに、直前に発行したJWTを無効にできない場合は、固定のキーペアを使うことになります。
このごろは、RSAよりECDSAの方が、小さいサイズで同程度の暗号の強度が得られることから、使われるケースが増えてるようです。
keyの作成
pem形式で作成します。
openssl ecparam -genkey -name secp256k1 -out key-pair.pem
openssl pkcs8 -topk8 -inform pem -in key-pair.pem -outform pem -nocrypt -out private.pem
openssl ec -in key-pair.pem -pubout -outform pem -out public.pem
private key
private keyは
-
-----BEGIN PRIVATE KEY-----
、-----END PRIVATE KEY-----
と改行コード をtrim - Base64でdecode
- PKCS8EncodedKeySpec を生成
- KeyFactoryでアルゴリズム指定して生成
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
String privatePem = new String(Files.readAllBytes(path))
.replaceAll("\\r\\n", "")
.replaceAll("\\n", "")
.replaceAll("-----BEGIN PRIVATE KEY-----", "")
.replaceAll("-----END PRIVATE KEY-----", "");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privatePem));
PrivateKey privateKey = KeyFactory.getInstance("EC").generatePrivate(keySpec);
public key
-
-----BEGIN PUBLIC KEY-----
、-----END PUBLIC KEY-----
と改行コード をtrim - Base64でdecode
- X509EncodedKeySpecを生成
- KeyFactoryでアルゴリズム指定して生成
String publicPem = new String(Files.readAllBytes(jwtSettings.getPublicKeyAsPath()))
.replaceAll("\\r\\n", "")
.replaceAll("\\n", "")
.replaceAll("-----BEGIN PUBLIC KEY-----", "")
.replaceAll("-----END PUBLIC KEY-----", "");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicPem));
PublicKey publicKey = KeyFactory.getInstance(jwtSettings.getAlgorithm()).generatePublic(keySpec);
参考リンク
- https://stackoverflow.com/questions/11410770/load-rsa-public-key-from-file
- https://metamug.com/article/security/sign-verify-digital-signature-ecdsa-java.html
- https://howtodoinjava.com/java/io/java-read-file-to-string-examples/
- https://howtodoinjava.com/java11/files-readstring-read-file-to-string/
- http://blog.livedoor.jp/k_urushima/archives/1721840.html
- https://qiita.com/wnoguchi/items/a72a042bb8159c35d056
- https://jwt.io/
- https://qiita.com/TakahikoKawasaki/items/4c35ac38c52978805c69