2

KeyPairGeneratorなどのjava.securityAPIでkeytoolを使用して行うことは何でもできますか?

特定の有効性で証明書を拡張することに興味があります。

たとえば、JavaセキュリティAPIを使用して次のコマンドを実行できますか

keytool -genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype}

JavaコアセキュリティAPIのみを使用し、サードパーティのAPIには興味がない

4

1 に答える 1

1

ほとんどの操作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);
    }
}

これは、からを取得する例です。KeyPairKeyStore

これは、を作成するだけでなく、ファイルに保存する(より詳細な)例です。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

于 2012-11-14T22:22:42.947 に答える