我们可以使用keytool和Java.security apis(如KeyPairGenerator等)执行任何操作

时间:2012-11-14 21:57:39

标签: java security api keytool

我们可以使用keytool和Java.security apis(如KeyPairGenerator等)执行任何操作。

我有兴趣以特定的有效期扩展证书。

例如,可以使用Java安全API

完成以下命令
  

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

我想只使用java核心安全API而不对第三方API感兴趣

1 个答案:

答案 0 :(得分:0)

keytool(至少那些我认识的)可以使用java.security.*类和一些aditional实用程序类重新创建大多数操作,例如,创建一对可以使用的新键:

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

example of retrievingKeyStore

这是一个(更详细的)example,它不仅会创建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

提供的某些功能