Cassifying Zimbra 5

Revision as of 08:49, 28 March 2008 by Klug (talk | contribs) (Generation of the SSL_Certificate with Java Keytool)


This document allows guiding you in the process of cassifying Zimbra Collaboration Suite 5.

Installation of the Cas Client

Download the CAS Client Java 2.1.0 from "".

Untar the downloaded file:

# tar xzvf cas-client-java-2.1.0.tar.gz   

Then copy the CASclient JAR file to Jetty's lib directory

# cp cas-client-java-2.1.10/dist/casclient.jar /opt/zimbra/jetty/common/lib

Configuration of the Server Zimbra

Edit the file "" (/opt/zimbra/jetty/etc) Add the following information after sections "<filter>" and "<filter-mapping>" and before the first section of "<servlet>" (by adapting them): //A ScreenShot is missing

Generation of the SSL_Certificate with Java Keytool

Important Note: It is necessary to delete the certificate if it already exists by using the following commands:

# keytool -delete -alias cas -keystore %JAVA_HOME%/jre/lib/security/cacerts
# Keytool -delete -alias cas -file server.cert 

If you don't know the name of the certificates (or if these commands did not succeed), you can delete the ".keystore" file in root's homedire and "cacerts" files in "/opt/java/jre/lib/security":

# rm /opt/java/jre/lib/security/cacerts 
# rm /root/.keystore 

Generate the certificate by the following command:

# keytool -genkey -alias cas -keypass changeit -keyalg RSA

Enter ‘changeit’ for the password Answer the list of questions. //A ScreenShot is missing

Export the certificate you generated from your personal keystore by the following command:

# keytool -export -alias cas -keypass changeit -file server.cert 

Enter ‘changeit’ for the password. //A ScreenShot is missing

Import the certificate into Java's keystore with this command:

# keytool -import -alias cas -file server.cert -keypass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts

Enter ‘changeit’ for the password. Answer by 'oui' to add the certificate to the keystore. //A ScreenShot is missing

Validation of the Certificate: Download the class from and modify it to comment out some lines :




public class InstallCert {

