Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Не удалось установить безопасный канал для SSL/TLS с полномочиями "cp-pek-cr"
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Здраввствуйте. Столкнулся со следующими проблемами. Развернут ЦР Криптопро, и сервер на IIS Сервер на IIS обладает сертификатом подтверждающим его права на выпуск и регистрацию пользователей. Проблема в том, что после старта сервера IIS первые несколько запросов выполняются и пользователь создается и сертификат выпускается а после этого пока не перезапустишь сервер на все попытки создать еще пользователей выдает Цитата:System.ServiceModel.Security.SecurityNegotiationException: Не удалось установить безопасный канал для SSL/TLS с полномочиями "cp-pek-cr". ---> System.Net.WebException: Запрос был прерван: Не удалось создать защищенный канал SSL/TLS. в System.Net.HttpWebRequest.GetResponse() в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) Все запросы делаются в 1 поток, закрыты lock. Пробовал сделать синглтон SOAP клиента эффект тот же. Пробовал сделать в Global.asax: Код: //Trust all certificates
ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);
// trust sender
ServicePointManager.ServerCertificateValidationCallback
= ((sender, cert, chain, errors) => true);
// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
но не помогло. Меня смущает больше всего тот факт, что он несколько ( минимум 1 ) раз работает, а потом сразу эта ошибка. Привожу свой код: Код:
lock (RaWorkerLock)
{
using (var client = CreateCertRequestClient())
{
try
{
var requestId = client.SubmitRequest(requestStr, "Автоматический запрос");
client.AcceptRequest(requestId, SignString(requestStr));
var certInfoXml = client.GetCertificateInfo(requestId);
var certificateUpdate = GetCertificateFromCertificateInfo(certInfoXml);
client.ConfirmRequest(requestId);
return certificateUpdate;
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
}
public RaService.CertRequestSoapPortClient CreateCertRequestClient()
{
try
{
// Create the binding.
var myBinding = new BasicHttpBinding
{
Security =
{
Mode = BasicHttpSecurityMode.Transport,
Transport = { ClientCredentialType = HttpClientCredentialType.Certificate }
}
};
var ea = new
EndpointAddress(RaUrl);
var client = new RaService.CertRequestSoapPortClient(myBinding, ea);
client.ClientCredentials.ClientCertificate.Certificate = ClientCertificate;
return client;
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,377 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 32 раз Поблагодарили: 706 раз в 614 постах
|
Какие версии КриптоПро CSP и .NET? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
CSP 3.6.7491 KC2
.net 1.0.5210.0
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,377 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 32 раз Поблагодарили: 706 раз в 614 постах
|
Для начала, установите последние: 3.6.7777 и 1.0.5425.0 |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Автор: maxdm Для начала, установите последние: 3.6.7777 и 1.0.5425.0 не помогло. Что дальше ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,377 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 32 раз Поблагодарили: 706 раз в 614 постах
|
Нет идей. Сможете предоставить пример для воспроизведения? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Автор: maxdm Нет идей. Сможете предоставить пример для воспроизведения? В целом суть такая - если мы создали CertRequestSoapPortClient однажды, то как бы мы не пытались его очистить, при создании и использовании следющих начинается эта ошибка. Если не очищать или использовать using (var client = CreateCertRequestClient()) то падает на 2-3, если замутить очистку пожестче (см ниже ) то порой удается прожить 5-7 созданий закрытий, но все равно валится. Код:var clientProxy = CreateCertRequestClient();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
Для воссоздания ситуации понадобятся следующие условия. Развернутый УЦ / ЦР Вторая машина с CS{ 3.6.7777 и .net 1.0.5425.0 с установленным сертификатом и закрытым ключом пользователя ЦР. Прикладываю свой референс на сервис ( RaService ) и класс, работающий с референсом ( RaWorker ) После чего в коде Код:var requests = new List<String> { /* сюда вставить 10 самоподписанных запросов на сертификат */ };
foreach ( var request in requests )
{
var clientCertificate = /* получить клиентский сертификат. У меня он получается каждый раз заново, вам тоже рекомендую, ибо http://www.cryptopro.ru/forum2/default.aspx?g=posts&t=6337 */
var raWorker = new RaWorker( "https://ra-sa/ra/ra.asp", clientCertificate);
return raWorker.CreateUserAndGetCertificate(request);
}
Для чистоты эксперимента у меня Windows Server 2008 все крутится на .net 4 в рамках Asp.Net MVc в IIS Код:using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.Xml.Linq;
using ExceptionsLibrary;
namespace CryptoLibrary.CertificateEnrollment
{
class RaWorker
{
public string RaUrl { get; set; }
public X509Certificate2 ClientCertificate { get; set; }
public RaWorker( String raUrl, X509Certificate2 clientCertificate )
{
RaUrl = raUrl;
ClientCertificate = clientCertificate;
}
// подписывает содержимое base64 строки и возвращает base64 строку
public String SignString(String str)
{
var encode = SignHelper.SignMsg(Convert.FromBase64String(str), ClientCertificate, detached:false);
return Convert.ToBase64String(encode);
}
public String ResignString(String str)
{
var buf = SignHelper.VerifyBuffer(Convert.FromBase64String(str)).Content.Content;
return SignString(Convert.ToBase64String(buf));
}
public X509Certificate2 GetCertificateFromCertificateInfo(String certInfoXml)
{
var doc = XDocument.Parse(certInfoXml);
XNamespace rs = "urn:schemas-microsoft-com:rowset";
XNamespace z = "#RowsetSchema";
var certBodyBase64 = doc.Descendants(rs + "data").Elements(z + "row").First().Attribute("PKCS").Value;
return new X509Certificate2(Convert.FromBase64String(certBodyBase64));
}
public X509Certificate2 SubmitAcceptConfirmCertRequest(String requestStr)
{
var client = CreateCertRequestClient();
try
{
var requestId = client.SubmitRequest(requestStr, "Автоматический запрос");
client.AcceptRequest(requestId, SignString(requestStr));
var certInfoXml = client.GetCertificateInfo(requestId);
var certificateUpdate = GetCertificateFromCertificateInfo(certInfoXml);
client.ConfirmRequest(requestId);
return certificateUpdate;
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
public X509Certificate2 SubmitAcceptConfirmFirstCertRequest(String regRequestId, String requestStr)
{
var client = CreateCertRequestClient();
try
{
bool unused = true;
string additionalInfo = null;
var requestId = client.SubmitFirstCertRequest(regRequestId, requestStr, ref unused, ref additionalInfo);
client.AcceptFirstRequest(requestId, SignString(requestStr));
var certInfoXml = client.GetCertificateInfo(requestId);
var certificateUpdate = GetCertificateFromCertificateInfo(certInfoXml);
client.ConfirmRequest(requestId);
return certificateUpdate;
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
public RaService.CertRequestSoapPortClient CreateCertRequestClient()
{
try
{
// Create the binding.
var myBinding = new BasicHttpBinding
{
Security =
{
Mode = BasicHttpSecurityMode.Transport,
Transport = { ClientCredentialType = HttpClientCredentialType.Certificate }
}
};
// Create the endpoint address. Note that the machine name
// must match the subject or DNS field of the X.509 certificate
// used to authenticate the service.
var ea = new
EndpointAddress(RaUrl);
var client = new RaService.CertRequestSoapPortClient(myBinding, ea);
Debug.Assert(client.ClientCredentials != null, "client.ClientCredentials != null");
client.ClientCredentials.ClientCertificate.Certificate = ClientCertificate;
return client;
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
public X509Certificate2 CreateUserAndGetCertificate(string selfSignedCertRequestBase64)
{
using (var registrationClient = CreateRegistrationClient())
{
try
{
var requestId = registrationClient.CreateRequestByAdmin(selfSignedCertRequestBase64, "1", "2",
"Автоматическая регистрация");
try
{
registrationClient.AcceptRequest(requestId);
}
catch (Exception)
{
}
return SubmitAcceptConfirmFirstCertRequest(requestId, selfSignedCertRequestBase64);
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
}
public RaService.RegistrationSoapPortClient CreateRegistrationClient()
{
try
{
// Create the binding.
var myBinding = new BasicHttpBinding
{
Security =
{
Mode = BasicHttpSecurityMode.Transport,
Transport = { ClientCredentialType = HttpClientCredentialType.Certificate }
}
};
// Create the endpoint address. Note that the machine name
// must match the subject or DNS field of the X.509 certificate
// used to authenticate the service.
var ea = new
EndpointAddress(RaUrl);
var client = new RaService.RegistrationSoapPortClient(myBinding, ea);
Debug.Assert(client.ClientCredentials != null, "client.ClientCredentials != null");
client.ClientCredentials.ClientCertificate.Certificate = ClientCertificate;
return client;
}
catch (Exception e)
{
throw new RaApiCallFailureException(e);
}
}
}
}
Отредактировано пользователем 11 декабря 2014 г. 8:19:58(UTC)
| Причина: Не указана Вложение(я): Service References.zip (21kb) загружен 4 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Еще в журнале windows заметил следующую ошибку КриптоПРО TLS ошибка 0x57 параметр задан неверно. Источник cpsspap Появляется 2 ошибки при каждом воспроизведении ошибки описанной в данном треде
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Причем в системном журнале пишет подтверждение Подтверждение SSL успешно выполнено Далее приведены согласованные параметры шифрование
ПРотокол TLS 1.0 Набор шифров 0х2f Стойкость обмена 1024
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Не удалось установить безопасный канал для SSL/TLS с полномочиями "cp-pek-cr"
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close