package com.onaro.sanscreen.client.login; import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; import javax.swing.JList; import javax.swing.JOptionPane; import java.awt.Component; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; /** * A very basic UI component that presents the certificates available in a provided KeyStore, and enables the * user to select the preferred certificate.

* * @author Joshua M. Eisenthal Copyright 2014 NetApp, Inc. */ public class CertificateChooser{ static public CertificateWrapper chooseCertificate(final KeyStore keyStore) { try { List aliases = new ArrayList(); Enumeration aliasEnum = keyStore.aliases(); while (aliasEnum.hasMoreElements()) { aliases.add(aliasEnum.nextElement()); } Collections.sort(aliases); JComboBox certCombo = new JComboBox(aliases.toArray()); certCombo.setRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String alias = (String) value; X509Certificate certificate = null; try { certificate = (X509Certificate) keyStore.getCertificate(alias); } catch (KeyStoreException e) { e.printStackTrace(); } String certString = certificate != null ? certificate.getSubjectDN().toString() : null; value = "" + alias + "" + ": " + certString + ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ $NON-NLS-2$ /$NON-NLS-3$ return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } }); int result = JOptionPane.showConfirmDialog(null, certCombo, "Choose a Client Certificate", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE); //$NON-NLS-1$ String selected = (String) certCombo.getSelectedItem(); if (result == JOptionPane.OK_OPTION && selected != null) { return new CertificateWrapper((X509Certificate) keyStore.getCertificate(selected), selected); } } catch (KeyStoreException e) { e.printStackTrace(); } return null; } static class CertificateWrapper { private X509Certificate certificate; private String alias; public CertificateWrapper(X509Certificate certificate, String alias) { this.certificate = certificate; this.alias = alias; } public X509Certificate getCertificate() { return certificate; } public String getAlias() { return alias; } } }