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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline igortche  
#1 Оставлено : 18 сентября 2012 г. 21:07:51(UTC)
igortche

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

Группы: Участники
Зарегистрирован: 10.09.2012(UTC)
Сообщений: 7
Откуда: Санкт-Петербург

Пробую использовать тестовый сервис проверки подписи, расположенный по адресу http://188.254.16.92:7777/gateway/services/SID0003038.
Создал носитель и хранилище, сделал запрос на сертификат, записал подписанный сертификат, а также, подписавший рутовый:
Код:

		GostCertificateRequest request = new GostCertificateRequest();
		
		request.setKeyUsage(GostCertificateRequest.CRYPT_DEFAULT);
		request.addExtKeyUsage(GostCertificateRequest.INTS_PKIX_CLIENT_AUTH);
		request.addExtKeyUsage(GostCertificateRequest.INTS_PKIX_SERVER_AUTH);
		
		KeyPair keyPair = KeyPairGen.genKey(Constants.SIGN_KEY_PAIR_ALG);
		
		request.setPublicKeyInfo(keyPair.getPublic());
		request.setSubjectInfo(DNAME);
		request.encodeAndSign(keyPair.getPrivate());
		
		String httpAddress = "http://www.cryptopro.ru/certsrv/";
		
		CertificateFactory cf = CertificateFactory.getInstance("X.509");
		ByteArrayInputStream bais;
		
		byte[] encodedCert = request.getEncodedCert(httpAddress);
		bais = new ByteArrayInputStream(encodedCert);
		Certificate cert = cf.generateCertificate(bais);
		
		byte[] encodedRootCert = GostCertificateRequest.getEncodedRootCert(httpAddress);
		bais = new ByteArrayInputStream(encodedRootCert);
		Certificate certRoot = cf.generateCertificate(bais);
		
		String certPath = HDImageStore.getDir() + File.separator + "root.crt";
		OutputStream outCert = new FileOutputStream(certPath);
		outCert.write(certRoot.getEncoded());
		outCert.close();
		
		List<Certificate> list = new ArrayList<Certificate>();
		list.add(cert);
		list.add(certRoot);
		
		KeyStore ks = KeyStore.getInstance("HDImageStore");
		ks.load(null, null);    // не существует хранилища сертификатов, проинициализированного именем данного ключевого носителя
		
		ks.setKeyEntry(CONT_NAME, keyPair.getPrivate(), PASSWORD, list.toArray(new Certificate[0]));
		ks.setCertificateEntry(CERT_NAME, certRoot);
		
		HDImageStore.setDir(HDS_DIR);
		
		String storePath = HDS_DIR + File.separator + CONT_NAME;
		OutputStream outStore = new FileOutputStream(storePath);
		ks.store(outStore, PASSWORD);
		outStore.close();

Далее подписываю soap-пакеты:
Код:

public static void signSoapMessage(SOAPMessage msg, String certSerNum, String certContent, PrivateKey privateKey) 
				throws SOAPException, XMLSecurityException, TransformerException {

		addNamespaceDeclarations(msg);
		
		Document doc = msg.getSOAPPart().getEnvelope().getOwnerDocument();
		
		// инициализация объекта формирования ЭЦП в соответствии с алгоритмом ГОСТ Р 34.10-2001
		final XMLSignature sig = new XMLSignature(doc, "", SIGN_METHOD);
		
		// создание узла преобразований <ds:Transforms> обрабатываемого XML-документа
		final Transforms transforms = new Transforms(doc);
		
		// добавление в узел преобразований правил работы с документом
		transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
		transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);
		
		// добавление в узел подписи ссылок (узла <ds:Reference>), определяющих правила работы с
		// XML-документом (обрабатывается текущий документ с заданными в узле <ds:Transforms> правилами
		// и заданным алгоритмом хеширования)
		sig.addDocument("#body", transforms, DIGEST_METHOD);
		
		SOAPHeader header = msg.getSOAPPart().getEnvelope().getHeader();
		if (header == null) {
				header = msg.getSOAPPart().getEnvelope().addHeader();
		}
		
		customizeSoapHeader(header, certSerNum, certContent, (SOAPElement)sig.getElement());
		
		// создание подписи объекта XML-документа
		sig.sign(privateKey);
}

Получаю следущий soap-пакет:
Код:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
	<soapenv:Header><wsse:Security xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" S:actor="http://smev.gosuslugi.ru/actors/smev"><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<ds:Reference URI="#body">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<ds:DigestValue>QqlfvmY9mysyWlfQtdyGDG2SlytYpBf3Y0AwySHO+nw=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
