- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
过去几天我一直在寻找解决我的问题的方法,但找不到任何东西。我在我的代码中遗漏了一些东西,但我无法弄清楚是什么:(不知何故,当我签署我的 PKCS#10 时,链条被打破了。
基本上我有一个服务器和一个客户端。我想让客户端向服务器发送 CSR,然后服务器对其进行签名,以便它们可以进行通信。现在我确实为客户端设置了一个带有 BouncyCaSTLe 的 PKCS#12,并且我确实为服务器设置了一个 RootCertificate(再次使用 BouncyCaSTLe,据我所知,这只是一个 PKCS#12,其扩展名能够签署证书)在代码中它看起来像这样:
Provider BC = new BouncyCastleProvider();
Security.addProvider(BC);
//create KeyPair
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
kpGen.initialize(2048, new SecureRandom());
pair = kpGen.generateKeyPair();
//building groundbase for certificate
X500NameBuilder builder = new X500NameBuilder(BCStyle.INSTANCE);
builder.addRDN(BCStyle.CN, commonName);
builder.addRDN(BCStyle.OU, organizationalUnit);
builder.addRDN(BCStyle.O, organization);
builder.addRDN(BCStyle.L, city);
builder.addRDN(BCStyle.ST, state);
builder.addRDN(BCStyle.C, country);
Date notBefore = new Date(System.currentTimeMillis() - 1000L * 60 * 60 * 24); //Yesterday
Date notAfter = new Date(System.currentTimeMillis() + 1000L * 365L * 24L * 60L * 60L); //in a year
BigInteger serial = BigInteger.valueOf(new SecureRandom().nextLong());
//creating a self-signed certificate from information in builder
X509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(builder.build(),
serial, notBefore, notAfter, builder.build(), pair.getPublic());
//The next line will make the difference between a Certificate and a Ca Certificate
certGen.addExtension(Extension.basicConstraints, true, new BasicConstraints(true));
ContentSigner sigGen = new JcaContentSignerBuilder(").setProvider(BC).build(pair.getPrivate());
X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC).getCertificate(certGen.build(sigGen));
现在我为客户端创建一个 CSR(客户端 keystore 在第一个位置有刚刚创建的 PKCS#12):
String alias = keystore.aliases().nextElement();
X509Certificate cert = (X509Certificate) keystore.getCertificate(alias);
X500Name x500name = new JcaX509CertificateHolder(cert).getSubject();
//builder for the PKCS10
PKCS10CertificationRequestBuilder requestBuilder = new JcaPKCS10CertificationRequestBuilder(x500name, cert.getPublicKey());
//algorithm identifier
DefaultSignatureAlgorithmIdentifierFinder sigAlgFinder = new DefaultSignatureAlgorithmIdentifierFinder();
DefaultDigestAlgorithmIdentifierFinder digAlgFinder = new DefaultDigestAlgorithmIdentifierFinder();
AlgorithmIdentifier sigAlgId = sigAlgFinder.find("SHA512WithRSA");
digAlgFinder.find(sigAlgId);
//content Signer
JcaContentSignerBuilder contentSignerBuilder = new JcaContentSignerBuilder("SHA512WithRSA");
//and build the Cert
ContentSigner signer = contentSignerBuilder.build((PrivateKey) keystore.getKey(alias, password));
PKCS10CertificationRequest req = requestBuilder.build(signer);
JcaPKCS10CertificationRequest req2 = new JcaPKCS10CertificationRequest(req.getEncoded()).setProvider("BC");
我通过网络发送这个编码的 JcaPKCS10CertificationRequest。服务器获取它并创建他的 CA 证书,现在必须签署 PKCS#10 但我在这里遗漏了一些东西,因为他不包括链。他正在创建的证书包含有关颁发者和 BasicConstraints 的信息,但证书路径仅包括客户端证书而不是服务器证书,因此它不可信,因为链已断开。
这就是我所做的(服务器 keystore 在位置 0 有 CA 证书,CSR 是 JcaPKCS10CertificationRequest):
String alias = keystore.aliases().nextElement();
// PKCS#12 Root Certificate
X509Certificate cert = (X509Certificate) keystore.getCertificate(alias);
// generated Serial
BigInteger serial = BigInteger.valueOf(new SecureRandom().nextLong());
//identify algorithm
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA512WithRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find( sigAlgId );
JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
JcaX509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(cert, serial, cert.getNotBefore(), cert.getNotAfter(),
CSR.getSubject(), CSR.getPublicKey());
certGen.addExtension(Extension.authorityKeyIdentifier, false, extUtils.createAuthorityKeyIdentifier(cert));
certGen.addExtension(Extension.basicConstraints, true, new BasicConstraints(false));
certGen.addExtension(Extension.subjectKeyIdentifier, true, extUtils.createSubjectKeyIdentifier(inputCSR.getPublicKey()));
certGen.addExtension(Extension.keyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment | KeyUsage.dataEncipherment | KeyUsage.nonRepudiation));
ContentSigner signer = new JcaContentSignerBuilder(sigAlgName).setProvider("BC").build((PrivateKey)keystore.getKey(alias, password));
X509CertificateHolder holder = certGen.build(signer);
X509Certificate signedCert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(holder);
signedCert.verify(cert.getPublicKey());
JcaPEMWriter pemWriter = new JcaPEMWriter(new FileWriter(new File("cer.cer")));
pemWriter.writeObject(signedCert);
pemWriter.writeObject(cert);
pemWriter.close();
正如我所说,生成的文件“cer.cer”中没有链。我怎样才能添加链?然后我可以将该 signedCert 发送回客户端,它可以用于 ssl 握手吗?
最佳答案
要添加链,这对我有用
在 X509CertificateHolder holder = certGen.build(signer);
之后
byte[] certencoded = holder.toASN1Structure().getEncoded();
ContentSigner signer = new JcaContentSignerBuilder("SHA1withRSA").build(caPrivateKkey);
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()).build(signer, cacert));
generator.addCertificate(new X509CertificateHolder(certencoded));
generator.addCertificate(new X509CertificateHolder(cacert.getEncoded()));
CMSTypedData content = new CMSProcessableByteArray(certencoded);
CMSSignedData signeddata = generator.generate(content, true);
byte certificateP7b[] = signedData.getEncoded();
使用此代码,您将获得包含 PCKS#7 格式的完整链的证书。如果您更喜欢使用 X509 格式
public static List<X509Certificate> p7BToX509(byte signedCert[]) throws CertificateException{
ByteArrayInputStream is = new ByteArrayInputStream( signedCert);
CertificateFactory cf = CertificateFactory.getInstance( "X.509" );
ArrayList<X509Certificate> certificates = new ArrayList<X509Certificate>();
Iterator i = cf.generateCertificates( is ).iterator();
while ( i.hasNext() ){
X509Certificate c = (X509Certificate)i.next();
certificates.add(c);
}
return certificates;
}
这是公共(public)证书。在您的客户中,您应该拥有私钥。这些都是您需要执行和 ssl 握手的所有元素
关于java - 使用 BouncyCaSTLe 签署 CSR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477679/
我正在尝试使用 iText java 。运行示例“how to sign”时会出现以下错误: Caused by: java.lang.ClassNotFoundException: org.boun
我的问题看起来像这样。我已经在卡和终端侧生成了 key 。我在终端端有卡公钥和私钥以及终端公钥和私钥,在卡端也是如此(我正在做测试,所以这就是为什么我在终端和卡上都有它们)。当我为私有(private
我正在尝试使用 BouncyCaSTLe 类来加密和解密密码。我已经编写了一个测试程序并生成了 PEM 格式和 DER 格式的测试 key /证书。我可以将 key /证书读入我的程序并获取公钥并加密
我在线程“主”java.lang.NoSuchMethodError 中遇到异常:org.bouncycaSTLe.asn1.ASN1InputStream.readObject()Lorg/boun
我有一个 tomcat 8.5 正在运行并在上面部署了我的应用程序。虽然编译一切正常,但在运行时出现以下错误: java.lang.NoClassDefFoundError: org/bouncyca
我有一个使用已弃用的函数 org.bouncycaSTLe.jce.PKCS10CertificationRequest 的函数,并且我尝试使用 org.bouncycaSTLe.pkcs.PKCS1
在我的c#项目中,我放了这段代码: 最初,我从我用充气城堡创建的证书中恢复, key 对,然后我提取私钥,我的目标是,它是一种格式。 pem, AsymmetricKeyParameter priv
当我尝试获取时间戳响应时出现错误。我使用的代码是: PdfPKCS7 sgn = new PdfPKCS7(pk, chain, null, "SHA256", null, false);
我正在尝试使用 silvertunnel netlib 连接到 tor 隐藏服务,但我不断遇到相同的异常: Exception in thread "org.silvertunnel.netlib.l
我想在 android 中使用 BouncyCaSTLe 进行 GnuPG 加密(想要获取 .gpg 文件)。但我收到此错误。(不支持的类文件主要版本 59。 无法转换 bcprov-jdk15on-
我想从此answer进行编码,但我有错误The import org.bouncycastle.openssl cannot be resolved The import org.bouncycast
我使用 Bouncy CaSTLe API 创建了一个 OCSP 客户端。我在从我得到的 OCSP 响应中找到证书状态(说明它是否被撤销)时遇到了麻烦。从 resp.getCertStatus() 返
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我已经用现有的Gradle文件导入BouncyCaSTLe项目。而且我目前正在将其他API实现到BC中,但出现了StackOverflow错误。现在,我想增加我的JVM堆栈。我已经尝试添加 task
我有一个使用 Spring Boot 创建的 Web 应用程序。我添加了 jasper 报告、iText 和 bouncycaSTLe maven 依赖项。 Jasper 和 iText 都包含 bo
是否可以在不修改安全策略文件的情况下以编程方式安装 BouncycaSTLe 提供程序? 最佳答案 当然: java.security.Security.addProvider(new Bou
在gpg中,您可以选择通过--comments选项向您的签名文件添加注释。 BouncyCaSTLe icw Java 上有可用的东西吗? 例如在gpg中: gpg --batch
我正在尝试使用 BouncyCaSTLe 库对字符串进行签名。我的代码可以工作,但生成的字符串充满了奇怪的字符,我的直觉表明它有问题。我的代码如下所示 Security.addProvider(new
我正在使用 BouncyCaSTLe 包进行 OpenPGP 加密。除了一部分之外,一切都很顺利。当我将加密文本写入文件时,它会附加以下消息 -----BEGIN PGP MESSAGE----- V
如何创建 org.bouncycastle.asn1.x509.AlgorithmIdentifier 的新实例RSA OAEP?为了能够在这里使用它: JceKeyTransRecipientInf
我是一名优秀的程序员,十分优秀!