Получите Ocsp Ответ от Json String - PullRequest
0 голосов
/ 16 октября 2018

Я использую версию bouncycastle 15on для получения ocspResponse из OcspServer следующим образом:

public OCSPResp getOcspResponse(OCSPReq request, String urlStr){
    HttpURLConnection con = null;
    OutputStream out = null;
    DataOutputStream dataOut = null;
    try {
        byte[] array = request.getEncoded();
        URL url = new URL(urlStr);
        con = (HttpURLConnection) url.openConnection();
        con.setRequestProperty("Content-Type", "application/ocsp-request");
        con.setRequestProperty("Accept", "application/ocsp-response");
        con.setDoOutput(true);
        out = con.getOutputStream();
        dataOut = new DataOutputStream(new BufferedOutputStream(out));
        dataOut.write(array);
        dataOut.flush();
        if (con.getResponseCode() / 100 != 2)         
            throw new Exception(...);
        InputStream in = (InputStream) con.getContent();
        if (in == null) 
            throw new Exception(...);
        byte[] byteArrayInputStream = IOUtils.toByteArray(in);
        return new OCSPResp(byteArrayInputStream); 

    } catch (IOException e) {
    ...
    }finally {
    ...
    }
}

Затем я преобразую этот OCSPResp в jsonString, используя Gson version 2.2.4, однако из-за конструктора без аргументовпроблема Я не мог вернуть этот jsonString обратно в исходный объект bouncycastle, и у меня возникла ошибка (та же ошибка solution1).Погуглите меня, чтобы разработать два способа получения этого OCSPResp следующим образом, но никто не работает для меня:

Решение 1: Зарегистрируйте InstanceCreator в Gson

public class OCSPRespInstanceCreator implements InstanceCreator<OCSPResp> {    
    byte[] byteArrayInputStream = {48, -126, 6, ... , 27, 6, 67};    
    @Override
    public OCSPResp createInstance(Type type) {
        try {
            OCSPResp ocspResp = new OCSPResp(byteArrayInputStream);
            return ocspResp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Применение решения1:

public static void main(String[] args) {
    try {            
        String ocspJson = "{\"resp\":{\"responseStatus\":{\"value\":{\"bytes\":[0]}},\"responseBytes\":{\"responseType\":{\"identifier\":\"1.3.6.1.5.5.7.48.1.1\",\"body\":[43,6,1,5,5,7,48,1,1]},\"response\":{\"string\":[48,-126,6,51,48,...81,27,6,67]}}}}";                 
        Gson gson = new GsonBuilder().registerTypeAdapter(OCSPResp.class, new OCSPRespInstanceCreator()).create();
        OCSPResp ocspResp3 = gson.fromJson(ocspJson, OCSPResp.class);      
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Результат решения1:

java.lang.RuntimeException: Невозможно вызвать конструктор без аргументов дляКласс org.bouncycastle.asn1.ASN1OctetString.Регистрация InstanceCreator в Gson для этого типа может решить эту проблему.

Solution2: Использование flexjson версии 3.2

public static void main(String[] args) {
    try {
        String ocspJson = "{\"resp\":{\"responseStatus\":{\"value\":{\"bytes\":[0]}},\"responseBytes\":{\"responseType\":{\"identifier\":\"1.3.6.1.5.5.7.48.1.1\",\"body\":[43,6,1,5,5,7,48,1,1]},\"response\":{\"string\":[48,-126,6,51,48,-127,...,-46,108,81,27,6,67]}}}}";
        OCSPResp ocspResp = new JSONDeserializer<OCSPResp>().deserialize(ocspJson);        
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Результат решения2:

java.lang.ClassCastException: java.util.HashMap нельзя преобразовать в org.bouncycastle.cert.ocsp.OCSPResp

В чем заключаются проблемыэти решения?Есть ли третье решение, которое вернет jsonString обратно к исходному OCSPResp объекту bouncycastle правильно?

...