JDK自带的Keytool不能直接导入私钥到keystore。一般情况下要转换再用portecle或其他工具导入,其实也可以自己写java程序导入,不过每次用命令行业不方便,所以做了个简陋的swing程序专门导入私钥和证书链到Keystore.现在把代码贴出来,要的自己可以打包:一共有两个类组成,一个是界面,一个是导入程序。我不是做java开发的,高手见了勿喷:下载地址http://download.csdn.net/detail/xtuxucj/4493013
package keyTools;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
public class KeyToolGUI extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
String alias;
File keystoreFile;
String keysotreType;
File privateKey;
File certChain;
KeyStore keyStore;
CertificateFactory certificateFactory;
char[] password;
private JMenu fileMenu;
private JMenu toolMenu;
private JMenuBar jMenuBar;
private JMenuItem newKeystoreMI;
private JMenuItem saveKeyStoreMI;
private JMenuItem exitMI;
private JMenuItem importKeyMI;
private JMenuItem importCertMI;
private JFileChooser keyChooser;
private FileNameExtensionFilter filter;
private JRadioButton r1;
private JRadioButton r2;
private JTextField tx0;
private JPasswordField tx1;
private JPasswordField tx2;
private JPanel jp2;
private JPanel jp1;
private Object[] options = { "OK", "CANCEL" };
private void initComponents() {
this.setTitle("key tool GUI");
fileMenu = new JMenu("File");
toolMenu = new JMenu("Tools");
jMenuBar = new JMenuBar();
newKeystoreMI = new JMenuItem("New Keystore");
saveKeyStoreMI = new JMenuItem("Save Keystore");
saveKeyStoreMI.setEnabled(false);
exitMI = new JMenuItem("Exit");
importKeyMI = new JMenuItem("ImportPrivateKey");
importKeyMI.setEnabled(false);
importCertMI = new JMenuItem("ImportCertChain");
importCertMI.setEnabled(false);
fileMenu.add(newKeystoreMI);
fileMenu.add(saveKeyStoreMI);
fileMenu.add(exitMI);
toolMenu.add(importKeyMI);
toolMenu.add(importCertMI);
jMenuBar.add(fileMenu);
jMenuBar.add(toolMenu);
this.setJMenuBar(jMenuBar);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(600, 400);
this.setLocationRelativeTo(null);
this.setVisible(true);
importKeyMI.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
importKeyMIActionPer();
}
});
importCertMI.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
importCertMIMIActionPer();
}
});
newKeystoreMI.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
newKeystoreMIActionPer();
}
});
saveKeyStoreMI.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
saveKeystoreMIActionPer();
}
});
exitMI.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.exit(0);
}
});
}
private void importKeyMIActionPer() {
keyChooser = new JFileChooser(System.getProperty("user.dir"));
filter = new FileNameExtensionFilter("der files(.der)", "der");
keyChooser.setFileFilter(filter);
int returnVal = keyChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
privateKey = keyChooser.getSelectedFile();
}
}
private void importCertMIMIActionPer() {
keyChooser = new JFileChooser(System.getProperty("user.dir"));
filter = new FileNameExtensionFilter("Certifecations Chain(.p7b)",
"p7b");
keyChooser.setFileFilter(filter);
int returnVal = keyChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
certChain = keyChooser.getSelectedFile();
}
}
private void newKeystoreMIActionPer() {
jp1 = new JPanel();
jp1.setBorder(BorderFactory.createTitledBorder("Select Keystore Type"));
jp1.setLayout(new BoxLayout(jp1, BoxLayout.Y_AXIS));
r1 = new JRadioButton("JKS", true);
r2 = new JRadioButton("JCEKS");
ButtonGroup group = new ButtonGroup();
group.add(r1);
group.add(r2);
jp1.add(r1);
jp1.add(r2);
int value = JOptionPane.showOptionDialog(this, jp1,
"Set Keystore Type", JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE, null, options, null);
switch (value) {
case JOptionPane.CLOSED_OPTION:
break;
case JOptionPane.OK_OPTION:
this.getKeystoreType();
importKeyMI.setEnabled(true);
importCertMI.setEnabled(true);
saveKeyStoreMI.setEnabled(true);
break;
case JOptionPane.CANCEL_OPTION:
break;
}
}
private void saveKeystoreMIActionPer() {
jp2 = new JPanel();
jp2.setLayout(new GridLayout(3, 3));
JLabel lb0 = new JLabel("set alias:");
JLabel lb1 = new JLabel("Enter new Password:");
JLabel lb2 = new JLabel("Confirm new Password:");
tx0 = new JTextField();
tx1 = new JPasswordField();
tx2 = new JPasswordField();
jp2.add(lb0);
jp2.add(tx0);
jp2.add(lb1);
jp2.add(tx1);
jp2.add(lb2);
jp2.add(tx2);
int value = JOptionPane.showOptionDialog(this, jp2,
"Set Keystore Type", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,null,options,null);
switch (value) {
case JOptionPane.CLOSED_OPTION:
break;
case JOptionPane.OK_OPTION:
getPassword();
break;
case JOptionPane.CANCEL_OPTION:
break;
}
}
private void getKeystoreType() {
if (r1.isSelected()) {
keysotreType = r1.getText();
} else if (r2.isSelected()) {
keysotreType = r2.getText();
}
//System.out.println(keysotreType);
}
private void getPassword() {
if (comparePass(tx1.getPassword(),tx2.getPassword())) {
password = tx1.getPassword();
alias = tx0.getText();
if(alias.isEmpty()){
alias = "alias";
}
keystoreFile();
} else {
JOptionPane.showMessageDialog(this, "The password is null or do not mach!",
"Set key store password", JOptionPane.ERROR_MESSAGE);
}
}
private boolean comparePass(char[] p1,char[] p2){
boolean flag = true;
if(p1.length == p2.length){
for(int i = 0; i < p1.length;i++){
if(p1[i] != p2[i]){
flag = false;
break;
}
flag = true;
}
}else{
flag = false;
}
return flag;
}
private void keystoreFile(){
keyChooser = new JFileChooser(System.getProperty("user.dir"));
keyChooser.setDialogType(JFileChooser.SAVE_DIALOG );
filter = new FileNameExtensionFilter("keystore files(.jks)", "jks");
keyChooser.setFileFilter(filter);
keyChooser.setDialogTitle("Save keysotre as");
int returnVal = keyChooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
keystoreFile = keyChooser.getSelectedFile();
try {
new CreateKeystore().createKeystoreFile(keysotreType, privateKey, certChain, password, keystoreFile,
alias);
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "some input is wrong",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
}
public KeyToolGUI() {
initComponents();
}
public static void main(String[] args) {
new KeyToolGUI();
}
}
package keyTools;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.CertificateFactory;
import java.security.spec.PKCS8EncodedKeySpec;
public class CreateKeystore {
public CreateKeystore() {
}
void createKeystoreFile(String keyStoreType, File keyFile,
File certChainFile, char[] password, File keyStoreFile,String alias)
throws Exception {
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, password);
// Load the certificate chain (in X.509 DER encoding).
FileInputStream certificateStream = new FileInputStream(certChainFile);
CertificateFactory certificateFactory = CertificateFactory
.getInstance("X.509");
java.security.cert.Certificate[] chain = {};
chain = certificateFactory.generateCertificates(certificateStream)
.toArray(chain);
certificateStream.close();
byte[] encodedKey = new byte[(int) keyFile.length()];
FileInputStream keyInputStream = new FileInputStream(keyFile);
keyInputStream.read(encodedKey);
keyInputStream.close();
KeyFactory rSAKeyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = rSAKeyFactory
.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
keyStore.setEntry(alias, new KeyStore.PrivateKeyEntry(
privateKey, chain), new KeyStore.PasswordProtection(password));
FileOutputStream keyStoreOutputStream = new FileOutputStream(
keyStoreFile);
keyStore.store(keyStoreOutputStream, password);
keyStoreOutputStream.close();
}
}