📄 requesthelper.java
字号:
/************************************************************************* * * * EJBCA: The OpenSource Certificate Authority * * * * This software is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or any later version. * * * * See terms of license at gnu.org. * * * *************************************************************************/ package org.ejbca.ui.web;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintStream;import java.io.PrintWriter;import java.io.StringWriter;import java.io.UnsupportedEncodingException;import java.security.cert.Certificate;import java.security.cert.X509Certificate;import java.util.regex.Pattern;import javax.servlet.ServletContext;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Logger;import org.bouncycastle.asn1.ASN1InputStream;import org.bouncycastle.asn1.ASN1Sequence;import org.bouncycastle.jce.netscape.NetscapeCertRequest;import org.ejbca.core.ejb.ServiceLocator;import org.ejbca.core.ejb.ServiceLocatorException;import org.ejbca.core.ejb.ca.sign.ISignSessionLocal;import org.ejbca.core.model.ca.SignRequestSignatureException;import org.ejbca.core.model.log.Admin;import org.ejbca.core.protocol.IResponseMessage;import org.ejbca.core.protocol.PKCS10RequestMessage;import org.ejbca.core.protocol.RequestMessageUtils;import org.ejbca.core.protocol.X509ResponseMessage;import org.ejbca.ui.web.pub.ServletDebug;import org.ejbca.ui.web.pub.ServletUtils;import org.ejbca.util.Base64;import org.ejbca.util.CertTools;/** * Helper class for handling certificate request from browsers or general PKCS#10 * * @version $Id: RequestHelper.java 5631 2008-05-22 11:46:54Z anatom $ */public class RequestHelper { private static Logger log = Logger.getLogger(RequestHelper.class); private Admin administrator; private ServletDebug debug; private static final Pattern CLASSID = Pattern.compile("\\$CLASSID"); public static final String BEGIN_CERTIFICATE_REQUEST_WITH_NL = "-----BEGIN CERTIFICATE REQUEST-----\n"; public static final String END_CERTIFICATE_REQUEST_WITH_NL = "\n-----END CERTIFICATE REQUEST-----\n"; public static final String BEGIN_CERTIFICATE_WITH_NL = "-----BEGIN CERTIFICATE-----\n"; public static final String END_CERTIFICATE_WITH_NL = "\n-----END CERTIFICATE-----\n"; public static final String BEGIN_CRL_WITH_NL = "-----BEGIN X509 CRL-----\n"; public static final String END_CRL_WITH_NL = "\n-----END X509 CRL-----\n"; public static final String BEGIN_PKCS7 = "-----BEGIN PKCS7-----\n"; public static final String END_PKCS7 = "\n-----END PKCS7-----\n"; public static final String BEGIN_PKCS7_WITH_NL = "-----BEGIN PKCS7-----\n"; public static final String END_PKCS7_WITH_NL = "\n-----END PKCS7-----\n"; public static final int ENCODED_CERTIFICATE = 1; public static final int ENCODED_PKCS7 = 2; /** * Creates a new RequestHelper object. * * @param administrator Admin doing the request * @param debug object to send debug to */ public RequestHelper(Admin administrator, ServletDebug debug) { this.administrator = administrator; this.debug = debug; } public RequestHelper(Admin administrator) { this.administrator = administrator; } /** * Handles NetScape certificate request (KEYGEN), these are constructed as: <code> * SignedPublicKeyAndChallenge ::= SEQUENCE { publicKeyAndChallenge PublicKeyAndChallenge, * signatureAlgorithm AlgorithmIdentifier, signature BIT STRING }</code> PublicKey's * encoded-format has to be RSA X.509. * * @param signsession EJB session to signature bean. * @param reqBytes buffer holding te request from NS. * @param username username in EJBCA for authoriation. * @param password users password for authorization. * * @return byte[] containing DER-encoded certificate. */ public byte[] nsCertRequest(ISignSessionLocal signsession, byte[] reqBytes, String username, String password) throws Exception { byte[] buffer = Base64.decode(reqBytes); if (buffer == null) { return null; } ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(buffer)); ASN1Sequence spkac = (ASN1Sequence) in.readObject(); in.close(); NetscapeCertRequest nscr = new NetscapeCertRequest(spkac); // Verify POPO, we don't care about the challenge, it's not important. nscr.setChallenge("challenge"); if (nscr.verify("challenge") == false) { throw new SignRequestSignatureException( "Invalid signature in NetscapeCertRequest, popo-verification failed."); } log.debug("POPO verification successful"); X509Certificate cert = (X509Certificate) signsession.createCertificate(administrator, username, password, nscr.getPublicKey()); // Don't include certificate chain in the PKCS7 to mozilla byte[] pkcs7 = signsession.createPKCS7(administrator, cert, false); log.debug("Created certificate (PKCS7) for " + username); debug.print("<h4>Generated certificate:</h4>"); debug.printInsertLineBreaks(cert.toString().getBytes()); return pkcs7; } //nsCertRequest /** * Handles PKCS10 certificate request, these are constructed as: <code> CertificationRequest * ::= SEQUENCE { certificationRequestInfo CertificationRequestInfo, signatureAlgorithm * AlgorithmIdentifier{{ SignatureAlgorithms }}, signature BIT STRING } * CertificationRequestInfo ::= SEQUENCE { version INTEGER { v1(0) } (v1,...), * subject Name, subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }}, * attributes [0] Attributes{{ CRIAttributes }}} SubjectPublicKeyInfo { ALGORITHM : * IOSet} ::= SEQUENCE { algorithm AlgorithmIdentifier {{IOSet}}, subjectPublicKey * BIT STRING }</code> PublicKey's encoded-format has to be RSA X.509. * * @param signsession signsession to get certificate from * @param b64Encoded base64 encoded pkcs10 request message * @param username username of requesting user * @param password password of requesting user * @param resulttype should indicate if a PKCS7 or just the certificate is wanted. * @param doSplitLines * @return Base64 encoded byte[] * @throws Exception */ public byte[] pkcs10CertRequest(ISignSessionLocal signsession, byte[] b64Encoded, String username, String password, int resulttype, boolean doSplitLines) throws Exception { byte[] result = null; Certificate cert=null; PKCS10RequestMessage req = RequestMessageUtils.genPKCS10RequestMessageFromPEM(b64Encoded); req.setUsername(username); req.setPassword(password); IResponseMessage resp = signsession.createCertificate(administrator,req,Class.forName(X509ResponseMessage.class.getName())); cert = CertTools.getCertfromByteArray(resp.getResponseMessage()); if(resulttype == ENCODED_CERTIFICATE) result = cert.getEncoded(); else result = signsession.createPKCS7(administrator, cert, true); log.debug("Created certificate (PKCS7) for " + username); debug.print("<h4>Generated certificate:</h4>"); debug.printInsertLineBreaks(cert.toString().getBytes()); return Base64.encode(result, doSplitLines); } //pkcs10CertReq /** * * @param signsession * @param b64Encoded * @param username * @param password * @param resulttype * @return * @throws Exception */ public byte[] pkcs10CertRequest(ISignSessionLocal signsession, byte[] b64Encoded, String username, String password, int resulttype) throws Exception { return pkcs10CertRequest(signsession, b64Encoded, username, password, resulttype, true); } /** * Formats certificate in form to be received by IE * * @param bA input * @param out Output */ public static void ieCertFormat(byte[] bA, PrintStream out) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(bA))); int rowNr = 0; while (true) { String line = br.readLine(); if (line == null) { break; } if (line.indexOf("END CERT") < 0) { if (line.indexOf(" CERT") < 0) { if (++rowNr > 1) { out.println(" & _ "); } else { out.print(" cert = "); } out.print('\"' + line + '\"'); } } else { break; } } out.println(); } // ieCertFormat /** * @param certificate b64 encoded cert to be installed in netid * @param response output stream to send to * @param sc serveltcontext * @param responseTemplate path to template page for response * @throws Exception */ public static void sendNewCertToIidClient(byte[] certificate, HttpServletRequest request, OutputStream out, ServletContext sc, String responseTemplate, String classid) throws Exception { log.debug(">sendNewCertToIidClient"); if ( certificate.length <= 0 ) { log.error("0 length certificate can not be sent to client!"); return; } StringWriter sw = new StringWriter(); { InputStream is = sc.getResourceAsStream(responseTemplate); if (is == null) { // Some app servers (oracle) require a / first... log.debug("Trying to read responseTemplate with / first");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -