LoginSignup
5
7

More than 3 years have passed since last update.

Javaで読み込みできる形式のecdsaのkey pairの作り方

Last updated at Posted at 2019-07-09

はじめに

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);

参考リンク

5
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7