当前位置: 首页 > 知识库问答 >
问题:

我们可以用java的keytool做任何事情吗。安全API,如KeyPairGenerator等

甘学潞
2023-03-14

我们可以用java的keytool做任何事情吗。安全API,如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个答案

蒋联
2023-03-14

大多数keytool(至少是我所知道的)操作都可以使用java重新创建。安全性* 类与一些传统的实用程序类,例如,要创建一对新的键,可以使用:

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

这是从KeyStore检索KeyPair的示例

这是一个(更详细的)示例,它不仅创建了KeyPair,还将其存储在文件中

您还可以将密钥对与过期时间戳一起序列化为SealedObject,以模拟有效性参数和密钥工具提供的存储

编辑:仅SealedObject不会为您提供有效性参数模拟,是与密钥对(在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加上一些实用程序类来实现keytools提供的一些功能

 类似资料:
  • 我想用自签名证书连接到TLS服务器,所以我需要一个自定义信任存储。似乎绝对需要密码才能导入证书,但我真的不需要密码保护信任存储区。使用标准密码“changeit”可以工作,但我更希望没有密码。 请注意,这是一个“信任存储”,而不是“密钥存储”,因此信任存储中根本没有秘密材料:只有服务器的证书,因此客户机可以验证服务器是可信的。 使用可以吗?是否有其他工具可以从信任存储区中移除密码?了解到身份验证信

  • 问题内容: 我知道jython允许我们从任何Java的类文件中调用Java方法,就好像它们是为python编写的一样,但是相反的可能吗? 我已经有很多用python编写的算法,它们在python和jython上都可以很好地工作,但是它们缺少适当的GUI。我计划将GUI与Jav​​a一起使用,并保持python库完整。我无法使用jython或python编写良好的GUI,也无法使用python编写良

  • 本文向大家介绍我们可以在Java中使用throw语句后编写任何代码吗?,包括了我们可以在Java中使用throw语句后编写任何代码吗?的使用技巧和注意事项,需要的朋友参考一下 不,我们不能在throw 语句后放置任何代码,这会导致编译时错误Unreachable Statement。 Java中的Throw关键字 的关键字throw用于手动抛出异常。 每当需要根据用户定义的逻辑错误或条件挂起功能执

  • 问题内容: 我们可以与一起使用其他任何TAG 吗? 喜欢 问题答案: 为了使您的代码有效,您不能在之外的标签中放置任何标签。 不过,您可以将任何块级元素放在中,如下所示:

  • 问题内容: 以下是有效的枚举声明。 但是我可以用枚举类型覆盖抽象类吗? SomeEnumClass.java OverrideingEnumClass.java 如果没有,为什么不呢?有什么好的选择? 问题答案: 不,你不能;枚举类型全部扩展,并且是隐式的。枚举可以实现接口,也可以直接在有关的枚举类上声明相关方法。 (我确实看到了您想要的基本概念,它是一个mixin;也许Java 8接口在这方面会

  • 请尽快为我提供一些有用的想法/解决方案。