从 .key 和 .cer 文件中实例化 java.security 类 PrivateKey 和 X509Certif



最初的目标是:

生成一个 https 网址,其中一个参数是 PKCS7 分离签名(RSA、SHA-256、UTF-8、BASE64(。

我有什么:

  1. 私钥(.key 文件以"-----BEGIN RSA PRIVATE KEY-----"开头, 结束像这样 "kIng0BFt5cjuur81oQqGJgvU+dC4vQio+hVc+eAQTGmNQJV56vAHcq4v -----结束 RSA 私钥-----"(
  2. 自签名证书(.cer文件以"-----开始证书-----开头, 像这样结束 "xwRtGsSkfOFL4ehKn/K7mgQEc1ZVPrxTC7C/g+7grbKufvqNmsYW4w== -----结束证书-----"(
  3. 要签名的数据

我找到了一个Java代码,几乎可以满足我的需要。

方法签名:

public static String sign(PrivateKey privateKey,
X509Certificate certificate,
String data);

现在我被困在如何从给定文件中获取私钥和 X509Certficiate 类上。

我看了很多例子,对这些时刻感到困惑:

1.

KeyStore ks = KeyStore.getInstance("pkcs12");

PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);

没有找到 PKCS7 标准的替代方案。

  1. 使用bouncycastle库构建私钥的方法片段:

    inputStream = Files.newInputStream(privateKeyFile.toPath());
    reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
    pemParser = new PEMParser(reader);
    PEMDecryptorProvider decryptorProvider = new JcePEMDecryptorProviderBuilder()
    .setProvider(PROVIDER)
    .build(privateKeyPassword.toCharArray());
    PEMEncryptedKeyPair encryptedKeyPair = (PEMEncryptedKeyPair) pemParser.readObject();
    PEMKeyPair keyPair = encryptedKeyPair.decryptKeyPair(decryptorProvider);
    ...
    

在这个例子中,我必须向PEMDecryptorProvider提供一些私钥密码。这个密码有什么意义,我在哪里可以获得它?

从keyPair值中,我可以同时获得私钥和公钥。

来自PEMKeyPair的公钥和我的证书之间有什么联系?它们是一样的吗?

任何帮助将不胜感激,谢谢!

你不需要 bouncycastle 来读取公钥,因为 Java 的 CertificateFactory 直接支持你的.cer文件的格式。

私钥似乎是 openssl 可以生成的 PKCS1 格式。如果您希望保留该格式,此答案显示了如何提取私钥。将两者结合起来,下面是一个简短的代码片段,用于在证书和私钥中读取。

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
public class Main {
private static PrivateKey readPrivateKey(String filename) throws Exception {
PEMParser pemParser = new PEMParser(new FileReader(filename));
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject();
KeyPair kp = converter.getKeyPair(pemKeyPair);
return kp.getPrivate();
}
private static X509Certificate readCertificate(String filename) throws Exception {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
return (X509Certificate) certificateFactory.generateCertificate(new FileInputStream(filename));
}
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider());
PrivateKey privateKey = readPrivateKey("myKey.priv");
X509Certificate cert = readCertificate("mycert.cer");
}
}

最新更新