2015-04-02 7 views
1

Это первый раз, когда я размещаю вопрос на этом портале. У меня есть доменное имя почтового сервера zimbra и порт-587. он дает следующее исключение, когда я пытаюсь создать сертификат.Почтовый сервер Zimbra - как создать сертификат аутентификации для почтового сервера zimbra

package com.test; 


import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.security.KeyStore; 
import java.security.MessageDigest; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLException; 
import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.TrustManagerFactory; 
import javax.net.ssl.X509TrustManager; 

public class InstallCert { 

    public static void main(String args[]) throws Exception { 
     String host; 
     int port; 
     char[] passphrase; 
     if ((args.length == 1) || (args.length == 2)) { 
      final String[] c = args[0].split(":"); 
      host = c[0]; 
      port = (c.length == 1) ? 443 : Integer.parseInt(c[1]); 
      final String p = (args.length == 1) ? "changeit" : args[1]; 
      passphrase = p.toCharArray(); 
     } else { 
      host = "mail.clientname.com"; 
      port = 587; 
      final String p= "changeit"; 
      passphrase = p.toCharArray(); 
      System.out.println(
        "Usage: java InstallCert <host>[:port] [passphrase]"); 
      // return; 
     } 

     File file = new File("jssecacerts"); 
     if (file.isFile() == false) { 
      final char SEP = File.separatorChar; 
      final 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 + "..."); 
     final InputStream in = new FileInputStream(file); 
     final KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
     ks.load(in, passphrase); 
     in.close(); 

     final SSLContext context = SSLContext.getInstance("TLS"); 
     final TrustManagerFactory tmf = 
       TrustManagerFactory.getInstance(TrustManagerFactory 
         .getDefaultAlgorithm()); 
     tmf.init(ks); 
     final X509TrustManager defaultTrustManager = 
       (X509TrustManager) tmf.getTrustManagers()[0]; 
     final SavingTrustManager tm = new SavingTrustManager(
       defaultTrustManager); 
     context.init(null, new TrustManager[] { tm }, null); 
     final SSLSocketFactory factory = context.getSocketFactory(); 

     System.out.println("Opening connection to " 
       + host + ":" + port + "..."); 
     final SSLSocket socket = (SSLSocket) factory.createSocket(host, port); 
     socket.setSoTimeout(10000); 
     try { 
      System.out.println("Starting SSL handshake..."); 
      socket.startHandshake(); 
      socket.close(); 
      System.out.println(); 
      System.out.println("No errors, certificate is already trusted"); 
     } catch (final SSLException e) { 
      System.out.println("palu"); 
      e.printStackTrace(System.out); 
     } 

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

     final BufferedReader reader = 
       new BufferedReader(new InputStreamReader(System.in)); 

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

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

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

     final OutputStream out = new FileOutputStream(file); 
     ks.store(out, passphrase); 
     out.close(); 

     System.out.println(); 
     System.out.println(cert); 
     System.out.println(); 
     System.out.println(
       "Added certificate to keystore 'cacerts' using alias '" 
         + alias + "'"); 
    } 

    private static final char[] HEXDIGITS = "abcdef".toCharArray(); 

    private static String toHexString(final byte[] bytes) { 
     final 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(final X509TrustManager tm) { 
      this.tm = tm; 
     } 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return new X509Certificate[0]; 
      // throw new UnsupportedOperationException(); 
     } 

     @Override 
     public void checkClientTrusted(final X509Certificate[] chain, 
       final String authType) 
       throws CertificateException { 
      throw new UnsupportedOperationException(); 
     } 

     @Override 
     public void checkServerTrusted(final X509Certificate[] chain, 
       final String authType) 
       throws CertificateException { 
      this.chain = chain; 
      this.tm.checkServerTrusted(chain, authType); 
     } 
    } 
} 

при выполнении он дает следующее исключение ----

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 
    at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:671) 
    at sun.security.ssl.InputRecord.read(InputRecord.java:504) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) 
    at com.test.InstallCert.main(InstallCert.java:81) 
Could not obtain server certificate chain 

смотрите ниже ссылку

я получил код от here

ответ

0

единого сервера или нескольких сервер? один домен или несколько доменов? самостоятельно подписанный или коммерческий сертификат?

Это связано с тем, что вы разговариваете с HTTP-сервером, а не с сервером HTTPS. Вы использовали правильный номер порта для HTTPS?

+0

Спасибо khondhu за ур ответ. на самом деле мой клин хочет отправить электронное письмо своему клиенту с использованием своего доменного имени. для которых они используют сервер zimbra. они предоставили нам некоторые php-файлы, и мы можем отправлять почту, но как самостоятельную заявку. Основная проблема заключается в том, что я не знаю, как использовать их в своем веб-приложении (java/j2ee). для другого клиента я использую [email protected] если вам нужна дополнительная информация, которую я могу предоставить вам. – user3129664

+0

Итак, вы используете это «почтовое приложение php» в качестве своего клиента, а рассматриваемый сервер - сервер zimbra, на который вы получаете исключение SSL. Вы пытались связаться через SMTP-порт 25? Вы не предоставили достаточно информации в открывающемся вопросе, чтобы кто-нибудь мог помочь вам здесь. – khondhu

+0

На самом деле мой клиент устанавливает почтовый сервер Zimbra на своем сервере, и мы используем mail api в наших инструментах Bi, чтобы отправлять почту клиенту клиента как [email protected] в качестве имени отправителя. Здесь мы smtp предоставлены Gmail. Но теперь они хотят отправлять почту с использованием сервера Zimbra и с именем своих компаний в качестве имени домена. Они устанавливают почтовый сервер Zimbra на свой сервер и задают имя домена, адрес электронной почты и порт для его настройки. На данный момент я не очень понимаю, как его настроить. Поэтому сначала я попытался использовать Java-код, а затем php, но не смог ничего сделать. Пожалуйста, помогите и позвольте мне выйти из этого беспорядка. – user3129664