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.