diff options
author | Ade Lee <alee@redhat.com> | 2012-04-26 23:48:43 -0400 |
---|---|---|
committer | Ade Lee <alee@redhat.com> | 2012-05-02 16:47:27 -0400 |
commit | 9aea1e939f6357eadf777c72ae3ef43275829427 (patch) | |
tree | 07cfa655fcfd462c5217df8c8fe19cccc7e2e97f /base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java | |
parent | fbf472de7a4eb3d141c32821a417ec5331b53c97 (diff) | |
download | pki-9aea1e939f6357eadf777c72ae3ef43275829427.tar.gz pki-9aea1e939f6357eadf777c72ae3ef43275829427.tar.xz pki-9aea1e939f6357eadf777c72ae3ef43275829427.zip |
Refactor installation servlets to use common code in ConfigurationUtils
Ticket #156
Diffstat (limited to 'base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java')
-rw-r--r-- | base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java | 543 |
1 files changed, 28 insertions, 515 deletions
diff --git a/base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java b/base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java index 506abdd70..7ace274a7 100644 --- a/base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java +++ b/base/common/src/com/netscape/cms/servlet/csadmin/RestoreKeyCertPanel.java @@ -17,54 +17,14 @@ // --- END COPYRIGHT BLOCK --- package com.netscape.cms.servlet.csadmin; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; import java.io.IOException; -import java.math.BigInteger; -import java.security.Principal; -import java.security.PublicKey; -import java.util.StringTokenizer; -import java.util.Vector; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import netscape.ldap.LDAPDN; -import netscape.security.x509.X509CertImpl; - import org.apache.velocity.context.Context; -import org.mozilla.jss.CryptoManager; -import org.mozilla.jss.asn1.ANY; -import org.mozilla.jss.asn1.BMPString; -import org.mozilla.jss.asn1.OBJECT_IDENTIFIER; -import org.mozilla.jss.asn1.OCTET_STRING; -import org.mozilla.jss.asn1.SEQUENCE; -import org.mozilla.jss.asn1.SET; -import org.mozilla.jss.crypto.Cipher; -import org.mozilla.jss.crypto.CryptoStore; -import org.mozilla.jss.crypto.CryptoToken; -import org.mozilla.jss.crypto.EncryptionAlgorithm; -import org.mozilla.jss.crypto.IVParameterSpec; -import org.mozilla.jss.crypto.InternalCertificate; -import org.mozilla.jss.crypto.KeyGenAlgorithm; -import org.mozilla.jss.crypto.KeyGenerator; -import org.mozilla.jss.crypto.KeyWrapAlgorithm; -import org.mozilla.jss.crypto.KeyWrapper; -import org.mozilla.jss.crypto.SymmetricKey; -import org.mozilla.jss.crypto.X509Certificate; -import org.mozilla.jss.pkcs11.PK11Store; -import org.mozilla.jss.pkcs12.AuthenticatedSafes; -import org.mozilla.jss.pkcs12.CertBag; -import org.mozilla.jss.pkcs12.PFX; -import org.mozilla.jss.pkcs12.PasswordConverter; -import org.mozilla.jss.pkcs12.SafeBag; -import org.mozilla.jss.pkix.primitive.Attribute; -import org.mozilla.jss.pkix.primitive.EncryptedPrivateKeyInfo; -import org.mozilla.jss.pkix.primitive.PrivateKeyInfo; -import org.mozilla.jss.util.Password; import com.netscape.certsrv.apps.CMS; import com.netscape.certsrv.base.EBaseException; @@ -197,10 +157,6 @@ public class RestoreKeyCertPanel extends WizardPanelBase { // Path can be empty. If this case, we just want to // get to the next panel. Customer has HSM. String s = HttpInput.getString(request, "path"); - // if (s == null || s.equals("")) { - // CMS.debug("RestoreKeyCertPanel validate: path is empty"); - // throw new IOException("Path is empty"); - // } if (s != null && !s.equals("")) { s = HttpInput.getPassword(request, "__password"); @@ -219,460 +175,50 @@ public class RestoreKeyCertPanel extends WizardPanelBase { HttpServletResponse response, Context context) throws IOException { IConfigStore config = CMS.getConfigStore(); - String path = HttpInput.getString(request, "path"); - if (path == null || path.equals("")) { - // skip to next panel - config.putBoolean("preop.restorekeycert.done", true); - try { - config.commit(false); - } catch (EBaseException e) { - } - getConfigEntriesFromMaster(request, response, context); - context.put("updateStatus", "success"); - return; - } - String pwd = HttpInput.getPassword(request, "__password"); - - String tokenn = ""; - String instanceRoot = ""; - - try { - tokenn = config.getString("preop.module.token"); - instanceRoot = config.getString("instanceRoot"); - } catch (Exception e) { - } - - if (tokenn.equals("Internal Key Storage Token")) { - byte b[] = new byte[1000000]; - FileInputStream fis = new FileInputStream(instanceRoot + "/alias/" + path); - while (fis.available() > 0) - fis.read(b); - fis.close(); - - ByteArrayInputStream bis = new ByteArrayInputStream(b); - StringBuffer reason = new StringBuffer(); - Password password = new Password(pwd.toCharArray()); - PFX pfx = null; - boolean verifypfx = false; - try { - pfx = (PFX) (new PFX.Template()).decode(bis); - verifypfx = pfx.verifyAuthSafes(password, reason); - } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel update: Exception=" + e.toString()); - } - - if (verifypfx) { - CMS.debug("RestoreKeyCertPanel verify the PFX."); - AuthenticatedSafes safes = pfx.getAuthSafes(); - Vector<Vector<Object>> pkeyinfo_collection = new Vector<Vector<Object>>(); - Vector<Vector<Object>> cert_collection = new Vector<Vector<Object>>(); - for (int i = 0; i < safes.getSize(); i++) { - try { - SEQUENCE scontent = safes.getSafeContentsAt(null, i); - for (int j = 0; j < scontent.size(); j++) { - SafeBag bag = (SafeBag) scontent.elementAt(j); - OBJECT_IDENTIFIER oid = bag.getBagType(); - if (oid.equals(SafeBag.PKCS8_SHROUDED_KEY_BAG)) { - EncryptedPrivateKeyInfo privkeyinfo = - (EncryptedPrivateKeyInfo) bag.getInterpretedBagContent(); - PrivateKeyInfo pkeyinfo = privkeyinfo.decrypt(password, new PasswordConverter()); - Vector<Object> pkeyinfo_v = new Vector<Object>(); - pkeyinfo_v.addElement(pkeyinfo); - SET bagAttrs = bag.getBagAttributes(); - for (int k = 0; k < bagAttrs.size(); k++) { - Attribute attrs = (Attribute) bagAttrs.elementAt(k); - OBJECT_IDENTIFIER aoid = attrs.getType(); - if (aoid.equals(SafeBag.FRIENDLY_NAME)) { - SET val = attrs.getValues(); - ANY ss = (ANY) val.elementAt(0); - ByteArrayInputStream bbis = new ByteArrayInputStream(ss.getEncoded()); - BMPString sss = (BMPString) new BMPString.Template().decode(bbis); - String s = sss.toString(); - pkeyinfo_v.addElement(s); - } - } - pkeyinfo_collection.addElement(pkeyinfo_v); - } else if (oid.equals(SafeBag.CERT_BAG)) { - CertBag cbag = (CertBag) bag.getInterpretedBagContent(); - OCTET_STRING str = (OCTET_STRING) cbag.getInterpretedCert(); - byte[] x509cert = str.toByteArray(); - Vector<Object> cert_v = new Vector<Object>(); - cert_v.addElement(x509cert); - SET bagAttrs = bag.getBagAttributes(); - - if (bagAttrs != null) { - for (int k = 0; k < bagAttrs.size(); k++) { - Attribute attrs = (Attribute) bagAttrs.elementAt(k); - OBJECT_IDENTIFIER aoid = attrs.getType(); - if (aoid.equals(SafeBag.FRIENDLY_NAME)) { - SET val = attrs.getValues(); - ANY ss = (ANY) val.elementAt(0); - ByteArrayInputStream bbis = new ByteArrayInputStream(ss.getEncoded()); - BMPString sss = (BMPString) (new BMPString.Template()).decode(bbis); - String s = sss.toString(); - cert_v.addElement(s); - } - } - } - - cert_collection.addElement(cert_v); - } - } - } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel update: Exception=" + e.toString()); - } - } - - importkeycert(pkeyinfo_collection, cert_collection); - } else { - context.put("updateStatus", "failure"); - throw new IOException("The pkcs12 file is not correct."); - } - } - - String subsystemtype = ""; - String cstype = ""; try { - subsystemtype = config.getString("preop.subsystem.select", ""); - cstype = config.getString("cs.type", ""); - } catch (Exception e) { - } - cstype = toLowerCaseSubsystemType(cstype); - - if (subsystemtype.equals("clone")) { - CMS.debug("RestoreKeyCertPanel: this is the clone subsystem"); - boolean cloneReady = isCertdbCloned(request, context); - if (!cloneReady) { - CMS.debug("RestoreKeyCertPanel update: clone does not have all the certificates."); - context.put("errorString", "Make sure you have copied the certificate database over to the clone"); - context.put("updateStatus", "failure"); - throw new IOException("Clone is not ready"); - } - } + ConfigurationUtils.getConfigEntriesFromMaster(); - config.putBoolean("preop.restorekeycert.done", true); - try { - config.commit(false); - } catch (EBaseException e) { - } - - getConfigEntriesFromMaster(request, response, context); - context.put("updateStatus", "success"); - } - - private void getConfigEntriesFromMaster(HttpServletRequest request, - HttpServletResponse response, Context context) throws IOException { - try { - IConfigStore config = CMS.getConfigStore(); - String cstype = ""; - try { - cstype = config.getString("cs.type", ""); - } catch (Exception e) { - } - cstype = toLowerCaseSubsystemType(cstype); - - String session_id = CMS.getConfigSDSessionId(); - String master_hostname = ""; - int master_port = -1; - int master_ee_port = -1; - try { - master_hostname = config.getString("preop.master.hostname", ""); - master_port = config.getInteger("preop.master.httpsadminport", -1); - master_ee_port = config.getInteger("preop.master.httpsport", -1); - - String content = ""; - if (cstype.equals("ca") || cstype.equals("kra")) { - content = "type=request&xmlOutput=true&sessionID=" + session_id; - CMS.debug("http content=" + content); - updateNumberRange(master_hostname, master_ee_port, true, content, "request", response); - - content = "type=serialNo&xmlOutput=true&sessionID=" + session_id; - updateNumberRange(master_hostname, master_ee_port, true, content, "serialNo", response); - - content = "type=replicaId&xmlOutput=true&sessionID=" + session_id; - updateNumberRange(master_hostname, master_ee_port, true, content, "replicaId", response); - } - - String list = ""; - try { - list = config.getString("preop.cert.list", ""); - } catch (Exception e) { - } - - StringBuffer c1 = new StringBuffer(); - StringBuffer s1 = new StringBuffer(); - StringTokenizer tok = new StringTokenizer(list, ","); - while (tok.hasMoreTokens()) { - String t1 = tok.nextToken(); - if (t1.equals("sslserver")) - continue; - c1.append(","); - c1.append("cloning."); - c1.append(t1); - c1.append(".nickname,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".dn,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".keytype,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".keyalgorithm,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".privkey.id,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".pubkey.exponent,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".pubkey.modulus,"); - c1.append("cloning."); - c1.append(t1); - c1.append(".pubkey.encoded"); - - if (s1.length() != 0) - s1.append(","); - - s1.append(cstype); - s1.append("."); - s1.append(t1); - } - - if (!cstype.equals("ca")) { - c1.append(",cloning.ca.hostname,cloning.ca.httpport,cloning.ca.httpsport,cloning.ca.list,cloning.ca.pkcs7,cloning.ca.type"); - } - - if (cstype.equals("ca")) { - /* get ca connector details */ - if (s1.length() != 0) - s1.append(","); - s1.append("ca.connector.KRA"); - } - - s1.append(",internaldb,internaldb.ldapauth,internaldb.ldapconn"); - - content = - "op=get&names=cloning.token,instanceId,internaldb.basedn,internaldb.ldapauth.password," - + "internaldb.replication.password" + c1.toString() - + "&substores=" + s1.toString() - + "&xmlOutput=true&sessionID=" - + session_id; - boolean success = updateConfigEntries(master_hostname, master_port, true, - "/" + cstype + "/admin/" + cstype + "/getConfigEntries", content, config, response); - if (!success) { - context.put("errorString", "Failed to get configuration entries from the master"); - throw new IOException("Failed to get configuration entries from the master"); - } - config.putString("preop.clone.configuration", "true"); - try { - config.commit(false); - } catch (Exception ee) { - } - } catch (IOException eee) { - throw eee; - } catch (Exception eee) { - CMS.debug("RestoreKeyCertPanel: update exception caught:" + eee.toString()); + String path = HttpInput.getString(request, "path"); + if (path == null || path.equals("")) { + // skip to next panel + config.putBoolean("preop.restorekeycert.done", true); + config.commit(false); + context.put("updateStatus", "success"); + return; } - } catch (IOException ee) { - throw ee; - } catch (Exception ee) { - } - } + String pwd = HttpInput.getPassword(request, "__password"); - private void deleteExistingCerts() { - IConfigStore cs = CMS.getConfigStore(); - try { - String list = cs.getString("preop.cert.list", ""); - StringTokenizer st = new StringTokenizer(list, ","); - while (st.hasMoreTokens()) { - String s = st.nextToken(); - if (s.equals("sslserver")) - continue; - String name = "preop.master." + s + ".nickname"; - String nickname = cs.getString(name, ""); - CryptoManager cm = CryptoManager.getInstance(); - X509Certificate xcert = null; - try { - xcert = cm.findCertByNickname(nickname); - } catch (Exception ee) { - CMS.debug("RestoreKeyCertPanel deleteExistingCerts: Exception=" + ee.toString()); - } - CryptoToken ct = cm.getInternalKeyStorageToken(); - CryptoStore store = ct.getCryptoStore(); - try { - store.deleteCert(xcert); - } catch (Exception ee) { - CMS.debug("RestoreKeyCertPanel deleteExistingCerts: Exception=" + ee.toString()); - } + String tokenn = config.getString("preop.module.token"); + if (tokenn.equals("Internal Key Storage Token")) { + ConfigurationUtils.restoreCertsFromP12(path, pwd); } - } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel deleteExistingCerts: Exception=" + e.toString()); - } - } - - private org.mozilla.jss.crypto.PrivateKey.Type getPrivateKeyType(PublicKey pubkey) { - CMS.debug("Key Algorithm '" + pubkey.getAlgorithm() + "'"); - if (pubkey.getAlgorithm().equals("EC")) { - return org.mozilla.jss.crypto.PrivateKey.Type.EC; - } - return org.mozilla.jss.crypto.PrivateKey.Type.RSA; - } - - private void importkeycert(Vector<Vector<Object>> pkeyinfo_collection, - Vector<Vector<Object>> cert_collection) throws IOException { - CryptoManager cm = null; - try { - cm = CryptoManager.getInstance(); - } catch (Exception e) { - } - - // delete all existing certificates first - deleteExistingCerts(); - for (int i = 0; i < pkeyinfo_collection.size(); i++) { - try { - Vector<Object> pkeyinfo_v = pkeyinfo_collection.elementAt(i); - PrivateKeyInfo pkeyinfo = (PrivateKeyInfo) pkeyinfo_v.elementAt(0); - String nickname = (String) pkeyinfo_v.elementAt(1); - byte[] x509cert = getX509Cert(nickname, cert_collection); - X509Certificate cert = cm.importCACertPackage(x509cert); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - pkeyinfo.encode(bos); - byte[] pkey = bos.toByteArray(); - - PublicKey publickey = cert.getPublicKey(); - CryptoToken token = cm.getInternalKeyStorageToken(); - CryptoStore store = token.getCryptoStore(); - CMS.debug("RestoreKeyCertPanel deleteCert: this is pk11store"); - try { - store.deleteCert(cert); - } catch (Exception ee) { - CMS.debug("RestoreKeyCertPanel importKeyCert: Exception=" + ee.toString()); + String subsystemtype = config.getString("preop.subsystem.select", ""); + if (subsystemtype.equals("clone")) { + CMS.debug("RestoreKeyCertPanel: this is the clone subsystem"); + boolean cloneReady = ConfigurationUtils.isCertdbCloned(); + if (!cloneReady) { + CMS.debug("RestoreKeyCertPanel update: clone does not have all the certificates."); + throw new IOException("Clone is not ready"); } - - KeyGenerator kg = token.getKeyGenerator(KeyGenAlgorithm.DES3); - SymmetricKey sk = kg.generate(); - byte iv[] = { 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 }; - IVParameterSpec param = new IVParameterSpec(iv); - Cipher c = token.getCipherContext(EncryptionAlgorithm.DES3_CBC_PAD); - c.initEncrypt(sk, param); - byte[] encpkey = c.doFinal(pkey); - - KeyWrapper wrapper = token.getKeyWrapper(KeyWrapAlgorithm.DES3_CBC_PAD); - wrapper.initUnwrap(sk, param); - wrapper.unwrapPrivate(encpkey, getPrivateKeyType(publickey), publickey); - - } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel importkeycert: Exception=" + e.toString()); } - } - for (int i = 0; i < cert_collection.size(); i++) { - try { - Vector<Object> cert_v = cert_collection.elementAt(i); - byte[] cert = (byte[]) cert_v.elementAt(0); - if (cert_v.size() > 1) { - String name = (String) cert_v.elementAt(1); - // we need to delete the trusted CA certificate if it is - // the same as the ca signing certificate - if (isCASigningCert(name)) { - X509Certificate certchain = getX509CertFromToken(cert); - if (certchain != null) { - CryptoToken token = cm.getInternalKeyStorageToken(); - CryptoStore store = token.getCryptoStore(); - CMS.debug("RestoreKeyCertPanel deleteCert: this is pk11store"); - if (store instanceof PK11Store) { - try { - PK11Store pk11store = (PK11Store) store; - pk11store.deleteCertOnly(certchain); - } catch (Exception ee) { - CMS.debug("RestoreKeyCertPanel importKeyCert: Exception=" + ee.toString()); - } - } - } - } - - X509Certificate xcert = cm.importUserCACertPackage(cert, name); - if (name.startsWith("caSigningCert")) { - // we need to change the trust attribute to CT - InternalCertificate icert = (InternalCertificate) xcert; - icert.setSSLTrust(InternalCertificate.TRUSTED_CA - | InternalCertificate.TRUSTED_CLIENT_CA - | InternalCertificate.VALID_CA); - } else if (name.startsWith("auditSigningCert")) { - InternalCertificate icert = (InternalCertificate) xcert; - icert.setObjectSigningTrust(InternalCertificate.USER - | InternalCertificate.VALID_PEER | InternalCertificate.TRUSTED_PEER); - } - } else - cm.importCACertPackage(cert); - } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel importkeycert: Exception=" + e.toString()); - } - } - } - - private boolean isCASigningCert(String name) { - String n = "preop.master.signing.nickname"; - IConfigStore cs = CMS.getConfigStore(); - try { - String nickname = cs.getString(n); - if (nickname.equals(name)) - return true; - } catch (Exception e) { - return false; - } - - return false; - } - - private X509Certificate getX509CertFromToken(byte[] cert) - throws IOException { - try { - X509CertImpl impl = new X509CertImpl(cert); - String issuer_impl = impl.getIssuerDN().toString(); - BigInteger serial_impl = impl.getSerialNumber(); - CryptoManager cm = CryptoManager.getInstance(); - X509Certificate[] permcerts = cm.getPermCerts(); - for (int i = 0; i < permcerts.length; i++) { - String issuer_p = permcerts[i].getSubjectDN().toString(); - BigInteger serial_p = permcerts[i].getSerialNumber(); - if (issuer_p.equals(issuer_impl) && serial_p.compareTo(serial_impl) == 0) { - return permcerts[i]; - } - } + config.putBoolean("preop.restorekeycert.done", true); + config.commit(false); } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel getX509CertFromToken: Exception=" + e.toString()); + CMS.debug("RestoreKeyCertPanel update: exception thrown:" + e); + e.printStackTrace(); + context.put("errorString", e.toString()); + context.put("updateStatus", "failure"); + throw new IOException(e); } - return null; - } - - private byte[] getX509Cert(String nickname, Vector<Vector<Object>> cert_collection) - throws IOException { - for (int i = 0; i < cert_collection.size(); i++) { - Vector<Object> v = cert_collection.elementAt(i); - byte[] b = (byte[]) v.elementAt(0); - X509CertImpl impl = null; - try { - impl = new X509CertImpl(b); - } catch (Exception e) { - CMS.debug("RestoreKeyCertPanel getX509Cert: Exception=" + e.toString()); - throw new IOException(e.toString()); - } - Principal subjectdn = impl.getSubjectDN(); - if (LDAPDN.equals(subjectdn.toString(), nickname)) - return b; - } - - return null; + context.put("updateStatus", "success"); } /** - * If validiate() returns false, this method will be called. + * If validate() returns false, this method will be called. */ public void displayError(HttpServletRequest request, HttpServletResponse response, @@ -682,37 +228,4 @@ public class RestoreKeyCertPanel extends WizardPanelBase { context.put("path", ""); context.put("panel", "admin/console/config/restorekeycertpanel.vm"); } - - private boolean isCertdbCloned(HttpServletRequest request, - Context context) { - IConfigStore config = CMS.getConfigStore(); - String certList = ""; - try { - CryptoManager cm = CryptoManager.getInstance(); - certList = config.getString("preop.cert.list"); - StringTokenizer st = new StringTokenizer(certList, ","); - while (st.hasMoreTokens()) { - String token = st.nextToken(); - if (token.equals("sslserver")) - continue; - String tokenname = config.getString("preop.module.token", ""); - cm.getTokenByName(tokenname); // throw exception if token doesn't exist - String name1 = "preop.master." + token + ".nickname"; - String nickname = config.getString(name1, ""); - if (!tokenname.equals("Internal Key Storage Token") && - !tokenname.equals("internal")) - nickname = tokenname + ":" + nickname; - - CMS.debug("RestoreKeyCertPanel isCertdbCloned: " + nickname); - X509Certificate cert = cm.findCertByNickname(nickname); - if (cert == null) - return false; - } - } catch (Exception e) { - context.put("errorString", "Check your CS.cfg for cloning"); - return false; - } - - return true; - } } |