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

从.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

最初的目标是:

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

我有什么:

  • 私钥(.key文件以“----开始RSA私钥------”开头, 以“kIng0BFt5cjuur81oQqGJgvU+dC4vQio+hVc+eAQTGmNQJV56vAHcq4v”结尾 -----结束RSA私钥------”)
  • 自签名证书(.cer文件以“-----开始证书------”开头, 以“xwrtgsskfolf4ehkn/K7mgQEc1ZVPrxTC7C/g+7grbKufvqNmsYW4w”结尾== -----结束证书------)
  • 要签名的数据
  • 我找到了一个java代码,它几乎可以满足我的需要

    方法签名:

     public static String sign(PrivateKey privateKey,
                               X509Certificate certificate,
                               String data);
    
    现在我被困在如何从给定的文件中获取PrivateKey和X509Certficiate类的问题上

    我看了很多例子,被这些时刻弄糊涂了:

    一,

    没有找到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。这个密码的意义是什么?我在哪里可以得到它

    从密钥对值中,我可以同时获得privateKey和publicKey

    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");
        }
    }
    

    您不需要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");
        }
    }