证书生成
public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
System.out.println("Private Key (Base64): " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
System.out.println("Public Key (Base64): " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
X500Name subject = new X500Name("CN=localhosttt, O=demo1, L=City, ST=State, C=US");
X500Name issuer = subject;
BigInteger serialNumber = new BigInteger(64, new SecureRandom());
Date notBefore = new Date(System.currentTimeMillis() - 10000);
Date notAfter = new Date(System.currentTimeMillis() + 365L * 24 * 60 * 60 * 1000);
JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(
issuer, serialNumber, notBefore, notAfter, subject, keyPair.getPublic());
ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA").build(keyPair.getPrivate());
X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certBuilder.build(signer));
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("mycert", cert);
keyStore.setKeyEntry("mykey", keyPair.getPrivate(), "password".toCharArray(), new Certificate[]{cert});
try (FileOutputStream fos = new FileOutputStream("keystore.jks")) {
keyStore.store(fos, "password".toCharArray());
}
try (PEMWriter pemWriter = new PEMWriter(new FileWriter("certificate.crt"))) {
pemWriter.writeObject(cert);
}
try (PEMWriter pemWriter = new PEMWriter(new FileWriter("private.key"))) {
pemWriter.writeObject(keyPair.getPrivate());
}
try (FileOutputStream fos = new FileOutputStream("certificate.cer")) {
fos.write(cert.getEncoded());
}
}
证书强制验证
在spring boot中强制验证证书,在application.yml中添加如下配置
server.port=
server.ssl.enabled=true
server.ssl.key-store=classpath:server.jks
server.ssl.key-store-password=your_password
server.ssl.trust-store=classpath:localhost.jks
server.ssl.trust-store-password=your_password
server.ssl.client-auth=need