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

从crt文件创建p12和密钥库

毕霖
2023-03-14

共有1个答案

於英朗
2023-03-14

您可以使用Java的keytool创建包含根CA的PKCS#12密钥存储库:

keytool -importcert -trustcacerts -keystore keystore.p12 -storetype pkcs12 \
  -alias root -file root.crt

系统将提示您输入一个密码,该密码将用于保护密钥存储的完整性,以便任何人都不能在未被检测到的情况下修改您的信任锚点。您可以使用另一个选项指定密码,但这很可能会在系统上留下密码的记录。

在这里,-trustcacerts表示您信任作为认证机构导入的证书。如果您漏掉了这个,证书就会显示出来,并且会提示您审核并接受它。

static void createTrustStore(Path certificate, Path keystore, char[] password)
        throws IOException, GeneralSecurityException {
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate root;
    try (InputStream is = Files.newInputStream(certificate)) {
        root = cf.generateCertificate(is);
    }
    KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
    pkcs12.load(null, null);
    pkcs12.setCertificateEntry("root", root);
    try (OutputStream os = Files.newOutputStream(keystore, StandardOpenOption.CREATE_NEW)) {
        pkcs12.store(os, password);
    }
}

private static final byte[] HEADER = "-----".getBytes(StandardCharsets.US_ASCII);

static void createIdentityStore(Path certificate, Path key, Path keystore, char[] password)
        throws IOException, GeneralSecurityException {
    byte[] pkcs8 = decode(Files.readAllBytes(key));
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PrivateKey pvt = kf.generatePrivate(new PKCS8EncodedKeySpec(pkcs8));
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate pub;
    try (InputStream is = Files.newInputStream(certificate)) {
        pub = cf.generateCertificate(is);
    }
    KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
    pkcs12.load(null, null);
    pkcs12.setKeyEntry("identity", pvt, password, new Certificate[] { pub });
    try (OutputStream s = Files.newOutputStream(keystore, StandardOpenOption.CREATE_NEW)) {
        pkcs12.store(s, password);
    }
}

private static byte[] decode(byte[] raw) {
    if (!Arrays.equals(Arrays.copyOfRange(raw, 0, HEADER.length), HEADER)) return raw;
    CharBuffer pem = StandardCharsets.US_ASCII.decode(ByteBuffer.wrap(raw));
    String[] lines = Pattern.compile("\\R").split(pem);
    String[] body = Arrays.copyOfRange(lines, 1, lines.length - 1);
    return Base64.getDecoder().decode(String.join("", body));
}
 类似资料:
  • 我想用Java创建一个密钥库文件(.jks)和一个自签名证书(.cer/.crt)。我正在用: 生成密钥存储: 关于我可能会出错的地方有什么建议吗?

  • 然后,为了生成CA要求的,我执行了以下操作: CA使用我存储在名为的文件中的证书进行响应 现在我想将必要的组件(私钥、公钥(?)和证书)捆绑到单个中。为此,我运行了以下操作: 但我收到以下错误消息: 我怎样才能完成这件事呢?

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

  • 我已经生成了RSA PRIVATE KEY。密钥和证书签名请求。CSR 然后我将这些文件加载到CA中,得到. CRT(DER)文件和Root_CA.CRT(PEM)文件 然后我转换。CRT(DER)使用RSA PRIVATE KEY。钥匙到。CRT(PEM) 我使用RSA PRIVATE KEY从. CRT(PEM)生成. pfx(PKCS#12)。钥匙 现在我丢失了RSA私钥。密钥和证书签名请求

  • 我正在尝试创建一个。p12不包含有效标识(公钥/私钥对)的文件,用于测试我的应用程序的证书导入功能。是否可以使用openssl工具执行此操作? 我已经试过了 但我有一个错误: 如果无法使用openssl进行此操作,是否可以使用其他工具?

  • 谁能告诉我从.p12文件中提取/转换证书.crt文件的正确方法/命令吗?在我搜查之后。我找到了将.pem转换为.crt的方法。但未找到.p12到.crt。