最初的目标是:
生成一个 https 网址,其中一个参数是 PKCS7 分离签名(RSA、SHA-256、UTF-8、BASE64(。
我有什么:
- 私钥(.key 文件以"-----BEGIN RSA PRIVATE KEY-----"开头, 结束像这样 "kIng0BFt5cjuur81oQqGJgvU+dC4vQio+hVc+eAQTGmNQJV56vAHcq4v -----结束 RSA 私钥-----"(
- 自签名证书(.cer文件以"-----开始证书-----开头, 像这样结束 "xwRtGsSkfOFL4ehKn/K7mgQEc1ZVPrxTC7C/g+7grbKufvqNmsYW4w== -----结束证书-----"(
- 要签名的数据
我找到了一个Java代码,几乎可以满足我的需要。
方法签名:
public static String sign(PrivateKey privateKey,
X509Certificate certificate,
String data);
现在我被困在如何从给定文件中获取私钥和 X509Certficiate 类上。
我看了很多例子,对这些时刻感到困惑:
1.
KeyStore ks = KeyStore.getInstance("pkcs12");
或
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
没有找到 PKCS7 标准的替代方案。
使用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");
}
}