Java tutorial
/* * Copyright 2004 - 2013 Wayne Grant * 2013 - 2016 Kai Kramer * * This file is part of KeyStore Explorer. * * KeyStore Explorer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * KeyStore Explorer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with KeyStore Explorer. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.keystore_explorer.gui.dialogs.sign; import static net.sf.keystore_explorer.crypto.x509.X509CertificateVersion.VERSION1; import static net.sf.keystore_explorer.crypto.x509.X509CertificateVersion.VERSION3; import java.awt.Dialog; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.math.BigInteger; import java.security.GeneralSecurityException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.Provider; import java.security.PublicKey; import java.security.Security; import java.security.cert.X509Certificate; import java.text.MessageFormat; import java.util.ResourceBundle; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.pkcs.PKCS10CertificationRequest; import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest; import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder; import net.miginfocom.swing.MigLayout; import net.sf.keystore_explorer.crypto.CryptoException; import net.sf.keystore_explorer.crypto.KeyInfo; import net.sf.keystore_explorer.crypto.csr.spkac.Spkac; import net.sf.keystore_explorer.crypto.csr.spkac.SpkacSubject; import net.sf.keystore_explorer.crypto.keypair.KeyPairType; import net.sf.keystore_explorer.crypto.keypair.KeyPairUtil; import net.sf.keystore_explorer.crypto.signing.SignatureType; import net.sf.keystore_explorer.crypto.x509.X500NameUtils; import net.sf.keystore_explorer.crypto.x509.X509CertificateVersion; import net.sf.keystore_explorer.crypto.x509.X509ExtensionSet; import net.sf.keystore_explorer.gui.CurrentDirectory; import net.sf.keystore_explorer.gui.CursorUtil; import net.sf.keystore_explorer.gui.FileChooserFactory; import net.sf.keystore_explorer.gui.JEscDialog; import net.sf.keystore_explorer.gui.JavaFXFileChooser; import net.sf.keystore_explorer.gui.PlatformUtil; import net.sf.keystore_explorer.gui.crypto.JDistinguishedName; import net.sf.keystore_explorer.gui.crypto.JValidityPeriod; import net.sf.keystore_explorer.gui.dialogs.DViewPublicKey; import net.sf.keystore_explorer.gui.dialogs.DialogHelper; import net.sf.keystore_explorer.gui.dialogs.extensions.DAddExtensions; import net.sf.keystore_explorer.gui.error.DError; import net.sf.keystore_explorer.utilities.io.FileNameUtil; /** * Dialog that displays the details of a CSR and presents signing options for * it. * */ public class DSignCsr extends JEscDialog { private static ResourceBundle res = ResourceBundle .getBundle("net/sf/keystore_explorer/gui/dialogs/sign/resources"); private static final String CANCEL_KEY = "CANCEL_KEY"; private JLabel jlCsrFormat; private JTextField jtfCsrFormat; private JLabel jlCsrSubject; private JDistinguishedName jdnCsrSubject; private JLabel jlCsrPublicKey; private JTextField jtfCsrPublicKey; private JButton jbViewCsrPublicKeyDetails; private JLabel jlCsrSignatureAlgorithm; private JTextField jtfCsrSignatureAlgorithm; private JLabel jlCsrChallenge; private JTextField jtfCsrChallenge; private JLabel jlVersion; private JRadioButton jrbVersion1; private JRadioButton jrbVersion3; private JLabel jlSignatureAlgorithm; private JComboBox jcbSignatureAlgorithm; private JLabel jlValidityPeriod; private JValidityPeriod jvpValidityPeriod; private JLabel jlSerialNumber; private JTextField jtfSerialNumber; private JLabel jlCaReplyFile; private JTextField jtfCaReplyFile; private JButton jbBrowse; private JButton jbAddExtensions; private JButton jbOK; private JButton jbCancel; private PrivateKey signPrivateKey; private KeyPairType signKeyPairType; private X509Certificate verificationCertificate; private PKCS10CertificationRequest pkcs10Csr; private Spkac spkacCsr; private File csrFile; private PublicKey csrPublicKey; private X509CertificateVersion version; private SignatureType signatureType; private long validityPeriod; private BigInteger serialNumber; private File caReplyFile; private X509ExtensionSet extensions = new X509ExtensionSet(); private Provider provider; /** * Creates a new DSignCsr dialog for a PKCS #10 formatted CSR. * * @param parent * The parent frame * @param pkcs10Csr * The PKCS #10 formatted CSR * @param csrFile * The CSR file * @param signPrivateKey * Signing private key * @param signKeyPairType * Signing key pair's type * @param verificationCertificate * Verification certificate * @throws CryptoException * A crypto problem was encountered constructing the dialog */ public DSignCsr(JFrame parent, PKCS10CertificationRequest pkcs10Csr, File csrFile, PrivateKey signPrivateKey, KeyPairType signKeyPairType, X509Certificate verificationCertificate, Provider provider) throws CryptoException { super(parent, Dialog.ModalityType.DOCUMENT_MODAL); this.pkcs10Csr = pkcs10Csr; this.csrFile = csrFile; this.signPrivateKey = signPrivateKey; this.signKeyPairType = signKeyPairType; this.verificationCertificate = verificationCertificate; this.provider = provider; setTitle(res.getString("DSignCsr.Title")); initComponents(); } /** * Creates a new DSignCsr dialog for a SPKAC formatted CSR. * * @param parent * The parent frame * @param spkacCsr * The SPKAC formatted CSR * @param csrFile * The CSR file * @param signPrivateKey * Signing private key * @param signKeyPairType * Signing key pair's type * @param verificationCertificate * Verification certificate * @throws CryptoException * A crypto problem was encountered constructing the dialog */ public DSignCsr(JFrame parent, Spkac spkacCsr, File csrFile, PrivateKey signPrivateKey, KeyPairType signKeyPairType, X509Certificate verificationCertificate, Provider provider) throws CryptoException { super(parent, Dialog.ModalityType.DOCUMENT_MODAL); this.spkacCsr = spkacCsr; this.csrFile = csrFile; this.signPrivateKey = signPrivateKey; this.signKeyPairType = signKeyPairType; this.verificationCertificate = verificationCertificate; this.provider = provider; setTitle(res.getString("DSignCsr.Title")); initComponents(); } private void initComponents() throws CryptoException { jlCsrFormat = new JLabel(res.getString("DSignCsr.jlCsrFormat.text")); jtfCsrFormat = new JTextField(15); jtfCsrFormat.setEditable(false); jtfCsrFormat.setToolTipText(res.getString("DSignCsr.jtfCsrFormat.tooltip")); jlCsrSubject = new JLabel(res.getString("DSignCsr.jlCsrSubject.text")); jdnCsrSubject = new JDistinguishedName(res.getString("DSignCsr.Subject.Title"), 30, false); jdnCsrSubject.setToolTipText(res.getString("DSignCsr.jdnCsrSubject.tooltip")); jlCsrPublicKey = new JLabel(res.getString("DSignCsr.jlCsrPublicKey.text")); jtfCsrPublicKey = new JTextField(15); jtfCsrPublicKey.setEditable(false); jtfCsrPublicKey.setToolTipText(res.getString("DSignCsr.jtfCsrPublicKey.tooltip")); jbViewCsrPublicKeyDetails = new JButton(); jbViewCsrPublicKeyDetails.setToolTipText(res.getString("DSignCsr.jbViewCsrPublicKeyDetails.tooltip")); jbViewCsrPublicKeyDetails.setIcon(new ImageIcon(Toolkit.getDefaultToolkit() .createImage(getClass().getResource(res.getString("DSignCsr.jbViewCsrPublicKeyDetails.image"))))); jlCsrSignatureAlgorithm = new JLabel(res.getString("DSignCsr.jlCsrSignatureAlgorithm.text")); jtfCsrSignatureAlgorithm = new JTextField(15); jtfCsrSignatureAlgorithm.setEditable(false); jtfCsrSignatureAlgorithm.setToolTipText(res.getString("DSignCsr.jtfCsrSignatureAlgorithm.tooltip")); jlCsrChallenge = new JLabel(res.getString("DSignCsr.jlCsrChallenge.text")); jtfCsrChallenge = new JTextField(15); jtfCsrChallenge.setEditable(false); jtfCsrChallenge.setToolTipText(res.getString("DSignCsr.jtfCsrChallenge.tooltip")); populateCsrDetails(); jlVersion = new JLabel(res.getString("DSignCsr.jlVersion.text")); jrbVersion1 = new JRadioButton(res.getString("DSignCsr.jrbVersion1.text")); jrbVersion1.setToolTipText(res.getString("DSignCsr.jrbVersion1.tooltip")); jrbVersion3 = new JRadioButton(res.getString("DSignCsr.jrbVersion3.text")); jrbVersion3.setToolTipText(res.getString("DSignCsr.jrbVersion3.tooltip")); jlSignatureAlgorithm = new JLabel(res.getString("DSignCsr.jlSignatureAlgorithm.text")); jcbSignatureAlgorithm = new JComboBox(); jcbSignatureAlgorithm.setMaximumRowCount(10); DialogHelper.populateSigAlgs(signKeyPairType, this.signPrivateKey, provider, jcbSignatureAlgorithm); jcbSignatureAlgorithm.setToolTipText(res.getString("DSignCsr.jcbSignatureAlgorithm.tooltip")); jlValidityPeriod = new JLabel(res.getString("DSignCsr.jlValidityPeriod.text")); jvpValidityPeriod = new JValidityPeriod(JValidityPeriod.YEARS); jvpValidityPeriod.setToolTipText(res.getString("DSignCsr.jvpValidityPeriod.tooltip")); jlSerialNumber = new JLabel(res.getString("DSignCsr.jlSerialNumber.text")); jtfSerialNumber = new JTextField("" + generateSerialNumber(), 15); jtfSerialNumber.setToolTipText(res.getString("DSignCsr.jtfSerialNumber.tooltip")); jlCaReplyFile = new JLabel(res.getString("DSignCsr.jlCaReplyFile.text")); jtfCaReplyFile = new JTextField(30); jtfCaReplyFile.setToolTipText(res.getString("DSignCsr.jtfCaReplyFile.tooltip")); populateCaReplyFileName(); jbBrowse = new JButton(res.getString("DSignCsr.jbBrowse.text")); jbBrowse.setToolTipText(res.getString("DSignCsr.jbBrowse.tooltip")); PlatformUtil.setMnemonic(jbBrowse, res.getString("DSignCsr.jbBrowse.mnemonic").charAt(0)); jbBrowse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { try { CursorUtil.setCursorBusy(DSignCsr.this); browsePressed(); } finally { CursorUtil.setCursorFree(DSignCsr.this); } } }); jbAddExtensions = new JButton(res.getString("DSignCsr.jbAddExtensions.text")); jbAddExtensions.setMnemonic(res.getString("DSignCsr.jbAddExtensions.mnemonic").charAt(0)); jbAddExtensions.setToolTipText(res.getString("DSignCsr.jbAddExtensions.tooltip")); jbAddExtensions.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { try { CursorUtil.setCursorBusy(DSignCsr.this); addExtensionsPressed(); } finally { CursorUtil.setCursorFree(DSignCsr.this); } } }); jrbVersion3.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent evt) { jbAddExtensions.setEnabled(jrbVersion3.isSelected()); } }); jrbVersion3.setSelected(true); jbOK = new JButton(res.getString("DSignCsr.jbOK.text")); jbCancel = new JButton(res.getString("DSignCsr.jbCancel.text")); jbCancel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), CANCEL_KEY); JPanel buttons = PlatformUtil.createDialogButtonPanel(jbOK, jbCancel); JPanel jpCsr = new JPanel(); jpCsr.setBorder(new TitledBorder(new EtchedBorder(), res.getString("DSignCsr.jpCsrDetails.text"))); JPanel jpSignOptions = new JPanel(); jpSignOptions .setBorder(new TitledBorder(new EtchedBorder(), res.getString("DSignCsr.jpSigningOptions.text"))); // layout getContentPane().setLayout(new MigLayout("fill", "", "")); getContentPane().add(jpCsr, "grow, wrap"); getContentPane().add(jpSignOptions, "wrap unrel"); getContentPane().add(buttons, "growx"); jpCsr.setLayout(new MigLayout("fill", "[right]unrel[]", "[]unrel[]")); jpCsr.add(jlCsrFormat, ""); jpCsr.add(jtfCsrFormat, "wrap"); jpCsr.add(jlCsrSubject, ""); jpCsr.add(jdnCsrSubject, "wrap"); jpCsr.add(jlCsrPublicKey, ""); jpCsr.add(jtfCsrPublicKey, "split 2"); jpCsr.add(jbViewCsrPublicKeyDetails, "wrap"); jpCsr.add(jlCsrSignatureAlgorithm, ""); jpCsr.add(jtfCsrSignatureAlgorithm, "wrap"); jpCsr.add(jlCsrChallenge, ""); jpCsr.add(jtfCsrChallenge, "wrap"); jpSignOptions.setLayout(new MigLayout("fill", "[right]unrel[]", "[]unrel[]")); jpSignOptions.add(jlVersion, ""); jpSignOptions.add(jrbVersion1, "split 2"); jpSignOptions.add(jrbVersion3, "wrap"); jpSignOptions.add(jlSignatureAlgorithm, ""); jpSignOptions.add(jcbSignatureAlgorithm, "wrap"); jpSignOptions.add(jlValidityPeriod, ""); jpSignOptions.add(jvpValidityPeriod, "wrap"); jpSignOptions.add(jlSerialNumber, ""); jpSignOptions.add(jtfSerialNumber, "wrap"); jpSignOptions.add(jlCaReplyFile, ""); jpSignOptions.add(jtfCaReplyFile, "split 2"); jpSignOptions.add(jbBrowse, "wrap"); jpSignOptions.add(jbAddExtensions, "spanx, wrap"); jbViewCsrPublicKeyDetails.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { try { CursorUtil.setCursorBusy(DSignCsr.this); pubKeyDetailsPressed(); } finally { CursorUtil.setCursorFree(DSignCsr.this); } } }); jbOK.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { okPressed(); } }); jbCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { cancelPressed(); } }); jbCancel.getActionMap().put(CANCEL_KEY, new AbstractAction() { @Override public void actionPerformed(ActionEvent evt) { cancelPressed(); } }); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent evt) { closeDialog(); } }); setResizable(false); getRootPane().setDefaultButton(jbOK); pack(); } private void populateCsrDetails() throws CryptoException { if (pkcs10Csr != null) { populatePkcs10CsrDetails(); } else { populateSpkacCsrDetails(); } } private void populatePkcs10CsrDetails() throws CryptoException { jtfCsrFormat.setText(res.getString("DSignCsr.jtfCsrFormat.Pkcs10.text")); jtfCsrFormat.setCaretPosition(0); jdnCsrSubject.setDistinguishedName(pkcs10Csr.getSubject()); try { csrPublicKey = new JcaPKCS10CertificationRequest(pkcs10Csr).getPublicKey(); } catch (GeneralSecurityException ex) { throw new CryptoException(res.getString("DSignCsr.NoGetCsrPublicKey.message"), ex); } populatePublicKey(); String sigAlgId = pkcs10Csr.getSignatureAlgorithm().getAlgorithm().getId(); SignatureType sigAlg = SignatureType.resolveOid(sigAlgId); if (sigAlg != null) { jtfCsrSignatureAlgorithm.setText(sigAlg.friendly()); } else { jtfCsrSignatureAlgorithm.setText(sigAlgId); } jtfCsrSignatureAlgorithm.setCaretPosition(0); DialogHelper.populatePkcs10Challenge(pkcs10Csr.getAttributes(), jtfCsrChallenge); } private void populateSpkacCsrDetails() throws CryptoException { jtfCsrFormat.setText(res.getString("DSignCsr.jtfCsrFormat.Spkac.text")); jtfCsrFormat.setCaretPosition(0); SpkacSubject subject = spkacCsr.getSubject(); jdnCsrSubject.setDistinguishedName(subject.getName()); csrPublicKey = spkacCsr.getPublicKey(); populatePublicKey(); jtfCsrSignatureAlgorithm.setText(spkacCsr.getSignatureAlgorithm().friendly()); jtfCsrSignatureAlgorithm.setCaretPosition(0); jtfCsrChallenge.setText(spkacCsr.getChallenge()); jtfCsrChallenge.setCaretPosition(0); } private void populatePublicKey() throws CryptoException { KeyInfo keyInfo = KeyPairUtil.getKeyInfo(csrPublicKey); jtfCsrPublicKey.setText(keyInfo.getAlgorithm()); Integer keySize = keyInfo.getSize(); if (keySize != null) { jtfCsrPublicKey.setText(MessageFormat.format(res.getString("DSignCsr.jtfCsrPublicKey.text"), jtfCsrPublicKey.getText(), "" + keySize)); } else { jtfCsrPublicKey.setText(MessageFormat.format(res.getString("DSignCsr.jtfCsrPublicKey.text"), jtfCsrPublicKey.getText(), "?")); } jtfCsrPublicKey.setCaretPosition(0); } private long generateSerialNumber() { return System.currentTimeMillis() / 1000; } private void populateCaReplyFileName() { String replyFileName = FileNameUtil.removeExtension(csrFile.getName()) + ".p7r"; File replyFile = new File(csrFile.getParentFile(), replyFileName); jtfCaReplyFile.setText(replyFile.getPath()); } private void addExtensionsPressed() { DAddExtensions dAddExtensions = new DAddExtensions(this, extensions, verificationCertificate.getPublicKey(), X500NameUtils.x500PrincipalToX500Name(verificationCertificate.getSubjectX500Principal()), verificationCertificate.getSerialNumber(), csrPublicKey); dAddExtensions.setLocationRelativeTo(this); dAddExtensions.setVisible(true); if (dAddExtensions.getExtensions() != null) { // Dialog not cancelled extensions = dAddExtensions.getExtensions(); } } /** * Get chosen certificate version. * * @return Certificate version or null if dialog cancelled */ public X509CertificateVersion getVersion() { return version; } /** * Get chosen signature type. * * @return Signature type or null if dialog cancelled */ public SignatureType getSignatureType() { return signatureType; } /** * Get chosen validity period. * * @return Validity period or -1 if dialog cancelled */ public long getValidityPeriod() { return validityPeriod; } /** * Get chosen serial number. * * @return Serial number or null if dialog cancelled */ public BigInteger getSerialNumber() { return serialNumber; } /** * Get chosen CA Reply file. * * @return CA Reply file or null if dialog cancelled */ public File getCaReplyFile() { return caReplyFile; } /** * Get chosen certficate extensions. * * @return Certificate extensions or null if dialog cancelled. */ public X509ExtensionSet getExtensions() { return extensions; } private void browsePressed() { JFileChooser chooser = FileChooserFactory.getCaReplyFileChooser(); File currentExportFile = new File(jtfCaReplyFile.getText().trim()); if (currentExportFile.getParentFile() != null && currentExportFile.getParentFile().exists()) { chooser.setCurrentDirectory(currentExportFile.getParentFile()); chooser.setSelectedFile(currentExportFile); } else { chooser.setCurrentDirectory(CurrentDirectory.get()); } chooser.setDialogTitle(res.getString("DSignCsr.SaveCaReply.Title")); chooser.setMultiSelectionEnabled(false); int rtnValue = JavaFXFileChooser.isFxAvailable() ? chooser.showSaveDialog(this) : chooser.showDialog(this, res.getString("DSignCsr.SaveCaReply.button")); if (rtnValue == JFileChooser.APPROVE_OPTION) { File chosenFile = chooser.getSelectedFile(); CurrentDirectory.updateForFile(chosenFile); jtfCaReplyFile.setText(chosenFile.toString()); jtfCaReplyFile.setCaretPosition(0); } } private void pubKeyDetailsPressed() { try { DViewPublicKey dViewPublicKey = new DViewPublicKey(this, res.getString("DSignCsr.PubKeyDetails.Title"), csrPublicKey); dViewPublicKey.setLocationRelativeTo(this); dViewPublicKey.setVisible(true); } catch (CryptoException ex) { DError dError = new DError(this, ex); dError.setLocationRelativeTo(this); dError.setVisible(true); } } private void okPressed() { String serialNumberStr = jtfSerialNumber.getText().trim(); if (serialNumberStr.length() == 0) { JOptionPane.showMessageDialog(this, res.getString("DSignCsr.ValReqSerialNumber.message"), getTitle(), JOptionPane.WARNING_MESSAGE); return; } long serialNumberLong; try { serialNumberLong = Integer.parseInt(serialNumberStr); if (serialNumberLong < 0) { JOptionPane.showMessageDialog(this, res.getString("DSignCsr.SerialNumberNonZero.message"), getTitle(), JOptionPane.WARNING_MESSAGE); return; } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, res.getString("DSignCsr.SerialNumberNotInteger.message"), getTitle(), JOptionPane.WARNING_MESSAGE); return; } String exportFileStr = jtfCaReplyFile.getText().trim(); if (exportFileStr.length() == 0) { JOptionPane.showMessageDialog(this, res.getString("DSignCsr.CaReplyFileRequired.message"), getTitle(), JOptionPane.WARNING_MESSAGE); return; } File caReplyFile = new File(exportFileStr); if (caReplyFile.isFile()) { String message = MessageFormat.format(res.getString("DSignCsr.OverWriteCaReplyFile.message"), caReplyFile); int selected = JOptionPane.showConfirmDialog(this, message, getTitle(), JOptionPane.YES_NO_OPTION); if (selected != JOptionPane.YES_OPTION) { return; } } this.caReplyFile = caReplyFile; if (jrbVersion1.isSelected()) { version = VERSION1; extensions = null; } else { version = VERSION3; } signatureType = (SignatureType) jcbSignatureAlgorithm.getSelectedItem(); validityPeriod = jvpValidityPeriod.getValidityPeriodMs(); serialNumber = BigInteger.valueOf(serialNumberLong); closeDialog(); } private void cancelPressed() { extensions = null; closeDialog(); } private void closeDialog() { setVisible(false); dispose(); } // for quick testing public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "BC"); keyGen.initialize(1024); KeyPair keyPair = keyGen.genKeyPair(); JcaPKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder( new X500Name("cn=test"), keyPair.getPublic()); PKCS10CertificationRequest csr = csrBuilder.build(new JcaContentSignerBuilder("SHA256withRSA") .setProvider("BC").build(keyPair.getPrivate())); DSignCsr dialog = new DSignCsr(new javax.swing.JFrame(), csr, new File(System.getProperty("user.dir"), "test.csr"), keyPair.getPrivate(), KeyPairType.RSA, null, new BouncyCastleProvider()); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } }