Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Автор: Kirill Sobolev  Цитата:Причем один и тот же сертификат добавлен в оба места с помощью панели управления CSP? Сертификат я добавлял программно в X509Store Через панель управления CSP у меня на компьютере почему то можно работать столько с контейнерами текущего пользователя ( я писал об этом выше )
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Через панель управления CSP у меня на компьютере почему то можно работать столько с контейнерами текущего пользователя ( я писал об этом выше ) Запустите ее от администратора, там есть ссылка на первой вкладке. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
На энный день удалось вот что отловить - если сгенерировать строку запроса ( requestStr ) в коде и сохранить ее значение в переменную, а потом закомментировать код генерации это строки и подсунуть в метод SubmitRequest сохраненную с прошлого запуска строку, то все работает! И я решил выяснить какая же строка мешает работе и оказалось, что signedCms.ComputeSignature(cmsSigner, true); Если ее закомментировать, то SubmitRequest прекрасно работает ( используем строку сгенерированную при прошлых запусках ), если ее раскомментить, то даже используя заведомо сохраненную строку запроса клиент не может связаться с сервером - ошибка все та же - Could not establish secure channel for SSL/TLS with authority 'ra-sa'. Похоже либо я что-то принципиально не так делаю, либо я столкнулся с какой-то внутренней ошибкой в реализации Crypto-pro. Пожалуйста, помогите мне с этой проблемой. Готов предоставить любые данные кроме доступа к серверу ra-sa. Прикладываю свой код Код: var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var saCert = store.Certificates[0];
// Create the binding.
var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
myBinding.Security.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.
EndpointAddress ea = new
EndpointAddress("https://RA-SA/RA/RA.asp");
var cspInformations = new CCspInformations();
cspInformations.AddAvailableCsps();
var key = new CX509PrivateKey
{
ProviderType = (X509ProviderType)75,
KeySpec = X509KeySpec.XCN_AT_SIGNATURE,
KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES,
MachineContext = false,
ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG,
CspInformations = cspInformations,
ContainerName = Guid.NewGuid().ToString()
};
IX509CertificateRequestPkcs10 request = new CX509CertificateRequestPkcs10();
request.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, key, null);
// Задаем DN.
request.Subject = new CX500DistinguishedNameClass();
request.Subject.Encode(saCert.Subject);
// Добавляем Extended Key Usage: Проверка подлинности клиента (1.3.6.1.5.5.7.3.2)
var clientAuth = new CObjectId();
clientAuth.InitializeFromName(CERTENROLL_OBJECTID.XCN_OID_PKIX_KP_CLIENT_AUTH);
// Пользователь Центра Регистрации, HTTP, TLS клиент (1.2.643.2.2.34.6)
var tlsClient = new CObjectId();
tlsClient.InitializeFromValue("1.2.643.2.2.34.6");
var ekuIds = new CObjectIds { clientAuth, tlsClient };
var ekuExtension = new CX509ExtensionEnhancedKeyUsage();
ekuExtension.InitializeEncode(ekuIds);
request.X509Extensions.Add((CX509Extension)ekuExtension);
// Добавляем Key Usage: Digital Signature, Non-Repudiation,
// Key Encipherment, Data Encipherment (f0)
var keyUsage = new CX509ExtensionKeyUsage();
// ReSharper disable BitwiseOperatorOnEnumWithoutFlags
keyUsage.InitializeEncode(
CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE
| CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_NON_REPUDIATION_KEY_USAGE
| CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE
| CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE);
request.X509Extensions.Add((CX509Extension)keyUsage);
// ReSharper restore BitwiseOperatorOnEnumWithoutFlags
// Кодируем запрос.
request.Encode();
// Объект, реализующий IX509Enrollment
var enrollment = new CX509Enrollment();
// Строка с запросом:
enrollment.InitializeFromRequest(request);
var contentInfo = new ContentInfo(Encoding.UTF8.GetBytes(enrollment.CreateRequest()));
var signedCms = new SignedCms(contentInfo, false);
var cmsSigner = new CmsSigner(saCert);
signedCms.ComputeSignature(cmsSigner, true);
var encode = signedCms.Encode();
var requestStr = Convert.ToBase64String(encode);
var client = new RaService.CertRequestSoapPortClient(myBinding, ea);
client.ClientCredentials.ClientCertificate.Certificate = saCert;
var requestId = client.SubmitRequest(requestStr, "1");
Console.WriteLine(requestId);
Console.ReadKey();
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
Windows 7 x64 UAC отключен Криптопро Ядро СКЗИ 3.6.5364 KC1 Версия продукта 3.6.7491 Прикладываю osinfo Вложение(я):  osinfo.xml (79kb) загружен 3 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.11.2010(UTC) Сообщений: 52 Откуда: Спб
Сказал(а) «Спасибо»: 4 раз
|
И вот к какому выводу удалось придти после еще эн часов раздумий. Когда вы используете сертификат для того, чтобы подписать что-либо, криптопро ( или windows ) его ломает, и дальше уже использовать его нельзя, потому что он как бы "сломанный". И надо опять получить его из хранилища! И вот тогда все работает!
Так что я делаю store.Close() store.Open(...) saCert = store.Certificates[0]; // эта строчка для примера, в реальном коде я получаю его по отпечатку
и только после этого создаю клиент.
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
В реализации класса SingedCms от Microsoft имеется ошибка. В некоторых случаях он закрывает дескриптор криптопровайдера, связанный с сертификатом для подписи. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close