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

Уведомление

Icon
Error

4 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline gopNick  
#1 Оставлено : 23 сентября 2008 г. 23:48:37(UTC)
gopNick

Статус: Участник

Группы: Участники
Зарегистрирован: 23.09.2008(UTC)
Сообщений: 20
Откуда: Н.Новгород

Есть примитивное приложение:
Код:

    public partial class Form1 : Form
    {
        public Form1()
        {
            
            InitializeComponent();
            try
            {
                MessageBox.Show(Send(new System.Uri(@"https://172.16.1.3:10000/testResponse.asp"), "HELLO", ChoiceCert()[0], Encoding.Default));
            }
            catch (System.Exception e)
            {
                MessageBox.Show(e.Message);
                MessageBox.Show(e.StackTrace);
            }
        }

        public X509Certificate2Collection ChoiceCert()
        {
            X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadWrite);
            X509Certificate2Collection storecollection = store.Certificates;

            X509Certificate2Collection certInspCol = X509Certificate2UI.SelectFromCollection(storecollection,
                                                "Choice cert",
                                                "Choice cert",
                                                X509SelectionFlag.SingleSelection);

            X509Certificate2Enumerator en = certInspCol.GetEnumerator();
            en.Reset();
            if (!en.MoveNext()) return null;
            return certInspCol;


        }


        public static string Send(Uri uri, string question, X509Certificate clientCertificate, Encoding encoding)
        {
            if (null == uri)
                throw new ArgumentNullException("uri");

            string answer;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.ProtocolVersion = new Version(1, 0);

            if (null != clientCertificate)
                request.ClientCertificates.Add(clientCertificate);
                        
            //ServicePointManager.CertificatePolicy = new MyCertificateValidation();
            if (!string.IsNullOrEmpty(question))
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";

                StreamWriter streamWriter = null;

                try
                {
                    Stream reqStream = request.GetRequestStream();
                    streamWriter = new StreamWriter(reqStream, encoding);
                    streamWriter.Write(question);
                }
                finally
                {
                    if (null != streamWriter)
                        streamWriter.Close();
                }
            }

            WebResponse response = request.GetResponse();
            StreamReader streamReader = null;

            try
            {
                streamReader = new StreamReader(response.GetResponseStream(), encoding);
                answer = streamReader.ReadToEnd();
            }
            finally
            {
                if (null != streamReader)
                    streamReader.Close();
            }

            return answer;
        }        
    }



Которое открывает примитивную страницу:
(testResponse.asp)
Код:

<%@ EnableSessionState="False" Language = "JScript" CODEPAGE="1251" %> 
<%
      Response.Write("OK");
%>


Сертификат сервера и клиента "не-крипто-прошные", а "виндюковые".

Если на сервере установлена указанная выше версия крипто-про, то при выполнении приложения возникает исключение , которое не ловиться cath'ем .
Звучит оно так:

Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\TaxSSL\TestConnection\bin\Debug\TestConnection.vshost.exe'.
Additional Information: The runtime has encountered a fatal error. The address of the error was at 0x79e754f3, on thread 0xf3c. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.



Сношу крипто-про из установки и удалении программ - всё начинает работать и я получаю вожделенный "ОК" в респонсе.
Ставлю заново - снова получаю Exception.

Exception возникает в строчке
Код:
WebResponse response = request.GetResponse();



Причём выяснено что проблема именно в клиенте. Так как если всё это проделывать не на сервере с ИИСом (6.0), а на машине рядом - то суть такая:
1. Если на клиенте 3.6. бета и система x64 - то такой же эксепшен.
2. Если на клиенте 3.0. и система x32 - то всё отлично.

Очень печалит.



Added:

В эксплорере страница отлично запрашивает сертификат и открывается.
Т.е. проблема конкрентно в этом .нетовском GetResponse.

