如何在没有 sun.security 的情况下使用密钥对创建 X509Certificate

Ave*_*nir 5 java spring spring-security x509certificate

我想为我的单元测试生成 x509 证书和密钥对。

private Pair<String, String> generateTokenAndCertificate() {
    try {

        //Configure generator
        CertAndKeyGen certGen = new CertAndKeyGen("RSA", "SHA256WithRSA");
        certGen.generate(2048);
        long validSecs = (long) 365 * 24 * 60 * 60; // valid for one year


        //Token
        CharSequence content = "test";
        Signer signer = new RsaSigner((RSAPrivateKey) certGen.getPrivateKey());
        String token = JwtHelper.encode(content, signer).getEncoded();

        //Certificate
        X500Name data = new X500Name("CN=Test Application,O=Company,L=City,C=DE");
        X509Certificate cert = certGen.getSelfCertificate(data, validSecs);
        Base64 encoder = new Base64();
        String certificate = X509Factory.BEGIN_CERT + "\n";
        certificate += encoder.encode(cert.getEncoded());
        certificate += X509Factory.END_CERT + "\n";

        return new Pair<>(token, certificate);
    } catch (Exception e) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我用过

import sun.security.provider.X509Factory;
import sun.security.tools.keytool.CertAndKeyGen;
import sun.security.x509.X500Name;
Run Code Online (Sandbox Code Playgroud)

并得到这样的错误:

错误:包 sun.security.tools.keytool 不存在

和:

error: cannot find symbol
        CertAndKeyGen certGen = new CertAndKeyGen("RSA", "SHA256WithRSA");
        ^
symbol:   class CertAndKeyGen
location: class CertificationProviderSpecification
Run Code Online (Sandbox Code Playgroud)

我知道这javac不加载完整的rt.jar关于ct.sym我可以通过解决这样的错误-XDignore.symbol.file或充气城堡。

但是可以通过java.security或生成这些org.springframework.security吗?

小智 4

您可以仅使用以下命令创建密钥对java.security

KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(2048, SecureRandom.getInstance("SHA1PRNG"));
KeyPair keyPair = gen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

但要创建证书,您必须使用sun.security类。

我从未使用过org.springframework.security,但创建证书的一个很好的替代方案是Bouncy Castle API - 在课堂上查看org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder,有很多在线示例