Статус: Новичок
Группы: Участники
Зарегистрирован: 27.06.2008(UTC) Сообщений: 2
|
Имеется проблема: "The request was aborted: Could not create SSL/TLS secure channel." - такое исключение возбуждается после того, как я пытаюсь создать TLS/SSL соединение.
Используемое ПО: Крипто-Про (ядро СКЗИ: 3.6.4070 KC1, продукт: 3.6.4856). Sharpei (ver:1006, runtime:v2.0.50727) MS Visual Studio 2005, (Express 2008)
using System; using System.IO; using System.Collections.Generic; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Net; using CryptoPro.Sharpei; using System.Text;
namespace Test { class Program { static void Main ( string[] args ) { string requestURL = "https://<сервер>"; string proxy_addr = "proxy:8080"; string proxy_user = args[0]; string proxy_pass = args[1]; string user_agent = "CSharp HTTP Sample"; string find_value = "серийный номер ключа"; X509FindType find_type = X509FindType.FindBySerialNumber; byte[] data = System.Text.Encoding.GetEncoding(1251).GetBytes("<?xml version=\"1.0\" encoding=\"windows-1251\" ?>"); WebProxy proxy; X509Store store; X509Certificate2 cert; CookieContainer cc;
if (((proxy = new WebProxy(proxy_addr, true)) != null) && ((proxy.Credentials = new NetworkCredential(proxy_user, proxy_pass))!=null)) { if ((store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) != null) { store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); X509Certificate2Collection collection = store.Certificates.Find(find_type, find_value, true); if (collection.Count > 0) { cert = collection[0]; HttpWebRequest http_req = (HttpWebRequest)WebRequest.Create(requestURL); if ((http_req != null) && ((cc = new CookieContainer())) != null) { if ((http_req.ClientCertificates.Add(cert) >= 0) && (http_req.ClientCertificates.Count > 0)) { http_req.CookieContainer = cc; http_req.Credentials = CredentialCache.DefaultCredentials; http_req.UserAgent = user_agent; http_req.Proxy = proxy; http_req.KeepAlive = true; http_req.Headers.Set("Pragma", "no-cashe"); http_req.Timeout = 300000; http_req.Method = "POST"; http_req.ContentType = "application/x-www-form-urlencoded"; http_req.ContentLength = data.Length;
using (Stream stream = http_req.GetRequestStream()) { stream.Write(data, 0, data.Length); stream.Close(); } // using stream //} // if } // if } // if store.Close(); } // if } // if } } // class Program } // namespace Test
StackTrace: at System.Net.HttpWebRequest.GetRequestStream() at TestBlizko.Program.Main(String[] args) in D:\Visual Studio 2005\Projects\Test\Test\Program.cs:line 56 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
Прошу помочь разобраться в проблеме.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.05.2008(UTC) Сообщений: 11 Откуда: Москва
|
А без прокси сервера пробовали???
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.06.2008(UTC) Сообщений: 2
|
Без прокси тоже пробовали. Результат тот же.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Попробуйте поставить SP1 на .Net Framework. Если ошибка не пропадет напишите есть ли сообщения в Application log от CPNetDetours? |
С уважением, Александр. |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.05.2008(UTC) Сообщений: 11 Откуда: Москва
|
Необходимо имперционацию делать на ASP .net !!!
Вот пример:
============ Вот мы класс для этих целей создали ================
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Security.Principal;
namespace CryptoPro { public class Impersonate { public const int LOGON32_LOGON_INTERACTIVE = 2; public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll")] public static extern int LogonUserA(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern bool CloseHandle(IntPtr handle);
public bool impersonateValidUser(String userName, String domain, String password) { WindowsIdentity tempWindowsIdentity; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf()) { if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); if (impersonationContext != null) { CloseHandle(token); CloseHandle(tokenDuplicate); return true; } } } } if (token != IntPtr.Zero) CloseHandle(token); if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate); return false; }
public void undoImpersonation() { if (impersonationContext != null) { impersonationContext.Undo(); } } } }
============== Вот так использовать ==============
CryptoPro.Impersonate impersonate = new CryptoPro.Impersonate(); try { if (impersonate.impersonateValidUser(ImpersonateLogin, "", ImpersonatePassword)) {
// всю логику нужно уложить после имперционации!
xml = remoteObject.ExecuteRequest(doc.OuterXml, out ErrorMessage, xs); } } finally { impersonate.undoImpersonation(); }
=====================
всю логику нужно уложить после имперционации!
Вот так вроде!
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
alexlexa написал:Необходимо имперционацию делать на ASP .net !!!
Это к чему? ASP .Net и сам умеет прекрасно имперсонироваться, если попросить. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.04.2009(UTC) Сообщений: 2
|
Эта проблема так и повисла? У меня сейчас возникает аналогичная ошибка (Visual Studio 2005, .Net Framework 2.0 SP1, "CryptoPRO CSP" (версия ядра СКЗИ: 3.6.4070 КС1, версия продукта: 3.6.4856), сертификаты прописаны в реестре). Возникает ошибка: Запрос был прерван: Не удалось создать защищенный канал SSL/TLS. Код:
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection scollection = (X509Certificate2Collection)store.Certificates.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
X509Certificate2Collection ui = X509Certificate2UI.SelectFromCollection(scollection, "Выберите сертификат", "Сертификаты:", X509SelectionFlag.SingleSelection);
if (ui.Count == 1)
{
X509Certificate2 x509 = ui[0];
ServicePointManager.ServerCertificateValidationCallback += delegate(object senderobj, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors error) { return true; };
ServicePointManager.Expect100Continue = true;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://br.so-cdu.ru/Main.aspx");
request.Proxy = HttpWebRequest.DefaultWebProxy;
request.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
request.PreAuthenticate = true;
request.AllowAutoRedirect = false;
request.KeepAlive = false;
request.ClientCertificates.Add(x509);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
webBrowser.DocumentStream = response.GetResponseStream();
}
Ошибка происходит в строке: HttpWebResponse response = (HttpWebResponse)request.GetResponse();Отредактировано пользователем 29 апреля 2009 г. 18:04:19(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Какая версия КриптоПро Sharpei стоит? Напишите полный текст исключения (со стеком). Есть ли ошибки в log от CPNetDetours? Нормально ли устанаваливается соединение в IE с этим web site?
|
С уважением, Александр. |
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
CSP 3.6 не мешало бы обновить. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.12.2007(UTC) Сообщений: 22 Откуда: Екатеринбург
|
У меня в точности такая же ошибка (System.Net.WebException: Запрос был прерван: не удалось создать защищенный канал SSL/TLS) валится на Висте с КриптоПро 3.6.4804 (версия ядра 3.6.4070 КС1) при попытке установить https-соединение (без использования клиентского сертификата) с веб-службой.
При этом: - Sharpei не используется совсем (используются только родные дот-нетовские классы для работы с веб-службами); - в системный журнал валится ошибка с кодом 307 от источника cpsspap: "КриптоПро TLS. Ошибка 0x80090330 протокола TLS: Указанные данные не могут быть расшифрованы"; - при обращении к wsdl-ке веб-службы через IE https-соединение нормально устанавливается; - после замены Крипто-Про на версию 3.6.5329 ошибка пропадает; - на Висте с КриптоПро 3.6.5152 (версия ядра 3.6.4071 КС1) ошибка не наблюдалась.
Таким образом, подозрение падает на конкретный билд ядра КриптоПро (3.6.4070)...
Подробности по ошибке: System.Net.WebException: Запрос был прерван: не удалось создать защищенный канал SSL/TLS. System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request) System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request) System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) PkiTools.Enroll.Client.CertificateEnrollmentGatewayProxy.GetRequestForms(String tokenId, RequestFormState formState) ... Операционная система: Win32NT 6.0.6000.0 Используемая версия .NET Framework: 2.0.50727.3074 |
С уважением, Андрей Костоусов СКБ Контур |
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close