问题是如何在Java中以编程方式生成证书链。换言之,我想用java执行此处详述的操作:http://fusesource.com/docs/broker/5.3/security/i382664.html
当然,我可以为新客户端创建RSA密钥:
private KeyPair genRSAKeyPair(){
// Get RSA key factory:
KeyPairGenerator kpg = null;
try {
kpg = KeyPairGenerator.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
log.error(e.getMessage());
e.printStackTrace();
return null;
}
// Generate RSA public/private key pair:
kpg.initialize(RSA_KEY_LEN);
KeyPair kp = kpg.genKeyPair();
return kp;
}
并生成相应的证书:
private X509Certificate generateCertificate(String dn, KeyPair pair, int days, String algorithm)
throws GeneralSecurityException, IOException {
PrivateKey privkey = pair.getPrivate();
X509CertInfo info = new X509CertInfo();
Date from = new Date();
Date to = new Date(from.getTime() + days * 86400000l);
CertificateValidity interval = new CertificateValidity(from, to);
BigInteger sn = new BigInteger(64, new SecureRandom());
X500Name owner = new X500Name(dn);
info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));
// Sign the cert to identify the algorithm that's used.
X509CertImpl cert = new X509CertImpl(info);
cert.sign(privkey, algorithm);
// Update the algorith, and resign.
algo = (AlgorithmId)cert.get(X509CertImpl.SIG_ALG);
info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
cert = new X509CertImpl(info);
cert.sign(privkey, algorithm);
return cert;
}
然后我生成证书签名请求,并将其保存到csrFile文件:
public static void writeCertReq(File csrFile, String alias, String keyPass, KeyStore ks)
throws KeyStoreException,
NoSuchAlgorithmException,
InvalidKeyException,
IOException,
CertificateException,
SignatureException,
UnrecoverableKeyException {
Object objs[] = getPrivateKey(ks, alias, keyPass.toCharArray());
PrivateKey privKey = (PrivateKey) objs[0];
PKCS10 request = null;
Certificate cert = ks.getCertificate(alias);
request = new PKCS10(cert.getPublicKey());
String sigAlgName = "MD5WithRSA";
Signature signature = Signature.getInstance(sigAlgName);
signature.initSign(privKey);
X500Name subject = new X500Name(((X509Certificate) cert).getSubjectDN().toString());
X500Signer signer = new X500Signer(signature, subject);
request.encodeAndSign(signer);
request.print(System.out);
FileOutputStream fos = new FileOutputStream(csrFile);
PrintStream ps = new PrintStream(fos);
request.print(ps);
fos.close();
}
哪里
private static Object[] getPrivateKey(KeyStore ks, String alias, char keyPass[])
throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
key = null;
key = ks.getKey(alias, keyPass);
return (new Object[]{ (PrivateKey) key, keyPass });
}
现在我应该用CA私钥对CSR进行签名,但我不知道如何在java中实现这一点。我的jks中有“我自己的”CA私钥。
此外,一旦我成功签署了CSR,我就应该将CA证书与已签署的CSR链接起来:在java中如何做到这一点?
我不希望使用bc或其他外部LIB,只希望使用“sun.security”类。
非常感谢。
我看你已经到了房子的弹跳舱那一边,但以防万一其他人会想知道;将密钥放入密钥库时,可以将证书链添加到条目中。例如
// build your certs
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load([keystore stream], password.toCharArray());// or null, null if it's a brand new store
X509Certificate[] chain = new X509Certificate[2];
chain[0] = _clientCert;
chain[1] = _caCert;
keyStore.setKeyEntry("Alias", _clientCertKey, password.toCharArray(), chain);
keyStore.store([output stream], password.toCharArray());
// do other stuff
很抱歉,尽管你有这个愿望,除了写下你所有的密码并将其包含在你的项目中(不推荐),我还是建议你在这里使用Bouncy Castle。
具体请参阅https://stackoverflow.com/a/7366757/751158-其中包括您希望执行的操作的代码。
相信http://www.pixelstech.net/article/1406726666-Generate-certificate-in-Java----2中的代码示例将向您展示如何使用纯Java生成证书链。它不需要你使用充气城堡。
问题内容: 我正在寻找一个Java库或代码来即时生成证书,公共和私有密钥,而无需使用第三方程序(例如openssl)。 我认为是从Java代码中获取keytool + openssl的东西。 考虑使用ssl和客户端身份验证保护的基于Java servlet的Web应用程序。我希望Servlet容器仅在请求时使用Java代码生成客户端证书(例如pkcs12格式)。 问题答案: 您可以使用一对或密钥在
我使用的是nimbus jose jwt 5.14,我用以下代码生成了RSA密钥对 现在我需要解释一些关于公钥的“元数据”: e 孩子 kty n 使用 x5c 如何获得x5c?是否可以使用此库生成X509证书?此字段为空:
本文档提供使用 openssl 生成自签名证书的一个示例,用户也可以根据自己的需求生成符合要求的证书和密钥。 假设实例集群拓扑如下: Name Host IP Services node1 172.16.10.11 DM-master1 node2 172.16.10.12 DM-master2 node3 172.16.10.13 DM-master3 node4 172.16.10.14 DM
我已经使用BouncyCastle来帮助创建基于RSA的证书,因此接下来的步骤或多或少遵循了创建RSA证书的方法。 (注意,前缀用于来自BouncyCastle的类,用于.NET类) 1生成密钥对:私钥和公钥 如果我可以使用没有私钥的证书,则可以执行以下操作: 我就完蛋了。 当试图设置私钥时会出现问题:
我想生成一个自签名的可信证书和一个csr,并用创建的可信证书对csr进行签名。我正在用keytool尝试它。在使用以下命令创建受信任证书的第一步中 keytool-list-v-keystore cert/test.keystore 使用上面的“genkey”命令创建的证书的条目类型为“privatekeyentry”,如何创建可信的证书条目?