我想创建一个 JAVA 程序,将 .cer CA 导入到现有的密钥库文件中。 这样最终用户可以更方便地插入CA证书(无需使用CMD并在命令中键入)。
JAVA 代码可以做到这一点吗?
我尝试了一些方法,但仍然无法将证书导入java
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certstream = fullStream (certfile);
Certificate certs = cf.generateCertificates(certstream);
错误是类型不兼容,还有其他建议吗?
非常感谢
以下代码将 CA 证书文件
yourcert.cer
插入到您的密钥库中,而不使用 keytool
:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.io.IOException;
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;
import java.security.spec.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.Collection;
public class ImportCA {
public static void main(String[] argv) throws Exception {
String certfile = "yourcert.cer"; /*your cert path*/
FileInputStream is = new FileInputStream("yourKeyStore.keystore");
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(is, "yourKeyStorePass".toCharArray());
String alias = "youralias";
char[] password = "yourKeyStorePass".toCharArray();
//////
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certstream = fullStream (certfile);
Certificate certs = cf.generateCertificate(certstream);
///
File keystoreFile = new File("yourKeyStorePass.keystore");
// Load the keystore contents
FileInputStream in = new FileInputStream(keystoreFile);
keystore.load(in, password);
in.close();
// Add the certificate
keystore.setCertificateEntry(alias, certs);
// Save the new keystore contents
FileOutputStream out = new FileOutputStream(keystoreFile);
keystore.store(out, password);
out.close();
}
private static InputStream fullStream ( String fname ) throws IOException {
FileInputStream fis = new FileInputStream(fname);
DataInputStream dis = new DataInputStream(fis);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
return bais;
}
}
抱歉,这个答案没有带来任何新内容,但已接受答案中的代码太糟糕了,我只能发布它。这只是一个抛光版本,仅此而已。因此,请考虑从此处复制/粘贴,但支持已接受的答案而不是这个答案。
public static void addX509CertificateToTrustStore(String certPath, String certAlias, String storePath, String storePassword, String storeType)
throws FileNotFoundException, KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException {
char[] storePasswordCharArr = Objects.requireNonNull(storePassword, "").toCharArray();
KeyStore keystore;
try (FileInputStream storeInputStream = new FileInputStream(storePath);
FileInputStream certInputStream = new FileInputStream(certPath)) {
keystore = KeyStore.getInstance(storeType);
keystore.load(storeInputStream, storePasswordCharArr);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
Certificate certificate = certificateFactory.generateCertificate(certInputStream);
keystore.setCertificateEntry(certAlias, certificate);
} finally {
}
try (FileOutputStream storeOutputStream = new FileOutputStream(storePath)) {
keystore.store(storeOutputStream, storePasswordCharArr);
} finally {
}
}
从链接下载证书并存储到特定路径..然后在运行时使用下面的代码将该文件加载到trustStore..我希望这个例子能帮助你..
String filename = "D:\\certs_path\\cacerts"; // cerrtification file path
System.setProperty("javax.net.ssl.trustStore", fileName);