]> WPIA git - gigi.git/commitdiff
[DB-Struct] implement SPKAC signing.
authorFelix Dörre <felix@dogcraft.de>
Tue, 22 Jul 2014 23:03:55 +0000 (01:03 +0200)
committerFelix Dörre <felix@dogcraft.de>
Tue, 22 Jul 2014 23:03:55 +0000 (01:03 +0200)
doc/tableStructure.sql
src/org/cacert/gigi/Certificate.java
src/org/cacert/gigi/pages/account/IssueCertificateForm.java
tests/org/cacert/gigi/TestCertificate.java
tests/org/cacert/gigi/TestSeparateSessionScope.java
util/org/cacert/gigi/util/SimpleSigner.java

index ceb11b3c6d3c00a642b4c8cd71e2ed800c06ded7..d3cf2471a5ea2dd5f564e5c867bf9c5c2763bbb1 100644 (file)
@@ -99,6 +99,7 @@ CREATE TABLE `emailcerts` (
   `type` enum('client', 'server') DEFAULT NULL,
 
   `csr_name` varchar(255) NOT NULL DEFAULT '',
+  `csr_type` enum('CSR', 'SPKAC') NOT NULL,
   `crt_name` varchar(255) NOT NULL DEFAULT '',
   `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
   `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
index 9e4e0fa7569914c6d47f9cca1ae861f2461aeb54..e1bd2d6d498b60952ddecfbae14953faf4196527 100644 (file)
@@ -19,6 +19,10 @@ import org.cacert.gigi.util.KeyStorage;
 import org.cacert.gigi.util.Notary;
 
 public class Certificate {
+       public enum CSRType {
+               CSR, SPKAC;
+       }
+
        private int id;
        private int ownerId;
        private String serial;
@@ -27,12 +31,14 @@ public class Certificate {
        private String csrName;
        private String crtName;
        private String csr = null;
+       private CSRType csrType;
 
-       public Certificate(int ownerId, String dn, String md, String csr) {
+       public Certificate(int ownerId, String dn, String md, String csr, CSRType csrType) {
                this.ownerId = ownerId;
                this.dn = dn;
                this.md = md;
                this.csr = csr;
+               this.csrType = csrType;
        }
 
        private Certificate(String serial) {
@@ -115,10 +121,12 @@ public class Certificate {
                Notary.writeUserAgreement(ownerId, "CCA", "issue certificate", "", true, 0);
 
                PreparedStatement inserter = DatabaseConnection.getInstance().prepare(
-                       "INSERT INTO emailcerts SET md=?, subject=?, crt_name='', memid=?");
+                       "INSERT INTO emailcerts SET md=?, subject=?, csr_type=?, crt_name='', memid=?");
                inserter.setString(1, md);
+               System.out.println(csrType.toString());
                inserter.setString(2, dn);
-               inserter.setInt(3, ownerId);
+               inserter.setString(3, csrType.toString());
+               inserter.setInt(4, ownerId);
                inserter.execute();
                id = DatabaseConnection.lastInsertId(inserter);
                File csrFile = KeyStorage.locateCsr(id);
@@ -172,6 +180,11 @@ public class Certificate {
        }
 
        public String getSerial() {
+               try {
+                       getStatus();
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               } // poll changes
                return serial;
        }
 
index a0dad7fd3753131eca9f003964f52d8103c9d182..da3a85b3a6f945abfa56acd02f0674fe74e4f178 100644 (file)
@@ -19,6 +19,7 @@ import org.cacert.gigi.Digest;
 import org.cacert.gigi.EmailAddress;
 import org.cacert.gigi.Language;
 import org.cacert.gigi.User;
+import org.cacert.gigi.Certificate.CSRType;
 import org.cacert.gigi.output.Form;
 import org.cacert.gigi.output.template.HashAlgorithms;
 import org.cacert.gigi.output.template.IterableDataset;
@@ -47,6 +48,7 @@ public class IssueCertificateForm extends Form {
        }
 
        Certificate result;
+       private CSRType csrType;
 
        public Certificate getResult() {
                return result;
@@ -55,7 +57,7 @@ public class IssueCertificateForm extends Form {
        @Override
        public boolean submit(PrintWriter out, HttpServletRequest req) {
                String csr = req.getParameter("CSR");
-               String spkac = req.getParameter("spkac");
+               String spkac = req.getParameter("SPKAC");
                try {
                        if (csr != null) {
                                PKCS10 parsed = parseCSR(csr);
@@ -79,8 +81,10 @@ public class IssueCertificateForm extends Form {
                                }
                                out.println("<br/>digest: sha256<br/>");
                                this.csr = csr;
+                               this.csrType = CSRType.CSR;
                        } else if (spkac != null) {
-
+                               this.csr = "SPKAC=" + spkac.replaceAll("[\r\n]", "");
+                               this.csrType = CSRType.SPKAC;
                        } else {
                                login = "1".equals(req.getParameter("login"));
                                String hashAlg = req.getParameter("hash_alg");
@@ -93,7 +97,7 @@ public class IssueCertificateForm extends Form {
                                }
                                System.out.println("issuing " + selectedDigest);
                                result = new Certificate(LoginPage.getUser(req).getId(), "/commonName=CAcert WoT User",
-                                       selectedDigest.toString(), this.csr);
+                                       selectedDigest.toString(), this.csr, this.csrType);
                                try {
                                        result.issue().waitFor(60000);
                                        return true;
index 484187970afba15274e5758a93868dd38731ffa0..f686498976fd8470ede64e3038e58bbd93ca100b 100644 (file)
@@ -6,6 +6,7 @@ import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 import java.sql.SQLException;
 
+import org.cacert.gigi.Certificate.CSRType;
 import org.cacert.gigi.Certificate.CertificateStatus;
 import org.cacert.gigi.testUtils.ManagedTest;
 import org.cacert.gigi.testUtils.PemKey;
@@ -18,7 +19,7 @@ public class TestCertificate extends ManagedTest {
        public void testClientCertLoginStates() throws IOException, GeneralSecurityException, SQLException,
                InterruptedException {
                String[] key1 = generateCSR("/CN=testmail@example.com");
-               Certificate c = new Certificate(1, "/CN=testmail@example.com", "sha256", key1[1]);
+               Certificate c = new Certificate(1, "/CN=testmail@example.com", "sha256", key1[1], CSRType.CSR);
                final PrivateKey pk = PemKey.parsePEMPrivateKey(key1[0]);
                c.issue().waitFor(60000);
                final X509Certificate ce = c.cert();
@@ -28,7 +29,7 @@ public class TestCertificate extends ManagedTest {
        @Test
        public void testCertLifeCycle() throws IOException, GeneralSecurityException, SQLException, InterruptedException {
                String[] key1 = generateCSR("/CN=testmail@example.com");
-               Certificate c = new Certificate(1, "/CN=testmail@example.com", "sha256", key1[1]);
+               Certificate c = new Certificate(1, "/CN=testmail@example.com", "sha256", key1[1], CSRType.CSR);
                final PrivateKey pk = PemKey.parsePEMPrivateKey(key1[0]);
 
                testFails(CertificateStatus.DRAFT, c);
index 29632bed28dd9e7a7453fd6f6390e19520e26c3f..d59c6c975d2f667bde1f75239a57a3f51c8c7819 100644 (file)
@@ -10,6 +10,7 @@ import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 import java.sql.SQLException;
 
+import org.cacert.gigi.Certificate.CSRType;
 import org.cacert.gigi.testUtils.ManagedTest;
 import org.cacert.gigi.testUtils.PemKey;
 import org.junit.Test;
@@ -24,7 +25,7 @@ public class TestSeparateSessionScope extends ManagedTest {
                int user = createAssuranceUser("test", "tugo", mail, TEST_PASSWORD);
                String cookie = login(mail, TEST_PASSWORD);
                String[] csr = generateCSR("/CN=felix@dogcraft.de");
-               Certificate c = new Certificate(user, "/CN=testmail@example.com", "sha256", csr[1]);
+               Certificate c = new Certificate(user, "/CN=testmail@example.com", "sha256", csr[1], CSRType.CSR);
                final PrivateKey pk = PemKey.parsePEMPrivateKey(csr[0]);
                c.issue().waitFor(60000);
                final X509Certificate ce = c.cert();
index 36e94bdccf7ab93e974a847dede588a11a6189e0..c471586c90447fab868b35c0a4469be98913be0f 100644 (file)
@@ -17,6 +17,7 @@ import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Properties;
 
+import org.cacert.gigi.Certificate.CSRType;
 import org.cacert.gigi.database.DatabaseConnection;
 
 public class SimpleSigner {
@@ -55,7 +56,7 @@ public class SimpleSigner {
                readyMail = DatabaseConnection
                        .getInstance()
                        .prepare(
-                               "SELECT emailcerts.id,emailcerts.csr_name,emailcerts.subject, jobs.id FROM jobs INNER JOIN emailcerts ON emailcerts.id=jobs.targetId"
+                               "SELECT emailcerts.id,emailcerts.csr_name,emailcerts.subject, jobs.id,csr_type FROM jobs INNER JOIN emailcerts ON emailcerts.id=jobs.targetId"
                                        + " WHERE jobs.state='open'"//
                                        + " AND task='sign'");
 
@@ -157,18 +158,23 @@ public class SimpleSigner {
                        String csrname = rs.getString(2);
                        System.out.println("sign: " + csrname);
                        int id = rs.getInt(1);
+                       String csrType = rs.getString(5);
+                       CSRType ct = CSRType.valueOf(csrType);
                        File crt = KeyStorage.locateCrt(id);
                        String[] call = new String[] { "openssl", "ca",//
+                                       "-in", "../" + csrname,//
                                        "-cert", "testca.crt",//
                                        "-keyfile", "testca.key",//
-                                       "-in", "../" + csrname,//
                                        "-out", "../" + crt.getPath(),//
                                        "-days", "356",//
                                        "-batch",//
                                        "-subj", rs.getString(3),//
-                                       "-config", "selfsign.config"
+                                       "-config", "selfsign.config"//
 
                        };
+                       if (ct == CSRType.SPKAC) {
+                               call[2] = "-spkac";
+                       }
                        Process p1 = Runtime.getRuntime().exec(call, null, new File("keys"));
 
                        int waitFor = p1.waitFor();