Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline MehAnat  
#1 Оставлено : 12 декабря 2016 г. 12:22:48(UTC)
MehAnat

Статус: Участник

Группы: Участники
Зарегистрирован: 10.11.2016(UTC)
Сообщений: 10
Российская Федерация

Здравствуйте, посылаю OCSP запрос на адрес вашего тестового сервера (который http://www.cryptopro.ru/ocsp/ocsp.srf). Хотелось бы узнать структуру ответа. Код, которым формируем запрос:

Цитата:
private static void process(String ocspUrl, X509Certificate cert) throws Exception {
OCSPRequest r = createOCSPRequest(cert);
Asn1DerEncodeBuffer encodedData = new Asn1DerEncodeBuffer();
r.encode(encodedData);
byte[] data = encodedData.getMsgCopy();

HttpURLConnection con = call(ocspUrl, data);

OCSPResponse ocspResponse = new OCSPResponse();
ocspResponse.decode(new Asn1DerDecodeBuffer(getData(con)));

System.out.println(ocspResponse.responseStatus.value);
File res = new File("C:\\Users\\M. Anatoly\\Documents\\validateSign\\src\\res");
String resp = Base64.encode(ocspResponse.responseBytes.response.value);
System.out.println(resp);

System.out.println("OCSP OK");
}

private static OCSPRequest createOCSPRequest(X509Certificate cert) throws Exception {
TBSRequest tbsRequest = new TBSRequest();
tbsRequest.version = new OCSPVersion(0);
//tbsRequest.requestorName = getSubjectName(cert);
tbsRequest.requestorName = null;
tbsRequest.requestList = createRequestList(new X509Certificate[]{cert});
return new OCSPRequest(tbsRequest);
}

private static _SeqOfRequest createRequestList(X509Certificate[] certs) throws Exception {
_SeqOfRequest requestList = new _SeqOfRequest(certs.length);
for (int i = 0; i < certs.length; i++) {
X509Certificate cert = certs[i];

CertID certID = new CertID();

certID.issuerNameHash = new Asn1OctetString(digest(cert.getIssuerX500Principal().getEncoded()));
//certID.issuerNameHash = new Asn1OctetString(digest(caCert.getSubjectX500Principal().getEncoded()));

certID.hashAlgorithm = getHashAlgId();
certID.issuerNameHash = new Asn1OctetString(digest(cert.getIssuerX500Principal().getEncoded()));
certID.issuerKeyHash = new Asn1OctetString(digest(cert.getPublicKey().getEncoded()));
certID.serialNumber = new CertificateSerialNumber(cert.getSerialNumber());

ReqCert reqCert = new ReqCert();
reqCert.set_certID(certID);
requestList.elements[i] = new Request(reqCert);
}

return requestList;
}

private static byte[] getData(HttpURLConnection connection) throws IOException {
byte[] data = new byte[connection.getContentLength()];
InputStream is = connection.getInputStream();
try {
is.read(data);
} finally {
is.close();
}
return data;
}

private static HttpURLConnection call(String ocspUrl, byte[] data) throws IOException {
HttpURLConnection con = (HttpURLConnection) new URL(ocspUrl).openConnection();

con.setDoOutput(true);
con.setDoInput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/ocsp-request");
con.setRequestProperty("Accept", "application/ocsp-response");
con.setRequestProperty("Content-length", String.valueOf(data.length));

System.out.println("content-length:" + data.length + " bytes");

OutputStream out = con.getOutputStream();
try {
out.write(data);
out.flush();
} finally {
out.close();
}

if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
System.out.println(con.getResponseMessage());
Map<String, List<String>> headerFields = con.getHeaderFields();
for (String s : headerFields.keySet()) {
System.out.println("key:" + s + " val:" + headerFields.get(s));
}

throw new IOException("Received HTTP error: " + con.getResponseCode() + " - " + con.getResponseMessage());
}

return con;
}


private static AlgorithmIdentifier getHashAlgId() {
AlgorithmIdentifier hashAlgId = new AlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value);
hashAlgId.parameters = new Asn1Null();
return hashAlgId;
}

private static byte[] digest(byte[] data) throws NoSuchAlgorithmException, NoSuchProviderException {
MessageDigest digest = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME, JCP.PROVIDER_NAME);
digest.update(data);
return digest.digest();
}


Декодированное значение ocspResponse.responseBytes.response.value:

Цитата:
SEQUENCE(4 elem)
SEQUENCE(3 elem)
[1](1 elem)
SEQUENCE(9 elem)
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.3.131.1.1
NumericString007717107991
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.3
UTF8StringТестовая служба OCSP ООО "КРИПТО-ПРО"
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.10
UTF8StringООО "КРИПТО-ПРО"
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.100.1
NumericString1037700085444
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.9
UTF8Stringул. Сущёвский вал, д. 18
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.7
UTF8StringМосква
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.8
UTF8String77 г. Москва
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.6
PrintableStringRU
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.840.113549.1.9.1
IA5Stringinfo@cryptopro.ru
GeneralizedTime2016-12-12 09:12:49 UTC
SEQUENCE(1 elem)
SEQUENCE(3 elem)
SEQUENCE(4 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.2.2.9
NULL
OCTET STRING(32 byte) B744D5301505BD3D364ACB4FA56D35FBC2947BDD8F4F99141E715A23D96FEB88
OCTET STRING(32 byte) D4FA1BC38EE8B361701132599C7BF6698661C0D4B7CD186B8389135F14D272C4
INTEGER(149 bit) 401420785979233492624372270787095523661032033
[2]
GeneralizedTime2016-12-12 09:12:49 UTC
SEQUENCE(1 elem)
OBJECT IDENTIFIER1.2.643.2.2.3
BIT STRING(512 bit) 0010011000001001111000000011000100010011100000001000110101110111111111…
[0](1 elem)
SEQUENCE(1 elem)
SEQUENCE(3 elem)
SEQUENCE(8 elem)
[0](1 elem)
INTEGER2
INTEGER(78 bit) 181404511386811312032678
SEQUENCE(1 elem)
OBJECT IDENTIFIER1.2.643.2.2.3
SEQUENCE(9 elem)
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.100.1
NumericString1037700085444
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.3.131.1.1
NumericString007717107991
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.9
BMPStringул. Сущёвский вал, д. 18
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.8
BMPString77 г. Москва
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.7
BMPStringМосква
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.840.113549.1.9.1
IA5Stringinfo@cryptopro.ru
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.6
PrintableStringRU
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.10
BMPStringООО "КРИПТО-ПРО"
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.3
BMPStringТестовый УЦ ООО "КРИПТО-ПРО"
SEQUENCE(2 elem)
UTCTime2015-12-07 16:05:00 UTC
UTCTime2017-03-07 16:15:00 UTC
SEQUENCE(9 elem)
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.3.131.1.1
NumericString007717107991
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.3
UTF8StringТестовая служба OCSP ООО "КРИПТО-ПРО"
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.10
UTF8StringООО "КРИПТО-ПРО"
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.100.1
NumericString1037700085444
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.9
UTF8Stringул. Сущёвский вал, д. 18
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.7
UTF8StringМосква
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.8
UTF8String77 г. Москва
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.6
PrintableStringRU
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.840.113549.1.9.1
IA5Stringinfo@cryptopro.ru
SEQUENCE(2 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.2.2.19
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.2.2.35.1
OBJECT IDENTIFIER1.2.643.2.2.30.1
BIT STRING(1 elem)
OCTET STRING(64 byte) 819101213AE3FA768B486AC1B86344D18A34B40B461550E9667CBA0694047E8F93CB17…
[3](1 elem)
SEQUENCE(9 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.29.37
OCTET STRING(1 elem)
SEQUENCE(1 elem)
OBJECT IDENTIFIER1.3.6.1.5.5.7.3.9
SEQUENCE(3 elem)
OBJECT IDENTIFIER2.5.29.15
BOOLEANtrue
OCTET STRING(1 elem)
BIT STRING(2 bit) 11
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.29.14
OCTET STRING(1 elem)
OCTET STRING(20 byte) D269A5C705E578E2EA5353BFBD289C6046CE6792
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.29.35
OCTET STRING(1 elem)
SEQUENCE(3 elem)
[0](20 byte) 2BB21034668202ACF0E1AA4086780171459D33E3
[1](1 elem)
[4](1 elem)
SEQUENCE(9 elem)
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.100.1
NumericString1037700085444
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.3.131.1.1
NumericString007717107991
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.9
BMPStringул. Сущёвский вал, д. 18
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.8
BMPString77 г. Москва
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.7
BMPStringМосква
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.840.113549.1.9.1
IA5Stringinfo@cryptopro.ru
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.6
PrintableStringRU
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.10
BMPStringООО "КРИПТО-ПРО"
SET(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.4.3
BMPStringТестовый УЦ ООО "КРИПТО-ПРО"
[2](16 byte) 4487DA574993609E4876F6827344FF17
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.3.6.1.5.5.7.1.1
OCTET STRING(1 elem)
SEQUENCE(1 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.3.6.1.5.5.7.48.2
[6]http://www.cryptopro.ru/ra/cdp/cacer3.crt
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.29.16
OCTET STRING(1 elem)
SEQUENCE(2 elem)
[0]20151207160500Z
[1]20170307160500Z
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.5.29.32
OCTET STRING(1 elem)
SEQUENCE(2 elem)
SEQUENCE(1 elem)
OBJECT IDENTIFIER1.2.643.100.113.1
SEQUENCE(1 elem)
OBJECT IDENTIFIER1.2.643.100.113.2
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.643.100.111
OCTET STRING(1 elem)
UTF8StringКриптоПро CSP (версия 3.6)
SEQUENCE(2 elem)
Offset: 2056
Length: 4+307
(constructed)
Value:
(2 elem)
OBJECT IDENTIFIER1.2.643.100.112
OCTET STRING(1 elem)
SEQUENCE(4 elem)
UTF8String"КриптоПро CSP" (версия 3.6)
UTF8String"Удостоверяющий центр "КриптоПро УЦ" версии 1.5
UTF8StringСертификат соответствия № СФ/124-2238 от 04.10.2013
UTF8StringСертификат соответствия № СФ/128-2351 от 15.04.2014
SEQUENCE(1 elem)
OBJECT IDENTIFIER1.2.643.2.2.3
BIT STRING(512 bit) 0111101010010000111001001011011111101001110111010000010001101110011101…


Вопрос в том, где непосредственно указан статус сертификата? В ответе мы такого поля не нашли
Offline Евгений Афанасьев  
#2 Оставлено : 13 декабря 2016 г. 15:42:11(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Используя BC, можно проверить как-то так:

Код:

final OCSPResp ocspResponse = new OCSPResp(responseStream);
if (ocspResponse.getStatus() != 0) {
// invalid status
} // if

BasicOCSPResp basicResponse = (BasicOCSPResp) ocspResponse.getResponseObject();

SingleResp[] singleResponses = basicResponse.getResponses();
if (singleResponses.length == 1) {

  SingleResp resp = singleResponses[0];
  CertificateStatus status = resp.getCertStatus();

  if (status == CertificateStatus.GOOD) {
     // GOOD
  } // if
  else if (status instanceof RevokedInfo) {
    // decode status
  }
  else {
    // unknown
  }

}


В ASN1P.jar есть набор классов для работы в OCSP сообщениями, в пакете PKIXOCSP, например, OCSPResponse, OCSPResponseStatus, ResponseData, _SeqOfSingleResponse, SingleResponse, CertStatus. И тоже примерно схожий код:

Код:

// Почти все классы - из пакетов ASN1P.jar

Asn1BerDecodeBuffer decoded = new Asn1BerDecodeBuffer(encodedResponse);
OCSPResponse response = new OCSPResponse();
response.decode(decoded);

OCSPResponseStatus responseStatus = response.responseStatus;
int status = responseStatus.value;

if (status != OCSPResponseStatus.successful) {
  // invalid status
} // if

ResponseBytes bytes = response.responseBytes;
byte[] responseValue = bytes.response.value;

decoded = new Asn1BerDecodeBuffer(responseValue);
BasicOCSPResponse basicOCSPResponse = new BasicOCSPResponse();
basicOCSPResponse.decode(decoded);

_SeqOfSingleResponse _seqOfSingleResponse = basicOCSPResponse.tbsResponseData.responses;
SingleResponse[] singleResponses = _seqOfSingleResponse.elements;

for (SingleResponse singleResponse : singleResponses) {

  ReqCert reqCert = singleResponse.reqCert;
  CertID certId = (CertID) reqCert.getElement();
  CertificateSerialNumber ssn = certId.serialNumber;

  BigInteger bgSerial = ssn.value;
  if (bgSerial.equals(client.getSerialNumber())) {

    CertStatus certStatus = singleResponse.certStatus; // status in certStatus.getChoiceID()
    System.out.println("Client certificate found, status is " + certStatus.getElemName());

    if (certStatus.getChoiceID() == CertStatus._REVOKED) {

      RevokedInfo info = (RevokedInfo) certStatus.getElement();
      System.out.println("Reason: " + info.revocationReason.value);
      printDate("Revocation", info.revocationTime);

    } // if

    break;

} // for

Отредактировано пользователем 13 декабря 2016 г. 15:42:49(UTC)  | Причина: Не указана

Offline MehAnat  
#3 Оставлено : 13 декабря 2016 г. 16:39:31(UTC)
MehAnat

Статус: Участник

Группы: Участники
Зарегистрирован: 10.11.2016(UTC)
Сообщений: 10
Российская Федерация

спасибо, это то что искали. А есть ли документация по этим объектам и методам? или где еще можно посмотреть эти примеры кода? к JCP вроде как идет архив с примерами, но там такого не нашли
Offline Евгений Афанасьев  
#4 Оставлено : 13 декабря 2016 г. 17:00:17(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: MehAnat Перейти к цитате
спасибо, это то что искали. А есть ли документация по этим объектам и методам? или где еще можно посмотреть эти примеры кода? к JCP вроде как идет архив с примерами, но там такого не нашли

Документации нет, т.к. код ASN1P.jar генерируется по asn1-инструкциям, но имена классов/методов в большинстве случаев совпадают с теми, что представлены в RFC. В основном для проверки статуса используют пример OCSPValidateCert, а для декодирования OCSP ответа, скорее всего, код для BC.

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.