ほとんどの操作keytool
(少なくとも私が知っている操作)はjava.security.*
、いくつかの追加のユーティリティクラスを持つクラスを使用して再作成できます。たとえば、使用できる新しいキーのペアを作成できます。
private static final String ALGORITHM = "RSA";
private static final String PROVIDER = "BC";
private PrivateKey privateKey;
private PublicKey publicKey;
...
public void generateNewKeyPair() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM, PROVIDER);
keyGen.initialize(2048, new SecureRandom());
KeyPair keypair = keyGen.genKeyPair();
privateKey = keypair.getPrivate();
publicKey = keypair.getPublic();
} catch (Exception e) {
LOG.error("Error creating keyPair", e);
}
}
これは、からを取得する例です。KeyPair
KeyStore
これは、を作成するだけでなく、ファイルに保存する(より詳細な)例です。KeyPair
KeyPair
有効期限のタイムスタンプと一緒にSealedObjectとしてシリアル化して、validity
パラメーターとによって提供されるストレージの両方をシミュレートすることもできます。keytool
編集: SealedObjectだけでは、パラメーターシミュレーションは提供されません。これは、有効期限(キーの有効性と見なすことができます)を「シミュレート」するキーペアvalidity
(内)と一緒に保存されるタイムスタンプです。SealedObject
例えば:
class KeyWithExpiration {
private PublicKey publicKey;
private Date expirationDate;
}
public static void serializeEncrypted(File file, Serializable instance) {
// With these lines, I hope to expose some of the craft that is needed to work with the API
PBEKeySpec keySpecObj = new PBEKeySpec(PASSWORD, SALT, ITERATIONS);
Cipher ecipherObj = Cipher.getInstance(keyObj.getAlgorithm());
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey keyObj = secretKeyFactory.generateSecret(keySpecObj);
SealedObject sealedObject = new SealedObject(instance, ecipherObj);
ObjectOutputStream objOutputStream = new ObjectOutputStream(new FileOutputStream(file));
objOutputStream.writeObject(sealedObject);
objOutputStream.close();
}
// Generate a new KeyWithExpiration
KeyWithExpiration key = new KeyWithExpiration(keyPair, DateUtil.future().days(365));
serializeEncrypted(new File(".key"), key);
そのため、APIといくつかのユーティリティクラスは、によって提供される機能の一部を実現するために必要です。keytool