Kvůli projektu WinStrom a hlavně jeho novému serveru, jsme potřebovali při prvním spuštění systému vygenerovat self-signed certifikát. Certifikát totiž nemůže být podepsán žádnou certifikační autoritou, protože je možné aplikaci libovolně instalovat a jenom bychom vše zkomlpikovali (podobně je to i s SSH klíči při instalaci Linuxu).
Protože jsme potřebovali podporu více platforem a protože nechceme komplikovat instalaci a detekci nástrojů, nemohli jsem použít ani openssl ani keytool.
Pro Javu naštěstí existuje snadná cesta programově:
try {
long validityInDays = 100000;
String alias = "winstrom";
String name = "CN=WinStrom Server, O=WinStrom s.r.o.";
char[] keyPass = "".toCharArray();
/* generate keypair */
CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA");
X500Name x500Name = new X500Name(name);
keypair.generate(1024); /* 1024 bit */
PrivateKey privKey = keypair.getPrivateKey();
X509Certificate[] chain = new X509Certificate[1];
/* sign certificate */
chain[0] = keypair.getSelfCertificate(x500Name, validityInDays * 24L * 60L * 60L);
chain[0].checkValidity();
/* create empty keystore */
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, keyPass);
/* store new certificate */
keyStore.setKeyEntry(alias, privKey, keyPass, chain);
return keyStore;
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
Kód je extrahován z keytool z OpenJDK.
Na vývoj již používám hlavně jen OpenJDK, protože je možné se podívat v Eclipse do všech zdrojáků (tedy i těch v com.sun.*). Problémy se pak hledají mnohem snáze.
Pěkný návod, to se může hodit 🙂
Jen moc nechápu to toCharArray(),
vždyť přece:
char[] prvni = „“.toCharArray();
char[] druhy = new char[0];
System.out.println(Arrays.equals(prvni, druhy));
Nebo je to jen z výukových důvodů, kdyby tam někdo to heslo chtěl dopsat?
Franta: ano, bylo to myšleno přesně tak.