最初的目标是:
生成一个https url,其中参数之一是PKCS7分离签名(RSA,SHA-256,UTF-8,BASE64)。
我有什么:
私钥(.key文件以“ ----- BEGIN RSA PRIVATE KEY -----”开头,
这样结束“ kIng0BFt5cjuur81oQqGJgvU + dC4vQio + hVc + eAQTGmNQJV56vAHcq4v
----- END RSA PRIVATE KEY -----“)
自签名证书(.cer文件以“ ----- BEGIN CERTIFICATE -----”开头,
像这样结束“ xwRtGsSkfOFL4ehKn / K7mgQEc1ZVPrxTC7C / g + 7grbKufvqNmsYW4w ==
----- END CERTIFICATE -----“)
要签名的数据
我找到了几乎可以满足我需要的Java代码。
方法签名:
public static String sign(PrivateKey privateKey,
X509Certificate certificate,
String data);
现在,我被困在如何从给定文件中获取PrivateKey和X509Certficiate类。
我看了很多例子,对这些时刻感到困惑:
1。
KeyStore ks = KeyStore.getInstance("pkcs12");
要么
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
找不到PKCS7标准的替代品。
使用bouncycastle库构建PrivateKey的方法的摘要:
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提供一些privateKeyPassword。该密码的目的是什么?我在哪里可以得到它?
从keyPair值中,我可以同时获得privateKey和publicKey。
PEMKeyPair的publicKey和我的证书之间有什么关系?他们是一样的吗?
任何帮助将不胜感激,谢谢!
最佳答案
您不需要bouncycastle即可读取公共密钥,因为Java的CertificateFactory直接支持.cer文件的格式。
私钥似乎是openssl可以产生的PKCS1格式。如果您希望保留该格式,this answer将显示如何提取私钥。将两者结合起来,这里是一个简短的片段,用于读取证书和私钥。
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");
}
}