]> WPIA git - gigi.git/blob - util/org/cacert/gigi/util/SimpleSigner.java
SimpleSigner: update serial upon successfull creation.
[gigi.git] / util / org / cacert / gigi / util / SimpleSigner.java
1 package org.cacert.gigi.util;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileReader;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.math.BigInteger;
9 import java.security.GeneralSecurityException;
10 import java.security.cert.CertificateFactory;
11 import java.security.cert.X509Certificate;
12 import java.sql.PreparedStatement;
13 import java.sql.ResultSet;
14 import java.sql.SQLException;
15 import java.util.Properties;
16
17 import org.cacert.gigi.database.DatabaseConnection;
18
19 public class SimpleSigner {
20         private static PreparedStatement warnMail;
21         private static PreparedStatement updateMail;
22         private static PreparedStatement readyMail;
23         private static PreparedStatement revoke;
24         private static PreparedStatement revokeCompleted;
25
26         public static void main(String[] args) throws IOException, SQLException, InterruptedException {
27                 Properties p = new Properties();
28                 p.load(new FileReader("config/gigi.properties"));
29                 DatabaseConnection.init(p);
30
31                 readyMail = DatabaseConnection.getInstance().prepare(
32                                 "SELECT id, csr_name, subject FROM emailcerts" + " WHERE csr_name is not null"//
33                                                 + " AND created=0"//
34                                                 + " AND crt_name=''"//
35                                                 + " AND warning<3");
36
37                 updateMail = DatabaseConnection.getInstance().prepare(
38                                 "UPDATE emailcerts SET crt_name=?," + " created=NOW(), serial=? WHERE id=?");
39                 warnMail = DatabaseConnection.getInstance().prepare("UPDATE emailcerts SET warning=warning+1 WHERE id=?");
40
41                 revoke = DatabaseConnection.getInstance().prepare(
42                                 "SELECT id, csr_name FROM emailcerts" + " WHERE csr_name is not null"//
43                                                 + " AND created != 0"//
44                                                 + " AND revoked = '1970-01-01'");
45                 revokeCompleted = DatabaseConnection.getInstance().prepare("UPDATE emailcerts SET revoked=NOW() WHERE id=?");
46                 gencrl();
47                 while (true) {
48                         System.out.println("ping");
49                         signCertificates();
50                         revokeCertificates();
51                         Thread.sleep(5000);
52                 }
53         }
54
55         private static void revokeCertificates() throws SQLException, IOException, InterruptedException {
56                 ResultSet rs = revoke.executeQuery();
57                 boolean worked = false;
58                 while (rs.next()) {
59                         int id = rs.getInt(1);
60                         File crt = KeyStorage.locateCrt(id);
61                         String[] call = new String[] { "openssl", "ca",//
62                                         "-cert", "testca.crt",//
63                                         "-keyfile", "testca.key",//
64                                         "-revoke", "../" + crt.getPath(),//
65                                         "-batch",//
66                                         "-config", "selfsign.config"
67
68                         };
69                         Process p1 = Runtime.getRuntime().exec(call, null, new File("keys"));
70                         System.out.println("revoking: " + crt.getPath());
71                         if (p1.waitFor() == 0) {
72                                 worked = true;
73                                 revokeCompleted.setInt(1, id);
74                                 revokeCompleted.execute();
75                         } else {
76                                 System.out.println("Failed");
77                         }
78                 }
79                 if (worked) {
80                         gencrl();
81                 }
82         }
83
84         private static void gencrl() throws IOException, InterruptedException {
85                 String[] call = new String[] { "openssl", "ca",//
86                                 "-cert", "testca.crt",//
87                                 "-keyfile", "testca.key",//
88                                 "-gencrl",//
89                                 "-crlhours",//
90                                 "12",//
91                                 "-out", "testca.crl",//
92                                 "-config", "selfsign.config"
93
94                 };
95                 Process p1 = Runtime.getRuntime().exec(call, null, new File("keys"));
96                 if (p1.waitFor() != 0) {
97                         System.out.println("Error while generating crl.");
98                 }
99         }
100
101         private static void signCertificates() throws SQLException, IOException, InterruptedException {
102                 ResultSet rs = readyMail.executeQuery();
103                 while (rs.next()) {
104                         String csrname = rs.getString(2);
105                         System.out.println("sign: " + csrname);
106                         int id = rs.getInt(1);
107                         File crt = KeyStorage.locateCrt(id);
108                         String[] call = new String[] { "openssl", "ca",//
109                                         "-cert", "testca.crt",//
110                                         "-keyfile", "testca.key",//
111                                         "-in", "../" + csrname,//
112                                         "-out", "../" + crt.getPath(),//
113                                         "-days", "356",//
114                                         "-batch",//
115                                         "-subj", rs.getString(3),//
116                                         "-config", "selfsign.config"
117
118                         };
119                         Process p1 = Runtime.getRuntime().exec(call, null, new File("keys"));
120
121                         int waitFor = p1.waitFor();
122                         if (waitFor == 0) {
123                                 try (InputStream is = new FileInputStream(crt)) {
124                                         CertificateFactory cf = CertificateFactory.getInstance("X.509");
125                                         X509Certificate crtp = (X509Certificate) cf.generateCertificate(is);
126                                         BigInteger serial = crtp.getSerialNumber();
127                                         updateMail.setString(1, crt.getPath());
128                                         updateMail.setString(2, serial.toString());
129                                         updateMail.setInt(3, id);
130                                         updateMail.execute();
131                                         System.out.println("sign: " + id);
132                                         continue;
133                                 } catch (GeneralSecurityException e) {
134                                         e.printStackTrace();
135                                 }
136                                 System.out.println("ERROR: " + id);
137                                 warnMail.setInt(1, id);
138                                 warnMail.execute();
139                         } else {
140                                 System.out.println("ERROR: " + id);
141                                 warnMail.setInt(1, id);
142                                 warnMail.execute();
143                         }
144
145                 }
146                 rs.close();
147         }
148 }