事件的典型流程是類似如下:您生成一個密鑰對,這意味着一個私鑰和一個匹配的公鑰。私鑰是你的,你永遠不會分享它;這就是爲什麼它被稱爲私人。公鑰是你給別人的。發佈公鑰的一種常見格式是X.509證書。該證書包含公鑰和一些標識信息。此證書可以自簽名,也可以由其他機構簽署。
不幸的是,標準的Oracle Java庫不包含任何類來幫助您從公鑰生成X.509證書。您可以使用Oracle JDK附帶的名爲keytool的命令行工具來實現此目的。如果您必須以編程方式執行此操作,那麼Bouncycastle Java libraries包含一些類來完成此操作。例如,JcaX509v3CertificateBuilder可能是完成此任務的最簡單方法,與JcaContentSignerBuilder類一起。
這是一個使用Java 7和Bouncycastle版本1.50提供程序和PKIX庫的示例。
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.Date;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
public class CertBuilder {
public static void main(String[] args) throws Exception {
// Generate a keypair
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
// Start creating a self-signed X.509 certificate with the public key
X500Name subjName = new X500Name("C=US, ST=NY, O=Certs_R_Us, [email protected]");
BigInteger serialNumber = new BigInteger("900");
Calendar cal = Calendar.getInstance();
cal.set(2014, 6, 7, 11, 59, 59);
Date notBefore = cal.getTime();
cal.add(Calendar.YEAR, 10); // Expires in 10 years
Date notAfter = cal.getTime();
JcaX509v3CertificateBuilder x509Builder = new JcaX509v3CertificateBuilder(subjName, serialNumber,
notBefore, notAfter, subjName, kp.getPublic());
// Create a signer to sign (self-sign) the certificate.
JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA256WITHRSA");
ContentSigner signer = signerBuilder.build(kp.getPrivate());
// Now finish the creation of the self-signed certificate.
JcaX509CertificateConverter converter = new JcaX509CertificateConverter();
X509Certificate mySelfSignedCert = converter.getCertificate(x509Builder.build(signer));
// Now create a KeyStore and store the private key and associated cert.
final char[] password = "password99".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(null, password);
KeyStore.PrivateKeyEntry privKeyEntry = new KeyStore.PrivateKeyEntry(kp.getPrivate(),
new Certificate[] {mySelfSignedCert});
ks.setEntry("myRSAkey", privKeyEntry, new KeyStore.PasswordProtection(password));
// Now save off the KeyStore to a file.
FileOutputStream fos = null;
try {
fos = new FileOutputStream("MyKeys.jks");
ks.store(fos, password);
} finally {
if (fos != null) {
fos.close();
}
}
}
}
我還要提到的是我使用的是私有密鑰字符串,它是按以下格式: http://ospkibook.sourceforge.net/docs/OSPKI-2.4.7/OSPKI-html/sample- priv-key.htm 我不確定是否需要在頂部和底部刪除「BEGIN」和「END」註釋,並在將字符串用作X509EncodedKeySpec中的參數之前執行base64.decode。 –
您正在使用錯誤的術語,因此存在問題。您不會從privKeyString「生成」私鑰但加載密鑰。那麼,你既不能生成也不能加載你擁有的證書。你需要首先確定你需要什麼。 –
以及我首先需要的是什麼?如果需要公鑰才能生成證書,則可以使用私鑰生成公鑰。這就是我問的問題,我需要什麼來生成證書? –