P3VIDN97FFltym8dbukg3IrpWHGvDidx88osNJc/D5ea0uc5CQ1OBS1zConlgNSgcg7a4W5RD53r
azIJwmxp5Q==
</ds:SignatureValue>
<ds:KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#CertId-130748464693857113771608" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-130748464693857113771608">MIIDgzCCAzKgAwIBAgIKG6/jcwACAAKOWDAIBgYqhQMCAgMwZTEgMB4GCSqGSIb3DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpDUllQVE8tUFJPMR8wHQYDVQQDExZUZXN0IENlbnRlciBDUllQVE8tUFJPMB4XDTEyMDkxNzIxNDYzN1oXDTE0MTAwNDA3MDk0MVowgboxHjAcBgkqhkiG9w0BCQEWD2luZm9AaXRuLnNwYi5ydTELMAkGA1UEBhMCUlUxJjAkBgNVBAcMHdCh0LDQvdC60YIt0J/QtdGC0LXRgNCx0YPRgNCzMTswOQYDVQQKDDLQmNC90YHQuNGC0YPRgiDQodC10YLQtdCy0YvRhSDQotC10YXQvdC+0LvQvtCz0LjQuTEmMCQGA1UEAwwd0KLQtdGB0YLQvtCy0YvQuSDRgdC10YDQstC40YEwYzAcBgYqhQMCAhMwEgYHKoUDAgIjAQYHKoUDAgIeAQNDAARAhkf4NXr2rxyGlgL6i27S+Kqtl4C4bfZWv1c6ACnuAGwcbHtp7yKrpSEgX79K7U/CE/gWfjuWvnEJ6/7tss1AvqOCAWowggFmMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwHQYDVR0OBBYEFBTCcoxTYXTMPj4waQYcQep9g/JCMB8GA1UdIwQYMBaAFG2PXgXZX6yRF5QelZoFMDg3ehAqMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvVGVzdCUyMENlbnRlciUyMENSWVBUTy1QUk8oMikuY3JsMIGgBggrBgEFBQcBAQSBkzCBkDAzBggrBgEFBQcwAYYnaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUvb2NzcG5jL29jc3Auc3JmMFkGCCsGAQUFBzAChk1odHRwOi8vd3d3LmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3BraS1zaXRlX1Rlc3QlMjBDZW50ZXIlMjBDUllQVE8tUFJPKDIpLmNydDAIBgYqhQMCAgMDQQCZ5U03aFYNNsbGio+eIwPwC/KaF9oxNnMhTz6lijnVrLSKmea6d7znpcJWgDwaaf+r4XfMUzUHREHGXsZVFy5u</wsse:BinarySecurityToken></wsse:Security></soapenv:Header><soapenv:Body wsu:Id="body" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
		<ns9:UnifoTransferMsg xmlns:ns9="http://roskazna.ru/SmevUnifoService/" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://smev.gosuslugi.ru/rev110801" xmlns:ns4="http://roskazna.ru/xsd/PGU_ImportRequest" xmlns:ns5="http://rosrazna.ru/xsd/SmevUnifoService" xmlns:ns6="http://roskazna.ru/xsd/Ticket" xmlns:ns7="http://roskazna.ru/xsd/PGU_DataRequest" xmlns:ns8="http://www.w3.org/2004/08/xop/include">
			<ns3:Message>
				<ns3:Sender>
					<ns3:Code>0000000001</ns3:Code>
					<ns3:Name>External Organization</ns3:Name>
				</ns3:Sender>
				<ns3:Recipient>
					<ns3:Code>0000000000</ns3:Code>
					<ns3:Name>UNIFO</ns3:Name>
				</ns3:Recipient>
				<ns3:Originator>
					<ns3:Code>0000000001</ns3:Code>
					<ns3:Name>External Organization</ns3:Name>
				</ns3:Originator>
				<ns3:TypeCode>Request</ns3:TypeCode>
				<ns3:Date>2011-09-09T16:15:39.200+04:00</ns3:Date>
			</ns3:Message>
			<ns3:MessageData>
				<ns3:AppData>
					<ns5:exportData>
						<ns7:DataRequest kind="CHARGE">
							<PostBlock>
								<ID>444</ID>
								<TimeStamp>2011-09-09T16:15:39.201+04:00</TimeStamp>
								<SenderIdentifier>044525716</SenderIdentifier>
							</PostBlock>
							<Payers>
								<PayerIdentifier>67CE036679</PayerIdentifier>
							</Payers>
						</ns7:DataRequest>
					</ns5:exportData>
				</ns3:AppData>
			</ns3:MessageData>
		</ns9:UnifoTransferMsg>
	</soapenv:Body>
</soapenv:Envelope>

Отправляю его на вышеуказанный сервис проверки подписи (см. http://www.cryptopro.ru/forum2/....aspx?g=posts&t=5207), где vsrType.setIsCertCheck(true);.
Получаю код ошибки 11 (= Не установлен доверенный сертификат. Не удается отследить цепочку сертификации сертификата подписи).
В чём может быть ошибка?

Игорь.
Offline Евгений Афанасьев  
#2 Оставлено : 18 сентября 2012 г. 21:26:53(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Судя по ответному сообщению, происходит попытка проверить цепочку сертификатов на сервере, причем корневой сертификат Тестового УЦ там не установлен в доверенные (вы требуете проверить сертификат vsrType.setIsCertCheck(true)). Задайте setIsCertCheck(false).

Отредактировано пользователем 18 сентября 2012 г. 21:28:09(UTC)  | Причина: Не указана

Offline igortche  
#3 Оставлено : 18 сентября 2012 г. 21:48:55(UTC)
igortche

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

Группы: Участники
Зарегистрирован: 10.09.2012(UTC)
Сообщений: 7
Откуда: Санкт-Петербург

Если я ставлю false, то сервис возвращает 0 (Ок), даже если soap-пакеты подписываются самосгенерённым сертификатом. Поэтому, хочется проверить, как будет в боевом варианте. Если, как Вы говорите,
Цитата:
корневой сертификат Тестового УЦ там не установлен в доверенные

можно ли где-то найти подобный сервис, который бы подписывал запрсы на тестовые сертификаты (наподобие http://www.cryptopro.ru/certsrv/), а затем проверял бы soap-пакеты, подписанные этими тестовыми сертификатами (наподобие http://188.254.16.92:7777/gateway/services/SID0003038)?
Offline Евгений Афанасьев  
#4 Оставлено : 18 сентября 2012 г. 22:03:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
В боевом режиме можно проверить, если использовать ключ и сертификат, выпущенный настоящим УЦ. На счет других сервисов не в курсе.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.