java - bouncy caSTLe 相当于 openssl pkcs10 证书签名命令

标签 java openssl bouncycastle client-certificates pkcs#10

我正在尝试使用 Java 中的充气城堡签署 pkcs10 请求。生成的证书将用于双向 ssl 场景。我浏览并尝试了此网站和其他网站上的许多示例,但在尝试将客户端连接到服务器时,我总是得到以下结果:

--java--

org.springframework.web.client.ResourceAccessException: 
I/O error on GET request for "https://localhost:8443/resources/1":
Received fatal alert: certificate_unknown;
nested exception is javax.net.ssl.SSLHandshakeException:
Received fatal alert: certificate_unknown

--openssl--

$ openssl s_client -connect localhost:8443 -CAfile ca.crt -cert client.crt -key client.key -pass pass:password -showcerts
CONNECTED(00000003)
depth=1 /C=xx/ST=xx/L=xx/O=xxxx/OU=xxxx/CN=xxxx/emailAddress=xxxx@xxxx.com
verify return:1
depth=0 /C=xx/ST=xx/L=xx/O=xxxx/OU=xxxx/CN=localhost/emailAddress=xxxx@xxxx.com
verify return:1
76234:error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown:
/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098
-59.40.2/src/ssl/s3_pkt.c:1145:SSL alert number 46
76234:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:
/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59.40.2/src/ssl/s23_lib.c:185:

我已经对充气城堡进行了多次尝试,但这里只是作为示例进行了一次尝试:

public Certificate signCertificateSigningRequest(PKCS10CertificationRequest certificationRequest,
        Certificate caCertificate, PrivateKey caPrivateKey) throws Exception {
    X500Name issuer = getX500Name("xxxx");
    Calendar notBefore = Calendar.getInstance();
    notBefore.add(Calendar.DATE, -1);
    Calendar notAfter = Calendar.getInstance();
    notAfter.add(Calendar.YEAR, 3);
    X509v3CertificateBuilder certGen = new X509v3CertificateBuilder(
        issuer,
        BigInteger.valueOf(3),
        notBefore.getTime(),
        notAfter.getTime(),
        certificationRequest.getSubject(),
        certificationRequest.getSubjectPublicKeyInfo()
    );
    X509CertificateHolder certHolder = certGen
        .build(new JcaContentSignerBuilder("SHA256withRSA").setProvider("BC").build(caPrivateKey));
    X509Certificate certificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certHolder);
    return certificate;
}

我想要的是相当于以下 openssl 命令的充气城堡,我知道它有效:

$ openssl \
x509 \
-req \
-in client.csr \
-CA ca.crt \
-CAkey ca.key \
-passin pass:password \
-CAcreateserial \
-sha256 \
-out client.crt \
-days 3650

这让我抓狂。任何帮助将非常感激。谢谢。

最佳答案

我在这里找到了答案:X509 certificate signed with bouncy castle is not valid

答案与 X509v3CertificateBuilder 的颁发者有关。 getX500Name("xxxx") 返回的颁发者应该与生成证书的颁发者相同,但我想事实并非如此。我必须改变:

X500Name issuer = getX500Name("xxxx");

至:

X500Name issuer = X500Name.getInstance(((X509Certificate)caCertificate).getSubjectX500Principal().getEncoded());

现在一切正常了。

关于java - bouncy caSTLe 相当于 openssl pkcs10 证书签名命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196610/

相关文章:

java - 检查具有相同对象列表的对象列表

java - WebSecurityConfigurers 上的@Order 必须是唯一的。 org.engine.security.WebSecurityConfig 上已经使用了 100 的顺序

java - HttpURLConnection 和浏览器连接之间的区别

c++ - 获取 google 搜索 ssl pem 证书

android - 为 https android 连接创建 keystore BKS

java - 使用 Java3D 同时显示多边形线和纹理

C# ECDsaCng.SignData 在 OpenSSL 中使用签名?

java - 使用 S/MIME 对文件进行签名和加密

google-app-engine - 使用 bouncycaSTLe X509v3CertificateBuilder 生成 X509Certificate

java - 将 Bouncy CasSTLe 证书转换为 Java