Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сертификаты, Нужна помощь с описанием кода 
:(
    Опции темы
richard7788
Дата 12.9.2012, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.7.2012

Репутация: нет
Всего: нет



Всем, привет,

впервые сталкиваюсь с сертификатами, а тут работа привалила. Смотрел ваши сообщения на форуме и понял, что есть люди, кто  разбирается в этом. Есть программа, в ней используются сертификаты, мне нужно описать работу с ними, а также продемонстрировать работоспособность. Хотел бы, спросить не могли бы Вы помочь с более-менее подробным описанием кода. Если нет, то не обижусь.  

Вот сам код:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Vector;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
import org.bouncycastle.asn1.ocsp.OCSPResponseStatus;
import org.bouncycastle.asn1.x509.X509Extension;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.ocsp.BasicOCSPResp;
import org.bouncycastle.ocsp.CertificateID;
import org.bouncycastle.ocsp.CertificateStatus;
import org.bouncycastle.ocsp.OCSPException;
import org.bouncycastle.ocsp.OCSPReq;
import org.bouncycastle.ocsp.OCSPReqGenerator;
import org.bouncycastle.ocsp.OCSPResp;
import org.bouncycastle.ocsp.SingleResp;



public class LoginValve extends ValveBase {

    @Override
    public void invoke(Request arg0, Response arg1) throws IOException, ServletException {
        X509Certificate[] certs = (X509Certificate[]) arg0
                        .getAttribute("javax.servlet.request.X509Certificate");

        if (!"https".equals(arg0.getScheme())) {
//            returnError(arg1, "Доступ РїРѕ протоколу " + arg0.getScheme() + "  Р·Р°РїСЂРµС‰РµРЅ.");
            getNext().invoke(arg0, arg1);
            return;
        }

        if (certs != null) {
            //getNext().invoke(arg0, arg1);
            if (certs[0] != null) {
                HttpSession session = arg0.getSession();

                if (session == null) {
                    //Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Ошибка! Сессия не найдена");
                    Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Error! The session is not found");
                    //if (!verifyCertificate(certs[0])) returnError(arg1, "Доступ запрещён. Сессия не найдена");
                    if (!verifyCertificate(certs[0])) returnError(arg1, "Access denied. The session is not found");
                    else getNext().invoke(arg0, arg1);
                } else {
                    String ClientNameCN = certs[0].getSubjectDN().getName();
                    ClientNameCN = ClientNameCN.substring(ClientNameCN.indexOf("CN=") + 3);
                    ClientNameCN = ClientNameCN.substring(0, ClientNameCN.indexOf(","));
                    session.setAttribute("ClientNameCN", ClientNameCN);
                    //Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Внимание2!!!!!" + ClientNameCN);
                    Object obj = session.getAttribute("isVerifyCertificate");
                    if (obj != null) {
                        String str = (String)obj;
                        if (str.equals("true")) {
                            getNext().invoke(arg0, arg1);
                            return;
                        }
                    }

                    if (!verifyCertificate(certs[0])) {
                        //Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Ошибка! Неверный сертификат");
                        Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Error! Invalid certificate");
                        session.setAttribute("isVerifyCertificate", "false");
                        //returnError(arg1, "Доступ запрещён. Неверный сертификат");
                        returnError(arg1, "Access denied. Invalid certificate");
                    } else {
                        session.setAttribute("isVerifyCertificate", "true");
                        getNext().invoke(arg0, arg1);
                    }
                }
            }
            else {
                //Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Ошибка! Сертификат не получен");
                Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Error! The certificate has not been obtained");
                //returnError(arg1, "Доступ запрещён. Сертификат не получен");
                returnError(arg1, "Access denied. The certificate has not been obtained");
            }
        } else {
            //Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Ошибка! Сертификат не получен");
            Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Error! The certificate has not been obtained");
            //returnError(arg1, "Доступ запрещён. Сертификат не получен");
            returnError(arg1, "Access denied. The certificate has not been obtained");
        }
    }

    private boolean verifyCertificate(X509Certificate curCertificate) {
        try
        {
          //Read user Certificate
       //InputStream inStream = new FileInputStream("C:\\Documents and Settings\\Alibek\\Desktop\\Для HTTPS\\certs\\client1.cer");
       CertificateFactory cf = CertificateFactory.getInstance("X.509");
       //X509Certificate interCert = (X509Certificate)cf.generateCertificate(inStream);
       //inStream.close();
          Properties p = getProps();
          String CertPath = "";
          String serviceAddr = "";
          try {
              CertPath = p.getProperty("CertPath");
              serviceAddr = p.getProperty("serviceAddr");
          } catch (Exception e) {
              //Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Ошибка! Не найден ключ 'CertPath' или 'serviceAddr'");
              Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Error! Not found the key 'CertPath' or 'serviceAddr'");
          }


       InputStream inStreamRoot = new FileInputStream(CertPath);
       X509Certificate rootCert = (X509Certificate)cf.generateCertificate(inStreamRoot);
       inStreamRoot.close();

       OCSPReq request = generateOCSPRequest(rootCert, curCertificate.getSerialNumber());

         
          byte[] array = request.getEncoded();

          
          HttpURLConnection con = null;
          URL url = new URL((String) serviceAddr);
          con = (HttpURLConnection) url.openConnection();
          con.setRequestProperty("Content-Type", "application/ocsp-request");
          con.setRequestProperty("Accept", "application/ocsp-response");
          con.setDoOutput(true);
          con.setDoInput(true);
          con.setRequestMethod("POST");

          OutputStream out = con.getOutputStream();
          DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(out));
          

          dataOut.write(array);

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

          
          int ret = con.getResponseCode();
          if (ret / 100 != 2) {
            throw new Exception("***Error " + Integer.toString(ret) + "***");
          }

          
          InputStream in = (InputStream) con.getContent();
          OCSPResp ocspResponse = new OCSPResp(in);

          
          int ocspRespStatus = ocspResponse.getStatus();
          Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "OCSP response status " + String.valueOf(ocspRespStatus) + ":");
              switch (ocspRespStatus) {
                  case 0: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Response has valid confirmations"); break;
                  case 1: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Illegal confirmation request"); break;
                  case 2: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Internal error in issuer"); break;
                  case 3: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Try again later"); break;
                  case 4: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "is not used"); break;
                  case 5: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Must sign the request"); break;
                  case 6: Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Request unauthorized"); break;
              }
          if (OCSPResponseStatus.SUCCESSFUL != ocspRespStatus) {
              return false;
          }


          BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject();
                    if (basicResponse != null) {
                        SingleResp[] responses = basicResponse.getResponses();
                        if (responses.length == 1) {
                            SingleResp resp = responses[0];
                            Object status = resp.getCertStatus();
                            if (status == CertificateStatus.GOOD) {
                                return true;
                            } else if (status instanceof org.bouncycastle.ocsp.RevokedStatus) {
                                return false;
                            }  else if (status instanceof org.bouncycastle.ocsp.UnknownStatus) {
                                return false;
                            }
                        }
                    }

        }
        catch (Exception e) {
            Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, null, e);
            return false;
        }
        return false;
    }
    
    public OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber)
        throws OCSPException
    {
     //Add provider BC
     Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

        // Generate the id for the certificate we are looking for
        CertificateID   id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber);

        // basic request generation with nonce
        OCSPReqGenerator    gen = new OCSPReqGenerator();

        gen.addRequest(id);

        // create details for nonce extension
        BigInteger nonce = BigInteger.valueOf(System.currentTimeMillis());
        Vector     oids = new Vector();
        Vector     values = new Vector();

        oids.add(OCSPObjectIdentifiers.id_pkix_ocsp_nonce);
        values.add(new X509Extension(false, new DEROctetString(nonce.toByteArray())));

        gen.setRequestExtensions(new X509Extensions(oids, values));

        return gen.generate();
    }

    private void returnError(Response response, String errorString) throws IOException {
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>");
            out.println("<title>Проверка пользовательского сертификата</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>" + errorString + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    private Properties getProps() {

        Properties p = new Properties();

        StringBuffer path = new StringBuffer(getClass().getProtectionDomain().getCodeSource().getLocation().toString());
        int idx = path.indexOf("lib/KLoginApplication.jar");
        path.replace(idx, path.length(), "conf/KLoginApplication.properties");
        try {
            p.load(new java.io.FileInputStream(new java.io.File(new URI(path.toString()))));
        } catch (Exception ex) {
            Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, "Error! File not found: " + path.toString());
            Logger.getLogger(LoginValve.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        return p;
    }

}
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.