Отредактировано пользователем 24 сентября 2008 г. 0:01:19(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 24 сентября 2008 г. 2:49:47(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Посмотрю
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#3 Оставлено : 25 сентября 2008 г. 17:21:02(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Какая версия CSP 3.6?
На текущей сборке не воспроизводится.
Знания в базе знаний, поддержка в техподдержке
Offline gopNick  
#4 Оставлено : 26 ноября 2008 г. 18:34:53(UTC)
gopNick

Статус: Участник

Группы: Участники
Зарегистрирован: 23.09.2008(UTC)
Сообщений: 20
Откуда: Н.Новгород

Версия продукта: 3.6.5009
Версия крипто-графического ядра (СКЗИ) : КС2 3.6.4070

Операционка: Windows 2003 Server SP2 RC2 x64

Нашел еще одну проблему:

Код:

BOOL SecurityAPI::GetSignatureB64(PCCERT_CONTEXT pSignerCert,
								  _bstr_t ClearText,_bstr_t* SignB64  )
{

	cLog.Add("Вход GetSignatureB64");
	_bstr_t res="";
	BYTE* pbMessage=(BYTE*)(char*)ClearText;
	DWORD cbMessage=ClearText.length();
	BYTE* pbSignedMessageBlob;
	DWORD cbSignedMessageBlob;



	DWORD cbDecodedMessageBlob=0;
	BYTE  *pbDecodedMessageBlob=0;

	CRYPT_SIGN_MESSAGE_PARA  SigParams;
//	CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
	// Create the MessageArray and the MessageSizeArray.


	const BYTE* MessageArray[] = {pbMessage};
	DWORD MessageSizeArray[1];
	MessageSizeArray[0] = cbMessage;

	memset(&SigParams, 0, sizeof(CRYPT_SIGN_MESSAGE_PARA));

	SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
	SigParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
	SigParams.pSigningCert = pSignerCert;
	//SigParams.HashAlgorithm.pszObjId =  szOID_CP_GOST_R3411_R3410;//szOID_RSA_MD5 //szOID_RSA_SHA1RSA;
	 
	//SigParams.HashAlgorithm.Parameters.cbData=NULL;
	SigParams.HashAlgorithm.pszObjId=szOID_RSA_SHA1RSA;//pSignerCert->pCertInfo->SignatureAlgorithm.pszObjId;
	SigParams.HashAlgorithm.Parameters.cbData = NULL;
	SigParams.cMsgCert = 1;
	SigParams.rgpMsgCert = &pSignerCert;
	SigParams.cAuthAttr = 0;
	SigParams.dwInnerContentType = 0;
	SigParams.cMsgCrl = 0;
	SigParams.cUnauthAttr = 0;
	SigParams.dwFlags = 0;
	SigParams.pvHashAuxInfo = NULL;
	SigParams.rgAuthAttr = NULL;

	//--------------------------------------------------------------------
	// With two calls to CryptSignMessage, sign the message.
	// First, get the size of the output signed BLOB.

	if(CryptSignMessage(
		&SigParams,            // Signature parameters
		TRUE,                 // Not detached
		1,                     // Number of messages
		MessageArray,          // Messages to be signed
		MessageSizeArray,      // Size of messages
		NULL,                  // Buffer for signed message
		&cbSignedMessageBlob)) // Size of buffer
	{
		printf("The size of the BLOB is %d.\n",cbSignedMessageBlob);
	}
	else
	{
		DWORD dwLE=GetLastError();
		LastError="Getting signed BLOB size failed ERRID="+_bstr_t(dwLE)+" HashAlgorithm="+_bstr_t(SigParams.HashAlgorithm.pszObjId);
		cLog.Add("Getting signed BLOB size failed ERRID="+_bstr_t(dwLE)+" HashAlgorithm="+_bstr_t(SigParams.HashAlgorithm.pszObjId));//+dwLE);
		return FALSE;
		//MyGetError("Getting signed BLOB size failed");
	}



Без Крипто-Про на машине или с Крипто-Про 3.6 более ранних сборок - всё работало вот так:

SigParams.HashAlgorithm.pszObjId=pSignerCert->pCertInfo->SignatureAlgorithm.pszObjId;

Сертификаты которые использовались имели HashAlgorithm=szOID_RSA_SHA1RSA.

С текущей сборкой работает ТОЛЬКО если я принудительно ставлю
SigParams.HashAlgorithm.pszObjId=szOID_RSA_MD5;

в остальных случаях GetLastError = 2148077570

(szOID_CP_GOST_R3411_R3410 - кстати тоже не работает).










Offline gopNick  
#5 Оставлено : 26 ноября 2008 г. 18:37:21(UTC)
gopNick

Статус: Участник

Группы: Участники
Зарегистрирован: 23.09.2008(UTC)
Сообщений: 20
Откуда: Н.Новгород

О кстати, я так понимаю - корни одни и те же:
http://www.cryptopro.ru/...t.aspx?g=posts&t=859


По крайней мере - код ошибки один и тот же и если сношу крипто-про - то тоже "вертаецца взад".

Отредактировано пользователем 26 ноября 2008 г. 18:39:34(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#6 Оставлено : 27 ноября 2008 г. 23:35:27(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
//SigParams.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411_R3410 - разве это алгоритм хэширования?
Да, и доступна новая сборка 3.6. Были некие проблемы с подписью на х64 (пришлось исправлять ошибки MS)

Отредактировано пользователем 27 ноября 2008 г. 23:47:19(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline gopNick  
#7 Оставлено : 28 ноября 2008 г. 20:21:40(UTC)
gopNick

Статус: Участник

Группы: Участники
Зарегистрирован: 23.09.2008(UTC)
Сообщений: 20
Откуда: Н.Новгород

Попробовал новую сборку.

SigParams.HashAlgorithm.pszObjId=szOID_RSA_SHA1RSA;

Ошибка осталась

Хотя на самом деле мне хочеться шоб тут было вот так

SigParams.HashAlgorithm.pszObjId=pSignerCert->pCertInfo->SignatureAlgorithm.pszObjId;

Отредактировано пользователем 28 ноября 2008 г. 20:23:53(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#8 Оставлено : 28 ноября 2008 г. 20:32:14(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
еще раз повторяю - это НЕ алгоритм хэширования, а алгоритм подписи. А если хочется - то реализуйте собственное API.
Знания в базе знаний, поддержка в техподдержке
Offline gopNick  
#9 Оставлено : 28 ноября 2008 г. 22:33:21(UTC)
gopNick

Статус: Участник

Группы: Участники
Зарегистрирован: 23.09.2008(UTC)
Сообщений: 20
Откуда: Н.Новгород

Проблема в том, что я не использую гостовские сертификаты. НО!!!
Если на машине 2003 x64 стоит 3.6. крипто - про - то всё перестаёт работать.
По поводу - не алгоритм хеширования - szOID_RSA_SHA1RSA -вот это тоже не он?
Тогда почему без крипто-про 3.6. - это прекрасно работает?

И с крипто-про 3.0 - это прекрасно работает.
Даже со старой сборкой 3.6. - это тоже прекрасно работает.
Стоит поставить новую сборку - не работает.

Вот этот пример с установленной 3.6. крипто-про работать не будет. Сертификаты не гостовские.
Сносим крипто-про 3.6 - всё работает.
http://msdn.microsoft.co...ary/aa904939(VS.85).aspx

У меня ПО - вообще не привязано ни коим местом к вашему АПИ. Но хочецца шоб и с ним оно тоже могло работать.

Отредактировано пользователем 28 ноября 2008 г. 22:34:34(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#10 Оставлено : 29 ноября 2008 г. 0:19:24(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
szOID_RSA_SHA1RSA - это алгоритм подписи хэш - sha1, ключ - RSA
Про неработоспособность - посмотрим.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
4 Страницы123>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.