如何将两个“.jceks”文件合并为一个?

Posted

技术标签:

【中文标题】如何将两个“.jceks”文件合并为一个?【英文标题】:How can I merge two ".jceks" file into one? 【发布时间】:2020-02-20 15:09:04 【问题描述】:

我有两个文件 kestore1.jcekskeystore2.jceks。 我想将它们合并并加载到 KeyStore 对象中。

KeyStore KEY_STORE = KeyStore.getInstance("JCEKS");

input1 = new FileInputStream("C:\\Users\\tushar.moradiya\\Desktop\\keystore\\keystore1.jceks");
KEY_STORE.load(input1, Constant.JCEKS_KEYSTORE_FILE_PASSWORD.toCharArray());

input2 = new FileInputStream("C:\\Users\\tushar.moradiya\\Desktop\\keystore\\keystore2.jceks");
KEY_STORE.load(input2, Constant.JCEKS_KEYSTORE_FILE_PASSWORD.toCharArray());

但它不起作用。它会覆盖对象中的最后一个文件。

【问题讨论】:

【参考方案1】:

您不能将它们读入一个对象,但您可以将它们读入两个对象,然后组合内容,至少在它们不冲突的地方:

    KeyStore ks1 = KeyStore.getInstance("jceks"), ks2 = KeyStore.getInstance("jceks");
    char[] pw = args[2].toCharArray(); KeyStore.PasswordProtection pp = new KeyStore.PasswordProtection (pw);
    try( InputStream is1 = new FileInputStream(args[0]) ) ks1.load(is1,pw); 
    try( InputStream is2 = new FileInputStream(args[1]) ) ks2.load(is2,pw); 
    for( Enumeration<String> aliases = ks2.aliases(); aliases.hasMoreElements(); )
        String alias = aliases.nextElement();
        if( ks1.containsAlias(alias) ) /* conflicting entry -- what to do? */ 
        ks1.setEntry(alias,  ks2.getEntry(alias, pp), pp);
        // could check type (or other details) before deciding whether to include
    

您也可以使用keytool -importkeystore 将它们组合成一个文件(它们会在该单个文件中读取),但这不是编程解决方案,因此偏离主题,或者至少是边界。

【讨论】:

【参考方案2】:

还有其他方法可以做到这一点,使用keytool 命令行实用程序。如果这将是一次性的事情,我建议使用 keytool。但如果这将成为您的业务逻辑,那么您可以这样做:

    KeyStore first = KeyStore.getInstance("JCEKS");
    first.load(new FileInputStream(new File("first.jceks")), "password".toCharArray());

    KeyStore second = KeyStore.getInstance("JCEKS");
    second.load(new FileInputStream(new File("second.jceks")), "password".toCharArray());

    Enumeration<String> aliases = first.aliases();

    while (aliases.hasMoreElements())
    
        String alias = aliases.nextElement();
        System.out.println(alias);

        KeyStore.Entry entry = null;
        try
        
            entry = first.getEntry(alias, new KeyStore.PasswordProtection("password".toCharArray()));
        
        catch (UnsupportedOperationException e)
        
            entry = first.getEntry(alias, null);
        

        if (entry instanceof TrustedCertificateEntry)
        
            second.setCertificateEntry(alias, ((TrustedCertificateEntry) entry).getTrustedCertificate());
        
        else
        
            second.setEntry(alias, entry, new KeyStore.PasswordProtection("password".toCharArray()));
        
    

    second.store(new FileOutputStream(new File("second.jceks")), "password".toCharArray());

这会将所有第一个密钥库条目复制到第二个密钥库中。

P.S:保留原始密钥库的副本。

【讨论】:

【参考方案3】:

您可以使用this command-line tool 将 JCEKS 密钥库条目从一个密钥库复制到另一个。

【讨论】:

以上是关于如何将两个“.jceks”文件合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个 wav 文件合并/合并为一个 wav 文件?

如何将两个音频文件合并为一个并在javascript中合并后播放

如何将两个 mp3 文件合并为一个(合并/加入)

如何将两个pdf文件合并成一个

无论如何将两个gcov文件合并为一个

Perl如何将两个或多个excel文件合并为一个(多个工作表)?