Java-通过socket发送证书

Java-通过socket发送证书,java,sockets,certificate,bouncycastle,Java,Sockets,Certificate,Bouncycastle,我需要使用套接字将V3C证书从服务器发送到客户端。 为此: 在服务器端,我生成一个用base64.encode编码的证书,然后将其发送到客户端。 客户端,我收到包含证书的字符串 服务器代码: X509Certificate certificate = ...; sendAnswer(new String(certificate.getEncoded())); public static void sendAnswer(String ans) { try { s.sh

我需要使用套接字将V3C证书从服务器发送到客户端。 为此: 在服务器端,我生成一个用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长度超过4字节:111
位于org.bouncycastle.jce.provider.JDKX509CertificateFactory.engineGenerateCertificate(未知来源)
位于java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:322)

这就是它的来源

cert = (X509Certificate) cf.generateCertificate(inStream);
有人能帮我吗


提前感谢

扔掉它,使用SSL,它已经做到了这一切。

扔掉它,使用SSL,它已经做到了这一切。

看起来您的问题可能是由于使用PrintWriter发送,可能是由于使用不同的读取方式(扫描仪)。您可以尝试使用StringWriter和StringReader在两端进行匹配,然后还可以调试您发送的内容是否与您接收的内容完全匹配。

您的问题可能是由于使用PrintWriter发送,也可能是由于使用了与读取不同的内容(扫描仪)。您可以尝试使用StringWriter和StringReader在两端进行匹配,然后还可以调试您发送的内容是否与您接收的内容完全匹配。

您可以通过套接字按字节流发送证书:

配置套接字后,在发送方:

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));
在配置插座后的接收器侧:

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();

您可以通过套接字按字节流发送证书:

配置套接字后,在发送方:

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));
在配置插座后的接收器侧:

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();

你使用字符串是完全错误的。证书是字节数组,字节数组不能正确地存储在字符串中。使用字符串是完全错误的。证书是字节数组,字节数组不能正确地存储在字符串中。