2017-08-03 181 views
1

我有从其他service.On的Java Web服务x509证书接收x509证书Java Web服务是序列化到字节数组使用此代码snipppetx509证书为byte []在Java和回X509证书在C#

for (X509Certificate certificate : certs) { 
       try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { 
        try (ObjectOutput out = new ObjectOutputStream(bos)) { 
         out.writeObject(certificate); 
         wrapper = new CustomMapCertificateWrapper(); 
         wrapper.setCustomValue(bos.toByteArray()); 
         response.getCustomMapCertificateWrapper().add(wrapper); 
        } 
       } 

这里的CustomMapCertificateWrapper是byte []值为field的类,它将x509certificate存储为字节数组。我的.NET服务接收这个对象CustomMapCertificateWrapper我尝试生成的C#侧x509证书使用此代码段

//Do array reverse because of BigEndian difference between Java and c# languages 
Array.Reverse(customMapCertificateWrapper.value); 

         var certificate = new X509Certificate(customMapCertificateWrapper.value); 

此代码抛出我expcetion像下面

System.Security.Cryptography.CryptographicException: Cannot find the requested object. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte[] rawData) 
    at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags) 
    at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData) 
+0

你是否尝试禁用endianess(不反转字节)? – Crypt32

+0

@ Crypt32我试过了,不起作用( – Huseyn

回答

0

Java的ObjectOutputStream生成设计的输出要读在Java的ObjectInputStream中。它不会产生标准的,语言无关的结果。

为便于携带,您应该使用Certificate.getEncoded()方法序列化Java X509Certificate。然后可以在C#端使用该输出作为构造函数X509Certificate()X509Certificate2()byte[]参数。

+0

)谢谢,你说得对,使用getEncoded()给出了可以在c#X509Certificate(byte [])中使用的所需字节[]。 – Huseyn