Я использую версию 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 правильно?