使用BouncyCastle创建密钥对证书并使用外部CA进行签名

7
这是我目前为用户生成证书的部分内容:
    try {
        Security.addProvider(new BouncyCastleProvider()); // adding provider
                                                            // to
        String pathtoSave = "D://sureshtest.cer";

        KeyPair keyPair = generateKeypair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        X509Certificate trustCert = createCertificate(null, "CN=CompanyName",
                "CN=Owner", publicKey, privateKey);
        java.security.cert.Certificate[] outChain = { trustCert, };
        trustCert.checkValidity();
        KeyStore outStore = KeyStore.getInstance("PKCS12");
        outStore.load(null, null);
        outStore.setKeyEntry("my own certificate", privateKey,
                "admin123".toCharArray(), outChain);
        OutputStream outputStream = new FileOutputStream(pathtoSave);
        outStore.store(outputStream, "admin123".toCharArray());
        outputStream.flush();
        outputStream.close();


    } catch (Exception e) {
        e.printStackTrace();
    }

上述代码生成了一个带有私钥和公钥的证书。
现在我想用由证书颁发机构(CA)颁发给我的签名证书来签署该证书。之后,我将授予该证书给用户。
我从这里得到了一些输入,但似乎不是我这种情况所需的答案。
无需完整实现,只需要一个有效的过程或一些提示即可大大帮助。

1
好的,它生成了证书——你具体需要什么帮助? - chrylis -cautiouslyoptimistic-
@chrylis 现在我想在向用户发放证书之前对其进行签名。 - Suresh Atta
太好了。你是在问如何使用BouncyCastle编写Java代码来实现,还是想要关于如何向CA提交CSR的信息?请注意,除非你正在实现一个密钥托管系统,否则由CA生成密钥通常被认为是不好的做法,因为它不需要知道私钥。 - chrylis -cautiouslyoptimistic-
不需要向CA提交CSR。我已经有一个有效的CA证书,使用该证书来签署生成的证书。我的理解方向错误吗?或者这是不可行的? - Suresh Atta
1
链接的问题有什么不适合您的情况?它正在执行您所要求的确切操作。 - chrylis -cautiouslyoptimistic-
为什么这个请求突然插进来了?既然我手上有两个证书,我不能直接签名吗?如果不行,那我得改变我的代码,先签名再写入文件吗? - Suresh Atta
1个回答

1
你需要生成一个CSR,这样你就可以调用使用Bouncy Castle签署CSR,该链接使用BC API。将以下内容添加到您的代码中:
        final PKCS10 request = new PKCS10(publicKey);
        final String sigAlgName = "SHA1WithRSA"; // change this to SHA1WithDSA if it's a DSA key
        final Signature signature = Signature.getInstance(sigAlgName);
        signature.initSign(privateKey);
        final X500Name subject = new X500Name(trustCert.getSubjectDN().toString());
        final X500Signer signer = new X500Signer(signature, subject);

        // Sign the request and base-64 encode it
        request.encodeAndSign(signer);
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final PrintStream writer = new PrintStream(baos);
        request.print(writer);
        // Remove -----BEGIN NEW CERTIFICATE REQUEST----- and -----END NEW CERTIFICATE REQUEST-----
        final String requestBase64 = new String(baos.toByteArray());
        String withoutTags = requestBase64.substring(41);
        withoutTags = withoutTags.substring(0, withoutTags.length() - 39);

        // org.bouncycastle.pkcs.PKCS10CertificationRequestHolder
        final PKCS10CertificationRequest holder = new PKCS10CertificationRequest(Base64.decode(withoutTags));
        // Feed this into https://dev59.com/s2w05IYBdhLWcg3weBhF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接