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

用Java创建密钥库文件(.jks)和自签名证书(.cer/.crt)

唐弘和
2023-03-14

我想用Java创建一个密钥库文件(.jks)和一个自签名证书(.cer/.crt)。我正在用:

生成密钥存储:

protected void getKeyStore(X509Certificate certificate)
{
    File newSnKeyStoreFile = new File("Mypath..\\keyStore.jks");

    try {

        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(null, null);

        if(!certificate.toString().isEmpty())
        {
            keyStore.store(new FileOutputStream(newSnKeyStoreFile), "password".toCharArray());
            if (keyStore.getCertificateAlias(certificate) == null) {
                keyStore.setCertificateEntry("cert"+ count++, certificate);
            }
        }
        keyStore.store(new FileOutputStream(newSnKeyStoreFile), KEYSTORE_PASSWORD.toCharArray());

        // Write to .jks file
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new FileWriter(newSnKeyStoreFile));
            out.write(keyStore.toString());
        } catch ( Exception e ) {
            e.printStackTrace();
        } finally {
            if ( out != null ) out.close();
        }
    }catch(Exception ke){
        System.out.print("Error occurred while setting up keyStore: " + ke.getMessage());
    }
}
protected X509Certificate genCertificate()
{
    try {
        //Generate self signed certificate
        CertAndKeyGen gen = new CertAndKeyGen("RSA", "SHA1WithRSA")
        gen.generate(1024);
        X509Certificate cert = gen.getSelfCertificate(new X500Name("CN=ROOT"), (long) 365 * 24 * 3600);

        File certFile = new File("Mypath..\\Cert.cer");
        // Write to .cer file
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new FileWriter(certFile));
            out.write(certificate.getEncoded().toString());
        } catch ( Exception e ) {
            e.printStackTrace();
        } finally {
            if ( out != null ) out.close();
        }
        return cert;

    }catch (Exception e) {
        System.out.println("Error : " + e.getMessage());
    }
    return null;
}
keytool error: java.io.IOException: Invalid keystore format
keytool error: java.lang.Exception: Empty input
java.lang.Exception: Empty input
        at sun.security.tools.KeyTool.printCertFromStream(KeyTool.java:2234)
        at sun.security.tools.KeyTool.doPrintCert(KeyTool.java:2423)
        at sun.security.tools.KeyTool.doCommands(KeyTool.java:1069)
        at sun.security.tools.KeyTool.run(KeyTool.java:340)
        at sun.security.tools.KeyTool.main(KeyTool.java:333)

关于我可能会出错的地方有什么建议吗?

共有1个答案

廖招
2023-03-14
protected void getKeyStore(X509Certificate certificate)
{
    File newSnKeyStoreFile = new File("Mypath..\\keyStore.jks");

    try {

        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(null, null);

        if(!certificate.toString().isEmpty())

这个测试毫无意义。如果您有一个证书,它的字符串表示形式将不会为空。如果没有,则根本不应该调用此方法。移除。

        {
            keyStore.store(new FileOutputStream(newSnKeyStoreFile), "password".toCharArray());

为什么?里面还什么都没有。移除。

            if (keyStore.getCertificateAlias(certificate) == null) {
                keyStore.setCertificateEntry("cert"+ count++, certificate);

如果它不是null,则应该覆盖该条目或者抛出异常,而不是静静地忽略该条件。

            }
        }
        keyStore.store(new FileOutputStream(newSnKeyStoreFile), KEYSTORE_PASSWORD.toCharArray());
        // Write to .jks file
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new FileWriter(newSnKeyStoreFile));
            out.write(keyStore.toString());
        } catch ( Exception e ) {
            e.printStackTrace();
        } finally {
            if ( out != null ) out.close();
        }
   File certFile = new File("Mypath..\\Cert.cer");
    // Write to .cer file
    BufferedWriter out = null;
    try {
        out = new BufferedWriter(new FileWriter(certFile));
        out.write(certificate.getEncoded().toString());
out.write(certificate.getEncoded());

你似乎有把东西转换成字符串的狂热。尽量变细。

 类似资料:
  • 我只使用自签名证书进行测试。 问题: Q1.我想知道为什么我需要在步骤6中将服务器和客户端自己的证书添加到各自的信任库中。 2.创建x509证书 openssl req-x509-new-nodes-key diagserverca.key-sha256-days 1024-out diagserverca.pem 3.从私钥和公共证书创建PKCS12密钥存储库。 keytool-importke

  • 我试图签署一个Android应用程序,但显然原始的keystore文件是不可用的。我所得到的只有以下几点: 私钥md5 0123456789abcdef0123456789abcdef<--虚构值,但 证书md5 fedcba9876543210fedcba9876543210<-原始为32个十六进制数字 已签署的生产Android应用程序 是否有任何方法可以从这些资产中重新创建一个keystor

  • 我是新来配置Jetty服务器的SSL。我按照digcert的步骤创建了私钥文件、证书请求CSR文件。 我向CA发送了证书请求,并拿回了我签名的CSR。但是CA给我发了一个有两个证书的捆绑包,一个是我的证书,由CA签名,第二个是CA证书。(1star_xyx_abc_comcrt文件,2.CRT文件)。现在我面临着从这些文件创建密钥库的麻烦。 当我按照Oracle文档的步骤4、5和6使用keytoo

  • 看看PayPal(https://www.PayPal.com/)的安全证书。它说:连接加密:高级加密(TLS_RSA_WITH_AES_256_CBC_SHA,256位密钥)。 现在,我如何创建自己签名的证书,使其具有相同的加密,AES256? 我在OpenSSL中尝试了以下代码: 最后我得到了128位证书。然后我试着: 即使我指定了'-aes256',我最终还是得到了128位证书:连接加密:高

  • 问题内容: 在Java Web服务客户端的开发过程中,我遇到了一个问题。Web服务的身份验证使用客户端证书,用户名和密码。我从Web服务背后的公司那里收到的客户证书采用格式。当我使用文本编辑器检查文件时,它具有以下内容: 我可以在Internet Explorer中将该文件作为证书导入(无需输入密码!),并使用它通过Web服务进行身份验证。 通过首先剥离第一行和最后一行,转换为换行符并运行base

  • 问题内容: 我的Java程序如何知道包含证书的密钥库在哪里?或者,如何告诉我的Java程序在哪里寻找密钥库? 在以某种方式指定了密钥库之后,如何指定用于对服务器进行身份验证的证书? 问题答案: