我需要使用socket从服务器向客户端发送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);
任何人都可以帮助我?
提前致谢
答案 0 :(得分:2)
扔掉它并使用SSL,它已经完成了所有这些。
答案 1 :(得分:0)
您的问题可能是由于使用PrintWriter发送,以及可能有不同的内容(扫描程序)。您可以尝试使用StringWriter和StringReader在任一端匹配,然后您也可以调试,如果您发送的内容与您收到的内容完美匹配。
答案 2 :(得分:0)
您可以通过套接字按字节流发送证书:
配置socket后在发送方:
ObjectOutputStream toServer;
toServer = new ObjectOutputStream(socket.getOutputStream());
byte[] frame = theCertificate.getEncoded();
toServer.writeObject(frame);
在配置socket之后在接收方:
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();