diff --git a/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java b/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java index 787efaf5ea3da6e0f0eb59894ea418911d14edeb..cdcae2f231f07df61124d6817a65f91f8f1bfb00 100644 --- a/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java +++ b/jams-ca/src/main/java/net/jami/jams/ca/JamsCA.java @@ -35,6 +35,7 @@ import net.jami.jams.common.objects.system.SystemAccount; import net.jami.jams.common.objects.user.User; import net.jami.jams.common.serialization.JsoniterRegistry; import org.bouncycastle.cert.X509CRLHolder; +import org.bouncycastle.cert.ocsp.OCSPException; import org.bouncycastle.cert.ocsp.OCSPReq; import org.bouncycastle.cert.ocsp.OCSPResp; import org.bouncycastle.jcajce.provider.asymmetric.X509; @@ -129,8 +130,8 @@ public class JamsCA implements CertificateAuthority { } } - public static OCSPResp getOCSPResponse(OCSPReq ocspRequest, X509Certificate cert) { - return ocspWorker.getOCSPResponse(ocspRequest, cert); + public static OCSPResp getOCSPResponse(OCSPReq ocspRequest) throws OCSPException { + return ocspWorker.getOCSPResponse(ocspRequest); } @Override diff --git a/jams-ca/src/main/java/net/jami/jams/ca/workers/ocsp/OCSPWorker.java b/jams-ca/src/main/java/net/jami/jams/ca/workers/ocsp/OCSPWorker.java index 416f24bd04f697f55370f8cc9a6858f542604cd2..0b407e0df6ca5dcac60887fa8061acf71d725cdb 100644 --- a/jams-ca/src/main/java/net/jami/jams/ca/workers/ocsp/OCSPWorker.java +++ b/jams-ca/src/main/java/net/jami/jams/ca/workers/ocsp/OCSPWorker.java @@ -23,6 +23,7 @@ package net.jami.jams.ca.workers.ocsp; import lombok.extern.slf4j.Slf4j; +import net.jami.jams.ca.JamsCA; import net.jami.jams.ca.workers.X509Worker; import net.jami.jams.ca.workers.crl.CRLWorker; import net.jami.jams.common.cryptoengineapi.ocsp.CertificateStatus; @@ -54,6 +55,7 @@ import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import java.math.BigInteger; import java.security.PrivateKey; import java.security.cert.X509Certificate; +import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; @@ -83,19 +85,20 @@ public class OCSPWorker extends X509Worker<String> { log.info("Instantiated OCSP Worker..."); } - public OCSPResp getOCSPResponse(OCSPReq ocspRequest, X509Certificate cert) { - try{ - OCSPResp resp = validateRequest(ocspRequest); - if(resp != null) return resp; //this means the request is invalid and we should notify the client. + public OCSPResp getOCSPResponse(OCSPReq ocspRequest) throws OCSPException { + try { + if(validateRequest(ocspRequest) != null) throw new OCSPException("Request is not valid"); //this means the request is invalid and we should notify the client. //If the request was valid, we move on to other things. BasicOCSPRespBuilder responseBuilder = new BasicOCSPRespBuilder(responderID); + // Add appropriate extensions Collection<Extension> responseExtensions = new ArrayList<>(); + // nonce Extension nonceExtension = ocspRequest.getExtension(OCSPObjectIdentifiers.id_pkix_ocsp_nonce); if (nonceExtension != null) responseExtensions.add(nonceExtension); Extension[] extensions = responseExtensions.toArray(new Extension[responseExtensions.size()]); responseBuilder.setResponseExtensions(new Extensions(extensions)); for (Req request : ocspRequest.getRequestList()) { - addResponse(responseBuilder, request, cert); + addResponse(responseBuilder, request); } BasicOCSPResp basicResponse = responseBuilder.build( contentSigner, @@ -119,31 +122,22 @@ public class OCSPWorker extends X509Worker<String> { } - private CertificateSummary getCertificateSummary(BigInteger serial, X509Certificate cert) { + private CertificateSummary getCertificateSummary(BigInteger serial) { X509CRLEntryHolder x509CRLEntryHolder = crlWorker.getExistingCRL().get().getRevokedCertificate(serial); - LocalDateTime expirationTime = LocalDateTime.ofInstant(cert.getNotAfter().toInstant(), ZoneId.systemDefault()); - if(x509CRLEntryHolder != null) return CertificateSummary.newBuilder() .withStatus(CertificateStatus.REVOKED) .withSerialNumber(serial) .withRevocationTime(LocalDateTime.ofInstant(x509CRLEntryHolder.getRevocationDate().toInstant(), ZoneId.systemDefault())) .build(); - else if (expirationTime.isBefore(LocalDateTime.now())) { - return CertificateSummary.newBuilder() - .withStatus(CertificateStatus.EXPIRED) - .withSerialNumber(serial) - .withExpirationTime(expirationTime) - .build(); - } - else return CertificateSummary.newBuilder() + return CertificateSummary.newBuilder() .withStatus(CertificateStatus.VALID) .withSerialNumber(serial) .build(); } - private void addResponse(BasicOCSPRespBuilder responseBuilder, Req request, X509Certificate cert) throws OCSPException{ + private void addResponse(BasicOCSPRespBuilder responseBuilder, Req request) throws OCSPException{ CertificateID certificateID = request.getCertID(); // Build Extensions Extensions extensions = new Extensions(new Extension[]{}); @@ -153,7 +147,7 @@ public class OCSPWorker extends X509Worker<String> { if (nonceExtension != null) extensions = new Extensions(nonceExtension); } responseBuilder.addResponse(certificateID, - OCSPCertificateStatusMapper.getStatus(getCertificateSummary(request.getCertID().getSerialNumber(), cert)), + OCSPCertificateStatusMapper.getStatus(getCertificateSummary(request.getCertID().getSerialNumber())), new Date(), new Date(new Date().getTime() + crlLifetime), extensions); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/x509/OCSPServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/x509/OCSPServlet.java index 0b17f4069b80b291957f16b61804b4d8760c60ed..2037afc6e7b857edbabe2eea1e559519ebf31595 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/x509/OCSPServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/x509/OCSPServlet.java @@ -32,6 +32,7 @@ import org.bouncycastle.asn1.DEROctetString; import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers; import org.bouncycastle.asn1.x509.Extension; import org.bouncycastle.asn1.x509.Extensions; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; import org.bouncycastle.cert.ocsp.CertificateID; import org.bouncycastle.cert.ocsp.OCSPReq; @@ -52,35 +53,16 @@ public class OCSPServlet extends HttpServlet { resp.setContentType("application/ocsp-response"); byte[] content = new byte[Integer.parseInt(req.getHeader("Content-Length"))]; try { - for(int i=0;i<content.length;i++){ + for(int i=0;i<content.length;i++) req.getInputStream().read(content); - } - JcaDigestCalculatorProviderBuilder digestCalculatorProviderBuilder = new JcaDigestCalculatorProviderBuilder(); - DigestCalculatorProvider digestCalculatorProvider = digestCalculatorProviderBuilder.build(); - DigestCalculator digestCalculator = digestCalculatorProvider.get(CertificateID.HASH_SHA1); - // Generate the id for the certificate we are looking for - X509Certificate targetCert = X509Utils.getCertificateFromPEMString(new String(content)); - if (targetCert != null) { - CertificateID id = new CertificateID(digestCalculator, - new JcaX509CertificateHolder(JamsCA.CA.getCertificate()), targetCert.getSerialNumber()); + OCSPReq ocspReq = new OCSPReq(content); + OCSPResp response = JamsCA.getOCSPResponse(ocspReq); + if (response != null) { + byte[] respBytes = response.getEncoded(); + resp.getOutputStream().write(respBytes); + } else resp.setStatus(404); - // basic request generation with nonce - OCSPReqBuilder gen = new OCSPReqBuilder(); - gen.addRequest(id); - - // create details for nonce extension - String nonce = String.valueOf(System.nanoTime()); - Extension ext = new Extension(OCSPObjectIdentifiers.id_pkix_ocsp_nonce, false, new DEROctetString(new DEROctetString(nonce.getBytes()).getEncoded())); - gen.setRequestExtensions(new Extensions(new Extension[]{ext})); - OCSPReq ocspReq = gen.build(); - OCSPResp response = JamsCA.getOCSPResponse(ocspReq, targetCert); - - if (response != null) { - byte[] respBytes = response.getEncoded(); - resp.getOutputStream().write(respBytes); - } else resp.setStatus(404); - } } catch (Exception e) { resp.sendError(404, "Could not find the requested certificate!");