    public static void main(String[] args) throws Exception {
	String host;
	int port;
	char[] passphrase;
	args = new String[1];
	if ((args.length == 1) || (args.length == 2)) {
	    String[] c = args[0].split(":");
	    host = c[0];
	    port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
	    String p = (args.length == 1) ? "changeit" : args[1];
	    passphrase = p.toCharArray();
	} else {
	    System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
//for my windows and java
	File file = new File("/opt/zimbra/java/jre/lib/security/cacerts");
//	if (file.isFile() == false) {
//	    char SEP = File.separatorChar;
//	    File dir = new File(System.getProperty("java.home") + SEP
//		    + "lib" + SEP + "security");
//	    file = new File(dir, "jssecacerts");
//	    if (file.isFile() == false) {
//		file = new File(dir, "cacerts");
//	    }
//	}
	System.out.println("Loading KeyStore " + file + "...");
	InputStream in = new FileInputStream(file);
	KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
	ks.load(in, passphrase);

	SSLContext context = SSLContext.getInstance("TLS");
	TrustManagerFactory tmf =
	X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
	SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
	context.init(null, new TrustManager[] {tm}, null);
	SSLSocketFactory factory = context.getSocketFactory();
	System.out.println("Opening connection to " + host + ":" + port + "...");
	SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
	try {
	    System.out.println("Starting SSL handshake...");
	    System.out.println("No errors, certificate is already trusted");
	} catch (SSLException e) {

	X509Certificate[] chain = tm.chain;
	if (chain == null) {
	    System.out.println("Could not obtain server certificate chain");

	BufferedReader reader =
		new BufferedReader(new InputStreamReader(;

	System.out.println("Server sent " + chain.length + " certificate(s):");
	MessageDigest sha1 = MessageDigest.getInstance("SHA1");
	MessageDigest md5 = MessageDigest.getInstance("MD5");
	for (int i = 0; i < chain.length; i++) {
	    X509Certificate cert = chain[i];
	    	(" " + (i + 1) + " Subject " + cert.getSubjectDN());
	    System.out.println("   Issuer  " + cert.getIssuerDN());
	    System.out.println("   sha1    " + toHexString(sha1.digest()));
	    System.out.println("   md5     " + toHexString(md5.digest()));

	System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
	String line = reader.readLine().trim();
	int k;
	try {
	    k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
	} catch (NumberFormatException e) {
	    System.out.println("KeyStore not changed");

	X509Certificate cert = chain[k];
	String alias = host + "-" + (k + 1);
	ks.setCertificateEntry(alias, cert);

	OutputStream out = new FileOutputStream("/opt/zimbra/java/jre/lib/security/cacerts");, passphrase);

		("Added certificate to keystore 'jssecacerts' using alias '"
		+ alias + "'");
	 String gdzie = new String(System.getProperty("java.home//") +
			   "lib//"   + "security");
    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
    private static String toHexString(byte[] bytes) {
	StringBuilder sb = new StringBuilder(bytes.length * 3);
	for (int b : bytes) {
	    b &= 0xff;
	    sb.append(HEXDIGITS[b >> 4]);
	    sb.append(HEXDIGITS[b & 15]);
	    sb.append(' ');
	return sb.toString();

    private static class SavingTrustManager implements X509TrustManager {
	private final X509TrustManager tm;
	private X509Certificate[] chain;
	SavingTrustManager(X509TrustManager tm) { = tm;
	public X509Certificate[] getAcceptedIssuers() {
	    throw new UnsupportedOperationException();
	public void checkClientTrusted(X509Certificate[] chain, String authType)
		throws CertificateException {
	    throw new UnsupportedOperationException();
	public void checkServerTrusted(X509Certificate[] chain, String authType)
		throws CertificateException {
	    this.chain = chain;
	    tm.checkServerTrusted(chain, authType);


Compile and execute the class downloaded by the commands:

# javac

Launch the CAS Server and execute the following command:

# java InstallCert 

//A ScreenShot is missing

Answer the composed question by typing "Enter" //A ScreenShot is missing

Execute the zmprov command: Launch the Server Zimbra Under the user "zimbra", execute the command:

# zmprov gdpak Domaine_Name

(This will create a preAuthKey" as this one: "45a9743161d93f5c2e2194890bca9c1452e45078844ea0134e357709bf11a06f")

Note: To force the execution of the command zmprov you can add the option "-f" and the command will be: zmprov gdpak -f Domaine_Name

Configure the page "preauth.jsp" (Attachements): Under the user "root", copy the page "preauth.jsp" in the directory: "/opt/zimbra/jetty/webapps/zimbra" Replace the "DOMAIN_KEY" with the key which you produced with the "zmprov" in the previous stage. //A ScreenShot is missing

Modify the following lines towards the end of the JSP page, by substituting "domaine-name" by your domain: //A ScreenShot is missing

Restart Zimbra to identify the new "jar" and the files of configuration:

# su root
# su - zimbra
# zmcontrol stop
# zmcontrol start

Test the Cassified Zimbra’s Server: Lunch the CAS server Launch Zimbra in the Web browser with the url "" If everything is set up correctly you will be redirected to the CAS server’s login screen.File:Example.jpg

Verified Against: unknown Date Created: 3/18/2008
Article ID: Date Modified: 2008-03-28

Try Zimbra

Try Zimbra Collaboration with a 60-day free trial.
Get it now »

Want to get involved?

You can contribute in the Community, Wiki, Code, or development of Zimlets.
Find out more. »

Looking for a Video?

Visit our YouTube channel to get the latest webinars, technology news, product overviews, and so much more.
Go to the YouTube channel »

Jump to: navigation, search