2013-02-26 52 views
7

Tôi đã tạo ứng dụng OCSP bằng API lâu đài Bouncy. Tôi gặp khó khăn trong việc tìm kiếm Trạng thái Chứng chỉ (Nói rằng liệu nó có bị thu hồi hay không) từ phản hồi OCSP mà tôi nhận được. Giá trị trả về từ resp.getCertStatus() luôn là null. Đây là cách tôi tạo yêu cầu OCSP.Phản hồi OCSP không cung cấp Trạng thái chứng chỉ

private OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber) 
     throws CertificateVerificationException { 

    //Add provider BC 
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
    try { 
     // CertID structure is used to uniquely identify certificates that are the subject of 
     // an OCSP request or response and has an ASN.1 definition. CertID structure is defined in RFC 2560 
     CertificateID id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber); 

     // basic request generation with nonce 
     OCSPReqGenerator generator = new OCSPReqGenerator(); 
     generator.addRequest(id); 

     // create details for nonce extension. The nonce extension is used to bind 
     // a request to a response to prevent replay attacks. As the name implies, 
     // the nonce value is something that the client should only use once within a reasonably small period. 
     BigInteger nonce = BigInteger.valueOf(System.currentTimeMillis()); 
     Vector objectIdentifiers = new Vector(); 
     Vector values = new Vector(); 

     //to create the request Extension 
     objectIdentifiers.add(OCSPObjectIdentifiers.id_pkix_ocsp_nonce); 
     values.add(new X509Extension(false, new DEROctetString(nonce.toByteArray()))); 
     generator.setRequestExtensions(new X509Extensions(objectIdentifiers, values)); 

     return generator.generate(); 
    } 
    catch (OCSPException e) { 
     e.printStackTrace(); 
     throw new CertificateVerificationException("Cannot generate OSCP Request with the given certificate",e); 
    } 
} 

Tôi nhận được phản hồi OCSP từ URL dịch vụ như sau.

private OCSPResp getOCSPResponce(String serviceUrl, OCSPReq request) throws CertificateVerificationException { 

    try { 
     byte[] array = request.getEncoded(); 
     if (serviceUrl.startsWith("http")) { 
      HttpURLConnection con; 
      URL url = new URL(serviceUrl); 
      con = (HttpURLConnection) url.openConnection(); 
      con.setRequestProperty("Content-Type", "application/ocsp-request"); 
      con.setRequestProperty("Accept", "application/ocsp-response"); 
      con.setDoOutput(true); 
      OutputStream out = con.getOutputStream(); 
      DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(out)); 
      dataOut.write(array); 

      dataOut.flush(); 
      dataOut.close(); 

      //Get Response 
      InputStream in = (InputStream) con.getContent(); 
      OCSPResp ocspResponse = new OCSPResp(in); 
      return ocspResponse; 
     } 
     else { 
      throw new CertificateVerificationException("Only http is supported for ocsp calls"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     throw new CertificateVerificationException("Cannot get ocspResponse from url: "+ serviceUrl, e); 
    } 
} 

Trạng thái rút lại được chọn như sau. Ở đây đối tượng SingleResp (resp) lấy từ đối tượng BasicOCSPResp (basicResponse) phải có trạng thái của Chứng chỉ (tốt, bị thu hồi hoặc không xác định). Nhưng ở đây trạng thái luôn là null.

public void checkRevocationStatus(X509Certificate peerCert, X509Certificate issuerCert) 
throws CertificateVerificationException { 

    try { 

     OCSPReq request = generateOCSPRequest(issuerCert, peerCert.getSerialNumber()); 
     List<String> locations = getAIALocations(peerCert); 
     Iterator it = locations.iterator(); 

     if (it.hasNext()) { 

      String serviceUrl = (String) it.next(); 
      OCSPResp ocspResponse = getOCSPResponce(serviceUrl, request); 
      if(OCSPRespStatus.SUCCESSFUL==ocspResponse.getStatus()) 
       System.out.println("server gave response fine"); 

      BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject(); 
      SingleResp[] responses = (basicResponse==null) ? null : basicResponse.getResponses(); 

      if (responses!=null && responses.length == 1) { 
       SingleResp resp = responses[0]; 
       Object status = resp.getCertStatus(); 
       if(status!=null) { 
        if (status == CertificateStatus.GOOD) { 
         System.out.println("OCSP Status is good!"); 
        } else if (status instanceof org.bouncycastle.ocsp.RevokedStatus) { 
         System.out.println("OCSP Status is revoked!"); 
        } else if (status instanceof org.bouncycastle.ocsp.UnknownStatus) { 
         System.out.println("OCSP Status is unknown!"); 
        } 
       } 
      } 
     } 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
} 

Tôi thực sự đánh giá cao sự giúp đỡ của bạn. Cảm ơn rất nhiều.

Trả lời

6

Thực ra, nếu bạn xem xét giá trị thực tế của CertificateStatus.GOOD, bạn sẽ thấy rằng thực tế nó là null. Nói cách khác, resp.getCertStatus() trả về null có nghĩa là GOOD.

Vì vậy, bạn có thể chỉ cần đưa ra điều đó (trạng thái! = Null) kiểm tra.