阅读CA Cert私钥以签署证书

时间:2015-12-11 01:33:00

标签: java security ssl x509certificate

我有以下要求:

  1. 创建自签名(例如CA证书)并保存证书和私钥 到文件
  2. 加载CA证书(在步骤1中创建)及其私钥
  3. 创建一个结束 使用CA Cert和私钥加载签名的证书 第2步
  4. 我的私钥存储在如下文件中:

    public static void writePrivateKey(PrivateKey privateKey, OutputStream os) throws IOException
      {
        BufferedOutputStream bos = new BufferedOutputStream(os);
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
                privateKey.getEncoded());
        bos.write(pkcs8EncodedKeySpec.getEncoded());
        bos.close();
      }
    

    我的私钥按如下方式加载:

     public PrivateKey loadPrivatekey(InputStream privateKeyInputStream)
              throws InvalidKeySpecException, NoSuchAlgorithmException, IOException
      {
        return KeyFactory.getInstance(algorithamForCreatingAndLoadingKeys)
                .generatePrivate(new PKCS8EncodedKeySpec(IOUtils.toByteArray(privateKeyInputStream)));
      }
    

    我的算法定义为RSA

     private String algorithamForCreatingAndLoadingKeys = "RSA";
    

    我签署我的证书如下:

     private static X509CertImpl buildAndSignCert(X509CertInfo certInfo, PrivateKey privateKey)
              throws CertificateException, NoSuchAlgorithmException, InvalidKeyException,
              NoSuchProviderException, SignatureException, IOException
      {
        X509CertImpl cert = new X509CertImpl(certInfo);
        String algorithm = "SHA1withRSA";
        // Sign the cert to identify the algorithm that's used.
        cert.sign(privateKey, algorithm);
        // Update the algorith, and resign.
        certInfo.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM,
                cert.get(X509CertImpl.SIG_ALG));
        X509CertImpl newCert = new X509CertImpl(certInfo);
        newCert.sign(privateKey, algorithm);
        return newCert;
      } 
    

    问题:如果我创建CA证书并结束证书而不保存并加载密钥文件,我能够正确验证结束证书:

      

    C:\ Workspace ..... \ src \ main \ resources> openssl verify -CAfile ca.pem end.pem

         

    end.pem:好的

    但是,如果我保存并加载密钥文件并进行验证,我会收到以下错误,这清楚地表明我的结束证书未通过我的证书签名正确

      

    C:\ Workspace ..... \ src \ main \ resources> openssl verify -CAfile ca.pem   end.pem

         

    end.pem:C = AU,L = ABC,CN = XYZ

         

    错误20在0深度查找:无法获得本地颁发者证书

    因此,Iam得出结论,我保存私钥并加载它是错误的。

    任何一个请求都能帮助我在保存和阅读私钥方面做错吗?

    非常感谢提前。

1 个答案:

答案 0 :(得分:0)

我在上面发布的所有代码都是正确且准确的,可以创建和阅读私钥文件

我发现加载Created CA Cert本身(不是私钥)的问题,以及我们如何生成X509证书的方法如下:

CertificateFactory f = CertificateFactory.getInstance("X.509");
    X509Certificate loadedCaCert = (X509Certificate) f
            .generateCertificate(CertificateGenerator.class.getResourceAsStream("/ca.pem"));

上面生成的X509Certificate所产生的序列号与我在创建CA certtificate时所传递的序列号不同(这是另一个问题,但无论如何都未通过该线程)并且我们将此序列号传递给订阅者用于标识其父CA的证书,用于链接其失败的证书。

谢谢