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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline lekhanoff  
#1 Оставлено : 26 мая 2017 г. 21:46:32(UTC)
lekhanoff

Статус: Новичок

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

Сказал(а) «Спасибо»: 5 раз
Добрый день!

Я разрабатываю функционал, который взаимодействует с веб-сервисом УЦ Крипто Про.
Использую Axis и JCP.

Мне удалось успешно отправить запрос на регистрацию пользователя (submitRegRequest) и принять этот запрос (acceptRegRequest).

Но далее при вызове метода submitCertRequest получаю ошибку:

Код:
{http://schemas.datacontract.org/2004/07/System.ServiceModel}ExceptionDetail:<HelpLink i:nil="true"/><InnerException i:nil="true"/><Message>(1): При выполнении операции произошла непредвиденная ошибка.</Message><StackTrace>   at RegistrationService.ServiceImplementation.PushChangesUtil.CallPushChanges(ChangedRowCollection changedRows)
   at RegistrationService.ServiceImplementation.RegAuthLegacyService.SendNewCertRequest(Guid userId, String rawSignedRegRequest, String userComment, String authority)
   at RegistrationService.ServiceImplementation.RegAuthLegacyService.SubmitCertRequest(String userId, String rawCertRequest, String userComment, String authority)
   at SyncInvokeSubmitCertRequest(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</StackTrace><Type>System.InvalidOperationException</Type>

(1): При выполнении операции произошла непредвиденная ошибка.

В логах на сервере, где установлен КриптоПро УЦ вижу вот такую ошибку:


Код:
It was not possible to create request for the certificate. Executor: Смирнов Анатолий (UserId: 8f6be19c-9439-e711-810c-005056953b1d)   Verbose: Добавление строки (Id: 094f7b0e-3d42-e711-810d-005056953b1d) в таблице CertRequest.
Список значений колонок:
Идентификатор запр. на сертификат (CertRequestId: 0x3000) = 094f7b0e-3d42-e711-810d-005056953b1d
Идентификатор пользователя (UserId: 0x3001) = e5f61fc4-b93f-e711-810d-005056953b1d
Статус запроса (код) (Status: 0x3004) = Q
Двоичный запрос (RawRequest: 0x300c) = System.Byte[]
Комментарий пользователя (UserComment: 0x3029) = user comment 1
Признак совместимости формата с 1.5 (CompatMode: 0x303d) = 0
   Error description: System.Security.Cryptography.CryptographicException: ASN1 bad tag value met.

   at CryptoPro.CertEncode.EncodeUtils.DecodeObjectEx(String structType, Byte[] pbEncoded, UInt32 dwFlags, HLOCAL& pvStructInfo)
   at CryptoPro.CertEncode.X509CertificateTemplateExtension.DecodeValue()
   at CryptoPro.Cmc.CmcRequest.GetTemplate()
   at CryptoPro.Configuration.ExtensionMethodTryGetTemplateOid.TryGetTemplateOid(CmcRequest request, IReadOnlyDictionary`2 name2Oid, Boolean allow15Templates, String& oid, Nullable`1& majorVersion, Nullable`1& minorVersion)
   at RegistrationService.BusinessLogic.Preprocess.ExtractTemplateAndCheckPermissionsOnTemplate(ChangeRaRowContext context, Object entityObject)
   at RegistrationService.BusinessLogic.ProcessActions.Run(ChangeRaRowContext context, Object entityObject, List`1& waitCompleteHandlers)
   at RegistrationService.BusinessLogic.ChangeRaRowOperation.OnRowChanging(ChangeRaRowContext context, Object entityObject, List`1& waitCompleteHandlers)
   at PkiService.BusinessLogic.ChangeRowOperationBase`1.Run(List`1& waitCompleteHandlers)


Вот мой код:
Код:
		
	public void testSubmitCertRequest() throws Exception {
		AxisProperties.setProperty("axis.socketSecureFactory", MySocketFactory.class.getCanonicalName());
		RegAuthLegacyServiceLocator locator = new RegAuthLegacyServiceLocator();
		RegAuthLegacyContract port = locator
				.getRegAuthLegacyServiceEndpoint(new URL("https://zzzz/RA/RegAuthLegacyService.svc"));

		final PrivateKey key = CMStools.loadKey("asmirnov", "123456".toCharArray());
		PrivateKey[] keys = new PrivateKey[1];
		keys[0] = key;

		final Certificate cert = CMStools.loadCertificate("asmirnov");
		Certificate[] certs = new Certificate[1];
		certs[0] = cert;

		// Для теста используются константы (пользователь ранее создан):
		String userID = "e5f61fc4-b93f-e711-810d-005056953b1d";

		String certRawRequest = createTestRawCertRequest(keys, certs);
		port.submitCertRequest(userID, certRawRequest, "user comment 1", null);

	}

	private String createTestRawCertRequest(PrivateKey[] keys, Certificate[] certs) throws Exception {
	    
		final KeyPairGenerator kg = KeyPairGenerator.getInstance(JCP.GOST_DH_NAME);
		final KeyPair pair = kg.generateKeyPair();
		
	    final GostCertificateRequest req = new GostCertificateRequest();
	    
	    req.init(JCP.GOST_DH_NAME, false);
	    req.setPublicKeyInfo(pair.getPublic());
	    req.setSubjectInfo("CN=" + "Aksenov");
	    int keyUsage = GostCertificateRequest.DIGITAL_SIGNATURE |
	            GostCertificateRequest.NON_REPUDIATION |
	            GostCertificateRequest.KEY_ENCIPHERMENT |
	            GostCertificateRequest.KEY_AGREEMENT;
	    req.setKeyUsage(keyUsage);
	    
	    //Передача CertificateTemplate
	    Extension ext = new Extension();
	    int[] extOid =  new OID("1.3.6.1.4.1.311.21.7").value;
	    ext.extnID = new Asn1ObjectIdentifier(extOid);
	    ext.critical = new Asn1Boolean(false);
	    ext.extnValue = new Asn1OctetString("1.2.643.2.2.46.0.8");
	    req.addExtension(ext);
	    
	    req.encodeAndSign(pair.getPrivate());
	    byte[] enc = req.getEncoded();
	    byte[] cms = CMS.CMSSign(enc, keys[0], certs[0], false);
	    
	    String signedRawRequest =  new String(Base64Codec.encodeBase64(cms));
	    
		return signedRawRequest;
	}




Подскажите, пожалуйста, в чем причина ошибки.
Offline Kirill Sobolev  
#2 Оставлено : 29 мая 2017 г. 10:56:06(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Здравствуйте

Вы неправильно кодируете расширение Certificate Template - это не просто строка, а более сложная структура.
https://msdn.microsoft.c...p/aa377580(v=vs.85).aspx
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
lekhanoff оставлено 29.05.2017(UTC)
Offline lekhanoff  
#3 Оставлено : 29 мая 2017 г. 11:54:51(UTC)
lekhanoff

Статус: Новичок

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

Сказал(а) «Спасибо»: 5 раз
Большое спасибо за ваш ответ!

Но у меня остается вопрос: как с помощью JCP сформировать указанную структуру?
Offline Евгений Афанасьев  
#4 Оставлено : 29 мая 2017 г. 15:11:28(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Автор: lekhanoff Перейти к цитате
Но у меня остается вопрос: как с помощью JCP сформировать указанную структуру?

Добавить можно примерно так:
Код:

import ru.CryptoPro.JCP.ASN.CA_Definitions.CertificateTemplate;
...
final String szOID_CERTIFICATE_TEMPLATE = "1.3.6.1.4.1.311.21.7";
final OID OID_CERTIFICATE_TEMPLATE = new OID(szOID_CERTIFICATE_TEMPLATE);

final OID selectedTemplateOid = new OID(template); // template - выбранный шаблон, например, "1.2.643.2.2.46.0.8" - пользователь

final CertificateTemplate certificateTemplate = new CertificateTemplate(
new Asn1ObjectIdentifier(selectedTemplateOid.value), new Asn1Integer(1), new Asn1Integer(0));

final Asn1DerEncodeBuffer buffer = new Asn1DerEncodeBuffer();
certificateTemplate.encode(buffer);

final byte[] encodedCertificateTemplate = buffer.getMsgCopy();
final Asn1OctetString certificateTemplateValue = new Asn1OctetString(encodedCertificateTemplate);

final Extension templateExtension = new Extension(new Asn1ObjectIdentifier(
OID_CERTIFICATE_TEMPLATE.value), certificateTemplateValue);

req.addExtension(templateExtension);



thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
lekhanoff оставлено 29.05.2017(UTC)
Offline lekhanoff  
#5 Оставлено : 29 мая 2017 г. 18:21:36(UTC)
lekhanoff

Статус: Новичок

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

Сказал(а) «Спасибо»: 5 раз
Большое спасибо за ваш ответ!

Я воспользовался вашим примером, но у меня, к сожалению, не импортируется класс:

Код:

import ru.CryptoPro.JCP.ASN.CA_Definitions.CertificateTemplate;


Я использую версию JCP 1.0.54.
Получается, что мне нужно переходить на JCP 2.0? Или все-таки в 1.0.54 есть альтернативна ru.CryptoPro.JCP.ASN.CA_Definitions.CertificateTemplate?
Offline Евгений Афанасьев  
#6 Оставлено : 30 мая 2017 г. 11:04:12(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Вероятно, этот класс появился в JCP 2.0. Он находится в модуле ASN1P, и вы, в принципе, можете его извлечь и декомпилировать. Другое дело, что в скором времени вам, вероятно, потребуется поддерживать также и ГОСТ 2012, а он есть только в JCP 2.0.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
lekhanoff оставлено 30.05.2017(UTC)
Offline lekhanoff  
#7 Оставлено : 30 мая 2017 г. 11:17:17(UTC)
lekhanoff

Статус: Новичок

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

Сказал(а) «Спасибо»: 5 раз
Огромное спасибо за помощь!
У меня все получилось.
Offline mikrob24RUS  
#8 Оставлено : 22 марта 2018 г. 14:04:28(UTC)
mikrob24RUS

Статус: Новичок

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

Здравствуйте!
Подскажите пожалуйста как возможно это расширение (1.3.6.1.4.1.311.21.7) добавить в запрос на C#, пишу для Рутокена?
Код:

// Список дополнительных полей
        static readonly string[] Exts =
        {
            "keyUsage",
            "digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment",
            "extendedKeyUsage",
            "1.3.6.1.5.5.7.3.2,...........", // набор улучшенных ключей
            "1.2.643.100.111",
            "ASN1:UTF8String:СКЗИ ........."
            "1.3.6.1.4.1.311.21.7", // пробовал и так и certificateTemplate
            "................,1,0" // Здесь некий мой OID шаблона, осн. версия и вспомогательная
        };

при выполнении
Код:

// Создание запроса на сертификат
      string csr = session.CreateCSR(publicKeyHandle, Dn, privateKeyHandle, null, Exts);

библиотека Рутокена отдаёт ошибку "Operation failed [Method: C_EX_CreateCSR, RV: CKR_ARGUMENTS_BAD]"
P.S. Примеры брал из Рутокен SDK

Отредактировано пользователем 22 марта 2018 г. 14:42:08(UTC)  | Причина: Не указана

Offline mikrob24RUS  
#9 Оставлено : 23 марта 2018 г. 13:37:37(UTC)
mikrob24RUS

Статус: Новичок

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

Нашёл решение! Если кому пригодится:
Код:

// Список дополнительных полей
        static readonly string[] Exts =
        {
            "keyUsage",
            "digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment",
            "extendedKeyUsage",
            "1.3.6.1.5.5.7.3.2,...........", // набор улучшенных ключей
            "1.2.643.100.111",
            "ASN1:UTF8String:СКЗИ ........."
            "1.3.6.1.4.1.311.21.7",
            "ASN1:SEQUENCE:certificateTemplate\n[certificateTemplate]\ntemplateID=OID:1.2.3.4\ntemplateMajorVersion=INTEGER:1\ntemplateMinorVersion=INTEGER:2"
        };
Offline meliffa  
#10 Оставлено : 16 апреля 2018 г. 14:55:11(UTC)
meliffa

Статус: Новичок

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

Сказал(а) «Спасибо»: 1 раз
Добрый день!
В продолжение вопросов lekhanoff:

Мы настроили УЦ, в качестве сервера используется виртуальная машина с win server 2012r, “КриптоПро УЦ 2.0, предварительная несертифицированная версия 2.0.6668.0000 от 4 апреля 2018 г.”, CSP 4.0.9842.
На клиенте : jcp-2.0
Используем ГОСТ 2012.
Пытаемся создать пользователя с помощью метода SubmitAndAcceptRegRequest.

Возвращается ошибка:

faultString: Ошибка проверки подписи.
faultActor:
faultNode:
faultDetail:
{http://schemas.microsoft.com/soap-toolkit/faultdetail/error/}errorInfo:<returnCode>-2147220974</returnCode><serverErrorInfo><description>Ошибка проверки подписи.</description></serverErrorInfo>

Подскажите, пожалуйста, из-за чего она может возникать и как нам настроить расширенное логирование для данной проблемы?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.