Java - отправка сертификата через сокет

мне нужно отправить v3certificate с сервера на клиент с помощью сокета. Для этого: на стороне сервера я генерирую сертификат, который кодирую с помощью base64.encode, затем отправляю его клиенту. На стороне клиента я получаю строку, содержащую сертификат,

Код сервера:

 X509Certificate certificate = ...;
 sendAnswer(new String(certificate.getEncoded()));

public static void sendAnswer(String ans) {
    try {
        s.shutdownInput();
        PrintWriter output = new PrintWriter(s.getOutputStream(), true);
        output.println(new String(Base64.encode(ans.getBytes())));
        output.close();

    } catch (IOException ex) {
        Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Код клиента

 String value = sendMessage(..);//method which receive the certificate from the server

 InputStream inStream = null;
 X509Certificate cert=null;
 inStream = new ByteArrayInputStream(value.getBytes());
 CertificateFactory cf = CertificateFactory.getInstance("X.509","BC");
 cert = (X509Certificate)cf.generateCertificate(inStream);

public static String sendMessage(String url, int port, String tag, byte[] mex1) {

    Socket link;
    String reply = "";

    byte[] replyDec = null;

        link = new Socket(InetAddress.getByName(url), port);
        InputStream i = null;
        try {
            i = link.getInputStream();
        } catch (IOException ex) {
            Logger.getLogger(ClientApp.class.getName()).log(Level.SEVERE, null, ex);
        }
        Scanner input = new Scanner(i);

        while (input.hasNextLine()) {
            reply += input.nextLine();
        }
        replyDec = Base64.decode(reply);
        input.close();
        link.close();


    return new String(replyDec);
}

Почти все работает, на стороне клиента, если я печатаю полученную строку, я получаю текст, содержащий дополнительный символ и данные сертификата. Но это дает мне ошибку при создании сертификата на стороне клиента. Это ошибка:

java.security.cert.CertificateException: java.io.IOException: DER length more than 4 bytes: 111 at org.bouncycastle.jce.provider.JDKX509CertificateFactory.engineGenerateCertificate(Unknown Source) at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:322)

и это линия, из которой он исходит

cert = (X509Certificate) cf.generateCertificate(inStream);

Кто-нибудь может мне помочь?

заранее спасибо


person michele    schedule 02.08.2010    source источник
comment
Ваше использование строк совершенно неправильно. Сертификаты представляют собой байтовые массивы, а байтовые массивы не могут быть правильно сохранены в String.   -  person President James K. Polk    schedule 03.08.2010


Ответы (3)


Отбросьте все это и используйте SSL, который уже все это делает.

person user207421    schedule 03.08.2010

Вы можете отправить сертификат через сокет потоком байтов:

на стороне отправителя после настройки сокета:

ObjectOutputStream toServer;
toServer = new ObjectOutputStream(socket.getOutputStream());
byte[] frame = theCertificate.getEncoded();
toServer.writeObject(frame);

на стороне приемника после настройки сокета:

ObjectInputStream fromClient;
fromClient = new ObjectInputStream(socket.getInputStream());
byte[] cert = fromClient.readObject();
java.security.cert.Certificate jsCert = CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(cert));

теперь вы можете использовать этот сертификат. например, как получение открытого ключа:

PublicKey thepublicKey = jsCert.getPublicKey();
person Nima Soroush    schedule 18.01.2014

Вполне возможно, что ваша проблема может быть связана с использованием PrintWriter для отправки и, возможно, с чем-то другим для чтения (сканером). Вы можете попробовать использовать StringWriter и StringReader, чтобы иметь совпадение на обоих концах, а затем вы также можете отлаживать, если то, что вы отправляете, идеально соответствует тому, что вы получаете.

person Paul Jowett    schedule 03.08.2010