从.key和.cer文件实例化java.security类PrivateKey和X509Certificate
最初的目标是: 生成一个https url,其中一个参数是PKCS7分离签名(RSA、SHA-256、UTF-8、BASE64) 我有什么:从.key和.cer文件实例化java.security类PrivateKey和X509Certificate,java,encryption,bouncycastle,pkcs#7,Java,Encryption,Bouncycastle,Pkcs#7,最初的目标是: 生成一个https url,其中一个参数是PKCS7分离签名(RSA、SHA-256、UTF-8、BASE64) 我有什么: 私钥(.key文件以“----开始RSA私钥------”开头, 以“kIng0BFt5cjuur81oQqGJgvU+dC4vQio+hVc+eAQTGmNQJV56vAHcq4v”结尾 -----结束RSA私钥------”) 自签名证书(.cer文件以“-----开始证书------”开头, 以“xwrtgsskfolf4ehkn/K7mgQEc1Z
public static String sign(PrivateKey privateKey,
X509Certificate certificate,
String data);
现在我被困在如何从给定的文件中获取PrivateKey和X509Certficiate类的问题上
我看了很多例子,被这些时刻弄糊涂了:
一,
或
没有找到PKCS7标准的替代品
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);
...
任何帮助都将不胜感激,谢谢 您不需要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");
}
}
您不需要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");
}
}
尝试
Key-RSAKey=KeyFactory.getInstance(“RSA”)。generatePrivate(新的X509EncodedKeySpec(keyBytes))
@zhh:不能从X509EncodedKeySpec生成私钥。文件扩展名.key
和.cer
没有特别的意义。重要的是这些文件内容的格式,而不是文件扩展名本身。私钥加密了吗?它是base-64编码的吗?.key
文件的开头是否类似于----BEGIN
?.cer
文件也是这样开始的吗?@JamesKPolk,嘿!我更新了帖子,是的,私钥和证书是base-64编码的,两个都是从--BEGING开始的。@JamesKPolk:>>“私钥加密了吗?”我真的不知道。怎么弄清楚呢?我添加了密钥主体的最后一行。generatePrivate(新的X509EncodedKeySpec(keyBytes))@zhh:不能从X509EncodedKeySpec生成私钥。文件扩展名.key
和.cer
没有特别的意义。重要的是这些文件内容的格式,而不是文件扩展名本身。私钥加密了吗?它是base-64编码的吗?.key
文件的开头是否类似于----BEGIN
?.cer
文件也是这样开始的吗?@JamesKPolk,嘿!我更新了帖子,是的,私钥和证书是base-64编码的,两个都是从--BEGING开始的。@JamesKPolk:>>“私钥加密了吗?”我真的不知道。怎么弄清楚呢?我添加了钥匙主体的最后一行。
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");
}
}