1 package org.eparapher.rcp.wizards;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.security.KeyPair;
5 import java.security.KeyStore;
6 import java.security.KeyStoreException;
7 import java.security.NoSuchAlgorithmException;
8 import java.security.NoSuchProviderException;
9 import java.security.cert.X509Certificate;
10 import java.util.Date;
11
12 import org.apache.log4j.Logger;
13 import org.eclipse.core.runtime.IProgressMonitor;
14 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
15 import org.eclipse.jface.operation.IRunnableWithProgress;
16 import org.eclipse.jface.viewers.IStructuredSelection;
17 import org.eclipse.jface.wizard.Wizard;
18 import org.eclipse.swt.widgets.Display;
19 import org.eclipse.ui.INewWizard;
20 import org.eclipse.ui.IWorkbench;
21 import org.eclipse.ui.IWorkbenchWindow;
22 import org.eclipse.ui.PlatformUI;
23 import org.eparapher.core.EParapherManager;
24 import org.eparapher.core.crypto.EPKeystoreManager;
25 import org.eparapher.core.crypto.cert.CertificateManager;
26 import org.eparapher.core.crypto.cert.NewCertParams;
27 import org.eparapher.core.crypto.keystore.IUserKeystore;
28 import org.eparapher.rcp.tools.eParapherTools;
29
30 public class NewCertificateWizard extends Wizard implements INewWizard {
31
32 private static Logger log = Logger.getLogger(NewCertificateWizard.class);
33
34
35 private IWorkbenchWindow window;
36
37 private NewCertificateWizardPageOne one;
38
39 private X509Certificate[] generatedCert = null;
40 private String generatedCSR = null;
41
42 private NewCertParams certParams = null;
43
44 public NewCertificateWizard() {
45 super();
46 setWindowTitle("New certificate wizard");
47 setNeedsProgressMonitor(true);
48 certParams = new NewCertParams();
49 }
50
51 public void addPages() {
52 one = new NewCertificateWizardPageOne();
53 addPage(one);
54 }
55
56 public boolean performFinish() {
57
58
59 certParams.setSelfCertSigned(one.isSelfSigned());
60 certParams.setCSR(one.isCSR());
61 certParams.setAlias(one.getAliasName());
62
63 certParams.setKeypairAlg(one.getKeypairAlg());
64 certParams.setKeypairSize(one.getKeypairSize());
65 certParams.setCertSigAlg(one.getCertSigAlg());
66 certParams.setEcDSASpecName(one.getECSpecsName());
67
68 certParams.setSubjectDN(one.getUserDNasString());
69
70 certParams.setValidFrom(new Date());
71 certParams.setValidUntil(one.getEndofValidityDate(certParams.getValidFrom()));
72
73 certParams.setSubaltnameDNSName(one.getSubjAltNameDNSName());
74 certParams.setSubaltnameEMail(one.getSubjAltNameEMail());
75 certParams.setSubaltnameOtherName(one.getSubjAltNameOtherName());
76
77
78 if (EPKeystoreManager.getInstance().getUserkeystore().containsAlias(certParams.getAlias())) {
79 if ( ! EParapherManager.getInstance().getUI().askUserYesNo("alias '"+certParams.getAlias()+"' already exists in keystore\r\nDo you really want to overwrite it (you will loose your private key)?") )
80 return false;
81 else
82 try {
83 EPKeystoreManager.getInstance().getUserkeystore().getKeystore().deleteEntry(certParams.getAlias());
84 } catch (KeyStoreException e) {
85 log.error(e);
86 }
87 }
88
89 if ( !EPKeystoreManager.isCAPICOMUsed() && !EPKeystoreManager.isPKCS11Used() && !EPKeystoreManager.isPKCS12Used() ) {
90 PinOrPassphraseWizard passphraseWizard = new PinOrPassphraseWizard( true, true, certParams.getAlias() );
91 certParams.setAliaspwd(passphraseWizard.askForSecret());
92 if ( certParams.getAliaspwd() == null || certParams.getAliaspwd().equals("") ) {
93 String msg = "Cannot access private key, .";
94 log.info(msg);
95 eParapherTools.errorMessage(msg);
96 return false;
97 }
98 }
99 ProgressMonitorDialog dialog = new ProgressMonitorDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
100 try {
101 generateKeysAndCert keycertgen = new generateKeysAndCert(certParams);
102 dialog.run(true, true, keycertgen );
103 generatedCert = keycertgen.getCertCahin();
104 generatedCSR = keycertgen.getCSRFilename();
105 return true;
106 } catch (InterruptedException e) {
107 eParapherTools.exceptionMessage("Error while generating Keypair/Certificate/CSR", e);
108 } catch (InvocationTargetException e) {
109 eParapherTools.exceptionMessage("Error while generating Keypair/Certificate/CSR", e);
110 }
111 return false;
112 }
113
114 protected class generateKeysAndCert implements IRunnableWithProgress {
115
116 NewCertParams X509Params;
117
118 String csrFile;
119 X509Certificate[] certChain;
120
121 protected generateKeysAndCert(NewCertParams params) {
122 X509Params = params;
123 csrFile = null;
124 }
125 protected String getCSRFilename() {
126 return csrFile;
127 }
128 protected X509Certificate[] getCertCahin() {
129 return certChain;
130 }
131 public void run(IProgressMonitor monitor) {
132
133 if (X509Params.isSelfCertSigned())
134 monitor.beginTask("Generating self signed certificate",3);
135 if (X509Params.isCSR())
136 monitor.beginTask("Generating certificate signing request",4);
137
138 try {
139
140 monitor.subTask("Generating " + X509Params.getKeypairAlg() + " Keypair");
141 KeyPair keypair = CertificateManager.generateKeyPair(X509Params);
142 monitor.worked(1);
143
144 if (monitor.isCanceled())
145 return;
146
147
148 monitor.subTask("Generating X509 Certificate");
149 certChain = CertificateManager.generateNewCertificate( X509Params, keypair );
150 monitor.worked(1);
151 if (monitor.isCanceled())
152 return;
153 monitor.worked(1);
154
155
156
157
158
159 if (X509Params.isCSR()) {
160 monitor.subTask("Generating certificate signing request (PKCS#10)");
161 csrFile = CertificateManager.createSigningRequest( X509Params, keypair );
162 monitor.worked(1);
163 if (monitor.isCanceled())
164 return;
165 }
166
167 monitor.subTask("Storing private key and certificate");
168
169 IUserKeystore uks = EPKeystoreManager.getInstance().getUserkeystore();
170 KeyStore ks = uks.getKeystore();
171 String alias = X509Params.getAlias();
172 if ( EPKeystoreManager.isPKCS11Used() || EPKeystoreManager.isCAPICOMUsed() || X509Params.getAliaspwd() == null) {
173 ks.setKeyEntry(alias, keypair.getPrivate(), null, certChain );
174 } else {
175 ks.setKeyEntry(alias, keypair.getPrivate(), X509Params.getAliaspwd().toCharArray(), certChain );
176 }
177
178 uks.saveKeyStore();
179 monitor.worked(1);
180
181 } catch (NoSuchAlgorithmException e) {
182 manageexception(e);
183 } catch (NoSuchProviderException e) {
184 manageexception(e);
185 } catch (Exception e) {
186 manageexception(e);
187 }
188 monitor.done();
189 }
190
191 private void manageexception(final Throwable e) {
192 log.error(e.getLocalizedMessage(),e);
193 Display.getDefault().syncExec( new Runnable() {
194 public void run() { eParapherTools.exceptionMessage(e.getLocalizedMessage(), e); }
195 }
196 );
197 }
198 }
199
200 public boolean isCSR() {
201 return certParams.isCSR();
202 }
203
204 public boolean isSelfSignedCert() {
205
206 return certParams.isSelfCertSigned();
207 }
208
209 public String getAlias() {
210 return certParams.getAlias();
211 }
212
213 public X509Certificate[] getGeneratedCertificate() {
214 return generatedCert;
215 }
216 public String getCSRFile() {
217 return generatedCSR;
218 }
219
220 public void init(IWorkbench workbench, IStructuredSelection selection) {
221 window = workbench.getActiveWorkbenchWindow();
222 }
223
224 }