View Javadoc

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  	/** The window */
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  		//Get Params
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  		//If the alias already exists : user confirm if overwrite.
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  		//Ask the user for the Private Key Password
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 				//Generate Keys
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 				//Generate Certificate
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 				//EPKeystoreManager.getInstance().getUserkeystore().getKeystore().setKeyEntry(X509Params.getAlias(), keypair.getPrivate(), X509Params.getAliaspwd().toCharArray(), null );
156 				//EPKeystoreManager.getInstance().getUserkeystore().saveKeyStore();
157 				
158 				//Generate CSR
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 				//Store the new private key and certificate in your keystore
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 }