Проверка валидности сертификатов через УЦ используя crypto.dll

Автор Sayat_dt, 12 Июль 2013, 10:05:24

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Вниз

Sayat_dt

Доброго времени суток. Использую проверку статусов сертификатов через ваш УЦ(ca.gamma.kz),через crypto.dll. Но при вызове функции SendRequest() выдает ошибку Server unavailable. Пробовал подключиться по TelNet на ca.gamma.kz 62301, подключение проходит успешно. Нужны ли какие-либо настройки сети для того, чтобы запрос уходил?

Sergey

Добрый день.
Как происходит подключение (используется ли прокси сервер)?

Sayat_dt

Да используется прокси сервер, для выхода в интернет

Sergey

Если прокси сервер настроен в системе (в Internet Explorer), то скорее всего дополнительно настраивать ничего не нужно.

Sayat_dt

Сейчас попробовал отправить запрос, используя другую сеть, которая не использует прокси и все равно выдает ошибку  "Сервер недоступен". Ваш OCSP сервис доступен для всех? Нет необходимости добавлять разрешенные ip-адреса?

Sergey

Сервер должен быть открыт для всех без исключения.
По какому протоколу работаете с OCSP сервером.

Sayat_dt

Я использую библиотеку и так понимаю, что она использует LDAP

Sergey

Приведите код отправки запроса, который используется.

Sayat_dt

OCSPHelper hlpr = new OCSPHelper();
            hlpr.LdapUrl = "81.17.168.8";           
            hlpr.Port = 62301;
            hlpr.RequestorName = cert.SubjectDN;
            hlpr.SerialNumber = cert.SerialNumber;
            hlpr.CreateRequest(cert);
            int certStatus = hlpr.SendRequest();
На последней строчке выдает ошибку.

Sergey

Попробуйте вместо порта 62301 использовать порт 62222.
Или необходимо использовать протокол HTTP или TCP.

Sayat_dt

Попробовал поменять порт на 62222 теперь выдает ошибку "LDAP server unavaible".До этого была ошибка, что просто Сервер недоступен. А в crypto.dll есть возможность использовать другие протоколы?

Sergey

Можно не использовать класс OCSPHelper , а создать запрос вручную.
Создание запроса:
       public byte[] CreateRequest(X509Certificate Certificate)
       {
OcspReq req = null;
if (Certificate == null) throw new ArgumentNullException();
               byte[] root_serial = new byte[32];

               Asn1OctetString serial =Certificate.GetExtensionValue(X509Extensions.AuthorityKeyIdentifier);
               if (serial != null)
               {
                   AuthorityKeyIdentifier aki = AuthorityKeyIdentifier.GetInstance(
                       Asn1Object.FromByteArray(serial.GetOctets()));

                   if (aki.GetKeyIdentifier() != null)
                   {
                       root_serial = aki.GetKeyIdentifier();

                   }
               }
               X509Name issuer_name = Certificate.IssuerDN;
               CertificateID id = new CertificateID(CertificateID.HashGost, root_serial, issuer_name, Certificate.SerialNumber);
               OcspReqGenerator gen = new OcspReqGenerator();
               gen.AddRequest(id);
               gen.SetRequestorName(Certificate.SubjectDN);
               X509Certificate[] chain = new X509Certificate[1];
               chain[0] = Certificate;
               req = gen.Generate(GammaObjectIdentifiers.GostR3410x2001.Id, null, chain);
            }
    return req.GetEncoded();
       }

Отправка запроса:

public byte[] SendRequest(String url, byte[] req)
{
            byte[] responce = new byte[1];
            HttpWebRequest http_req = (HttpWebRequest)HttpWebRequest.Create(url);
            http_req.ContentType = "application/timestamp-query";
            http_req.ContentLength = req.Length;

            http_req.Method = "POST";
            http_req.KeepAlive = false;
            http_req.AllowWriteStreamBuffering = true;
            http_req.Timeout = System.Threading.Timeout.Infinite;
            http_req.ProtocolVersion = new Version("1.1");
            WebResponse resp = null;
            Stream out_stream = null;
            try
            {
                Stream stm = http_req.GetRequestStream();
                stm.Write(req, 0, req.Length);
                stm.Close();
                resp = http_req.GetResponse();
                out_stream = resp.GetResponseStream();
                responce = ReadFully(out_stream, resp.ContentLength);
                out_stream.Close();
                resp.Close();

            }
            catch (WebException exp)
            {
                Console.WriteLine("Произошла ошибка при отправке запроса.Проверьте соединение с сетью");
            }
return responce;
    }

Проверка ответа:

public int ParseResponce(byte[] buf)
        {
int status = -1;
    OcspResp resp = new OcspResp(buf);
            BasicOcspResp basic_resp = (BasicOcspResp)resp.GetResponseObject();
            SingleResp[] singleResp = basic_resp.Responses;
             for (int i = 0; i < singleResp.Length; i++)
             {
                 try
                 {
                     CertStatus s = (CertStatus)singleResp[i].GetCertStatus();
                     status = 0;
                 }
                 catch (InvalidCastException e)
                 {
                     try
                     {
                         RevokedStatus s = (RevokedStatus)singleResp[i].GetCertStatus();
                         status = 1;
                         if (s.HasRevocationReason == true)
                         {
                             Reason = s.RevocationReason;
                         }
                         RevocationDate = s.RevocationTime;
                     }
                     catch (InvalidCastException e1)
                     {
                         status = 2;
                     }
                 }
             }
return status;
        }


Sayat_dt

Добрый день. Спасибо большое за код, Сергей! Единственно теперь при вызове функции ParseResponse выдает ошибку "malformed response: EOF found when length expected". На строчке OcspResp resp = new OcspResp(buf);

Sergey

Добрый день.

Сохраните значение buf и прикрепите к этой теме.

Sayat_dt

16 Июль 2013, 10:19:29 #14 Последнее редактирование: 16 Июль 2013, 10:22:45 от Sayat_dt
Значение buf ([0]0). Еще у меня ругается на метод ReadFully, что он не определен

Вверх