Статус: Активный участник
Группы: Участники
Зарегистрирован: 04.10.2011(UTC) Сообщений: 74 Откуда: Moscow
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Здравствуйте, с помощью либ входящих в JCP(1.0.52): 1 генерирую пару ключей 2 получаю серт. открытого ключа с помошью GostCertificateRequest 3 формирую OCSPRequest и посылаю его на http://www.cryptopro.ru/ocspnc/ocsp.srf (или http://www.cryptopro.ru/ocsp/ocsp.srf)сервер возвращает ошибку 413 Request Entity Too Large. отправляемый content-length 186 байт. Как быть? Код:
package test;
import com.objsys.asn1j.runtime.Asn1DerDecodeBuffer;
import com.objsys.asn1j.runtime.Asn1DerEncodeBuffer;
import com.objsys.asn1j.runtime.Asn1Exception;
import com.objsys.asn1j.runtime.Asn1Null;
import com.objsys.asn1j.runtime.Asn1OctetString;
import ru.CryptoPro.JCP.ASN.CertificateExtensions.GeneralName;
import ru.CryptoPro.JCP.ASN.PKIX1Explicit88.AlgorithmIdentifier;
import ru.CryptoPro.JCP.ASN.PKIX1Explicit88.CertificateSerialNumber;
import ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Name;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.CertID;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.OCSPRequest;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.OCSPResponse;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.OCSPVersion;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.ReqCert;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.Request;
import ru.CryptoPro.JCP.ASN.PKIXOCSP.TBSRequest;
import ru.CryptoPro.JCP.ASN.PKIXOCSP._SeqOfRequest;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.params.OID;
import ru.CryptoPro.JCPRequest.GostCertificateRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.List;
import java.util.Map;
/** @author i.karpov */
public class CPOCSPClientTest {
private static final String CP_OCSP_URL = "http://www.cryptopro.ru/ocspnc/ocsp.srf";
private static final String CP_CA = "http://www.cryptopro.ru/certsrv/";
public static void main(String[] args) throws Exception {
X509Certificate cert = createPrvKeyAndCert();
process(CP_OCSP_URL, cert);
}
private static X509Certificate createPrvKeyAndCert()
throws NoSuchProviderException, NoSuchAlgorithmException, IOException, CertificateException, SignatureException, InvalidKeyException {
KeyPairGenerator kg = KeyPairGenerator.getInstance(JCP.GOST_DEGREE_NAME, JCP.PROVIDER_NAME);
KeyPair keys = kg.generateKeyPair();
GostCertificateRequest r = new GostCertificateRequest();
r.setPublicKeyInfo(keys.getPublic());
r.setSubjectInfo("CN=V.Pupkin, OU=Security, O=CryptoPro, C=RU");
r.encodeAndSign(keys.getPrivate());
byte[] encodedCert = r.getEncodedCert(CP_CA);
X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(encodedCert));
return cert;
}
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("OCSP OK");
}
private static OCSPRequest createOCSPRequest(X509Certificate cert) throws Exception {
TBSRequest tbsRequest = new TBSRequest();
tbsRequest.version = new OCSPVersion(1);
tbsRequest.requestorName = getSubjectName(cert);
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.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 GeneralName getSubjectName(X509Certificate cert) throws Asn1Exception, IOException {
final byte[] encodedName = cert.getSubjectX500Principal().getEncoded();
final Name name = new Name();
name.decode(new Asn1DerDecodeBuffer(encodedName));
GeneralName gn = new GeneralName();
gn.set_directoryName(name);
return gn;
}
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();
}
}
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
По умолчанию ограничение на размер запроса 150 байт. Как правило этого достаточно для запроса о статусе одного сертификата.
Вы можете выложить отправляемый запрос в бинарном виде?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 04.10.2011(UTC) Сообщений: 74 Откуда: Moscow
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Новожилова Елена написал: Вы можете выложить отправляемый запрос в бинарном виде?
вот
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,362 Сказал «Спасибо»: 550 раз Поблагодарили: 2218 раз в 1732 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,362 Сказал «Спасибо»: 550 раз Поблагодарили: 2218 раз в 1732 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 04.10.2011(UTC) Сообщений: 74 Откуда: Moscow
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
проблема решилась след образом: 1) параметр tbsRequest.requestorName (опциональный) = null 2) параметр tbsRequest.version = new OCSPVersion(0); 3) certID.issuerNameHash = new Asn1OctetString(digest(cert.getIssuerX500Principal().getEncoded())); -> certID.issuerNameHash = new Asn1OctetString(digest(caCert.getSubjectX500Principal().getEncoded())); certID.issuerKeyHash = new Asn1OctetString(digest(cert.getPublicKey().getEncoded())); -> certID.issuerKeyHash = new Asn1OctetString(digest(caCert.getPublicKey().getEncoded())); , где в caCert есть CA cert. Отредактировано пользователем 27 октября 2011 г. 13:51:54(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил pls за этот пост.
|
mrnuke оставлено 17.12.2014(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close