шифрование и сертификаты

Тема в разделе ".NET", создана пользователем sadgb, 22 окт 2007.

  1. sadgb

    sadgb Гость

    :(
    Здравствуйте )
    Вот уже 4 дня не могу разобраться с задачей а она такая
    есть windows xp и есть windows server 2003 на них запущенно распределённое приложение
    задача передать сообщение от xp к server 2003 по открытому каналу соответственно надо использовать шифрование с открытым ключом и цифровые сертификаты.(и то и другое испольовать обязательно).
    я посидел почитал гугл почитал мсдн но результатов совсем и совсем не густо.
    посмотрел как используется rsa шифрование вроде немного разобрался с этим
    вот какой алгоритм я набросал (мне кажеться он такой помогите исправить если не верен)
    пусть П1 - программа в xp а П2 программа в server 2003
    1. П2 регистрирует RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); и тут у нас уже будет 2 ключа. я прав ?
    2. П2 как то делает сертификат со своим открытым ключом
    3. П1 получает открытый ключ программы2 (как ?) и проверяет по базе сертификатов (как?)
    4. П1 шифрует открытым ключом программы2 и пересылает программе2
    5. П2 расшифровывает

    собственно если в целом принять эту последовательность правильной (а так ли это я надеюсь вы мне сейчас скажете)
    помогите с шагами 2 и 3 . у меня что то вообще нету никаких идей дайте пример там на си++ или шарпе
    и кстати хотелось бы чтобы было 2 вот этих приложения и больше не надо было ничего настраивать в сервере и в хр это возможно?
    или всё таки надо настроить удостоверяющий центр
    в любом случае хочеться чтобы не надо было руками добавлять сертификат а это делали сами программы(это возможно?)
    пожалуйста ответьте на вопросы по тексту и по алгоритму и если не трудно помогите с реализацией. там примеры итд оч надо правдо.
    заранее спасибо. буду ждать ответа
     
  2. Pasha

    Pasha Гость

    Для: sadgb
    Код отправки/получения сообщений уже написан? Если нет, то просто используй Windows Communication Foundation, он умеет и сообщения по https передавать, и клиентов по сертификатам различать. Если да - то читай про makecert.exe (2) и классы из System.Security.Cryptography.X509Certificates (3).
     
  3. sadgb

    sadgb Гость

    ушёл читать про WCF.
    СОобщения и передачу вобще не писал ещё тк не понял работу с сертификатами.
    уточни что ты имел в виду говоря код отправки ?
    я смотрел этот класс возникли сложности. можно простенькое что нибудь нарисовать?
    например в а храниться открытый ключ в b закрытый
    как вот например получить сертификат и как запросить открытый ключ по имени у бюросертификатов. опять же остаёться вопрос о том како й софт настроить надо кроме програмсмы чтобы всё работало
     
  4. Pasha

    Pasha Гость

    Для: sadgb
    Под кодом отправки подразумевались сообщения и их передача.
    Почитай про WCF внимательнее, там все особенности реализации скрыты. Т.е. для тебя передача соощения будет выглядеть как простой вызов метода. Обмен сертификатами - часть протокола. Если очень хочется знать детали реализации - почитай http://en.wikipedia.org/wiki/Transport_Layer_Security.
    Почитай Securing Services and Clients, там подробно описана вся работа с сертификатами (генерация, импорт/экспорт, конфигурирование клиента и сервера).
     
  5. sadgb

    sadgb Гость

    те как я понимаю вызываю функцию передачи а она внутир себя всё сделает ? и реализует шифование rsa? :wacko:
    хм...
    а как я смогу продемонстрировать что она ДЕЙСЧТВИТЕЛЬНО работает с сертификатами ?
    просто надо продимонстрировать работу полученную..
    ps почему я не могу тебе репутацию поднять? сообщений мало ?
     
  6. Pasha

    Pasha Гость

    Для: sadgb
    Так тебе надо чтобы работало или продемонстрировать? Если продемонстрировать, то реализуешь ручками установление SSL соединения, хотя бы по картинке и описанию протокола из wiki. Работа с шифрованием под .net неплохо расписана в MSDN, Cryptographic Services, работа с сертификатами - про ссылке в прошлом сообщении. Осталось только смешать и хорошенько взболтать :wacko: А если надо чтобы просто работало - используешь wcf и не думаешь о деталях реализации.
     
  7. sadgb

    sadgb Гость

    да у меня вот микс .
    ваще я думаю меня препод не примёт с wcf... и заставит переделывать.
    всё таки надо реализовать более открытую модель с использованием .net framework
    паш спасиб уже очень помог.
    теперь если можно объедини всё в 1 пост чтоб я понял до конца с источниками и ссылками. потому как пока я представляю только как написать на 1 компе 1 прогу которая шифрует и расгифровывает а вот с распределённым приложенирем да ещё и сертификатами .. ужс. мб пример надыбаешь?
    я буду очень благодарен )
     
  8. Pasha

    Pasha Гость

    Для: sadgb
    Нет, я ленивый :D
    походи по ссылкам, там полно примеров.
     
  9. sadgb

    sadgb Гость

    эх... попытался я сделать.. упёрся опять в эти говносертификаты. не могу без примера. а где взять хз ваще
     
  10. Pasha

    Pasha Гость

    Для: sadgb
    Во что именно уперся?
     
  11. sadgb

    sadgb Гость

    я не могу понять алгоритма и последовательности действий работы с сертификатами в случае с локальной сетью как у меня.
    проблема по прежнему в шагах 2 и 3
    и вот ещё такой вопрос прогу то я хочу чтоб та которая в сервере сама создавала новую пару сама мутила с сертификатами
    и вторая прога тож всё сама делала , но я бы потом мог зайти в хп и показать что вот типа тут мы видим этот сертификат...
    это реализуемо ?
    или надо настраивать какой то удостоверяющий сервер ? или всё таки моно бз него ?
     
  12. sadgb

    sadgb Гость

    что же мне теперь делать. я плачу )оо боже куда делся мегагуру паша!!!
    что же мне сегодня делать :)
     
  13. Pasha

    Pasha Гость

    Для: sadgb
    :) Ты не до конца вчитался в систему с сертификатами. Весь их смысл в том, что они раздаются централизованно. Т.е. пользоваетели 1 и 2 получают сертификаты от кого-то, кому они могут доверять. Никаких " П2 как то делает сертификат со своим открытым ключом" быть не может, потому что тогда ему не будет доверять П1. А сама процедура установления соединения подробно описана в вики.
     
  14. sadgb

    sadgb Гость

    аааа вот оно что .
    так значит всё таки нужноо как то настроить этот удостоверяющий сервер. такс это важно. пошёл делать этот удост сервер
     
  15. sadgb

    sadgb Гость

    так вот такое дело :
    запустил я на windows server 2003 certification authority
    дальше как я понимаю надо в хп и в самом сервере сделать его доверенным но как -0 не могу найти и не понимаю. подскажите плиз
     
  16. Pasha

    Pasha Гость

    Для: sadgb
    Не надо настраивать удостоверяющий центр. Создаешь self-signed certificate, импортируешь его в "Trusted Root Certification Authorities", на сервере и на клиенте. Потом выдаешь от имени этого "Trusted Root" клиентский и серверный сертификаты. Тогда и клиент и сервер будут друг другу доверять. How To: Create Temporary Certificates for Use During Development
     
  17. sadgb

    sadgb Гость

    вот что я сотворил

    C:\Program Files\Microsoft.NET\SDK\v1.1\Bin>makecert -n "CN=XPcert" -sk hranilcert -sr currentuser testcert.cer
    Succeeded

    сделал сертификат добавил его в XP добавил его в Server

    дальше я так понимаю нуно работать с контейнерами и вот что я полчил
    вот такая функция вытаскивает из контейнера то что нам нуно. прараметр - наш контейнер.
    public static void GetKeyFromContainer(string ContainerName)
    {
    // Create the CspParameters object and set the key container
    // name used to store the RSA key pair.
    CspParameters cp = new CspParameters();
    cp.KeyContainerName = ContainerName;

    // Create a new instance of RSACryptoServiceProvider that accesses
    // the key container MyKeyContainerName.
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

    // Display the key information to the console.
    Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));
    }

    далее получил в хп
    Key retrieved from container :
    <RSAKeyValue><Modulus>zbXwdgYFwQ9soMG/FpbuRvNHkQqm2gQ5IVeFLXnIx3ETS1qh0WQvpBxpI
    xAYHMG5AWYl2yR0PoIPH9rq6Ve90pSkO9PDxZrTkWRiI8K6pxFjImEPDyj8NjzJf7BvAz8sAln1/uMnp
    1uXb6bKkwZZIEDQm2VN3qUqcKSswEiwJJ8=</Modulus><Exponent>AQAB</Exponent><P>600Ze6r
    f7X0aQk3l5XoDRHIaY9azFUPn6gPNyObkVlgpXPfJeX8LyaZwFAF6c/WihOG1lHxluykl3kLa8fE7Bw=
    =</P><Q>3855AXgE5R8B9Ph+FERHOaDeFHuSKikPHI2gSucmzX0sedIUHfwk8Jruqu/Dzo8WybhSvEvJ
    WghqvsG7yMorqQ==</Q><DP>0Y0XPcB+rmT0hsoTDJvt3v3zLKjfUffoyMrccKfYAGGBbM8rua0AVXSJ
    aferEyxVsRvF91gVzWmm1NsbW86m7w==</DP><DQ>c/Aj40znTEIZ42tu9NTCCOp64SV6fHi0qVf8t5C
    zGzRC/ACGB1p9UF8SUF7QkoqxhWIFCiJAdnFxysvVmZiRsQ==</DQ><InverseQ>NsfguOvDElppQU+x
    h4mQSDcNiLMaxu5k51aPThoXsxYWIcLZU2elHBwY6MgsTiy0EVkMoE0sX2yVn7Ml7SHFNw==</Invers
    eQ><D>PQjviMUureKas3Po85XiqvCB2noTmXpJTSg/noeU2AAn3mLMwmj8ba/0Te/3h4i/ELgzITtGtk
    k2nZgBvSxIaItzXfMTFr6xHbY9loDWx8z5qwWgBjSjSPkYV7lmVVcfN15QGKzwRd6Gv8taw3i7K7RQFw
    GuzLFmAWqkLXguFrE=</D></RSAKeyValue>

    в сервере
    Key retrieved from container :
    <RSAKeyValue><Modulus>ww8jhuyJ5e2KmsB5dWl9gL3Be/vIP5pxFpDuBcWdBEiErUt5HvzAUsRye
    ic1YUB1PwEHPlYWCS4JmEh7YsuCLwdC8BRZpYjrH8jF8kslNndikCI/P99rBxatiXSgFAiVxFDUykElL
    a2tQ1ESlNASeCWPZSTaiPlz8zn+Z+IxuSs=</Modulus><Exponent>AQAB</Exponent><P>4OJgFaZ
    vj9TTOmFteHR0uvaeNGURw5i1oeVUHk/jMaVTavhOdDVymm+V73UstnMbzPXQj6tWOxKADwqRrc8YJw=
    =</P><Q>3gxTxlwndYf+AYvCXHt6CMXZzi11UyhExg8xPRug+vHKZ3ON6SyJT2TAXxkB4i52CwhX2t4e
    CNeE1HN3aydVXQ==</Q><DP>z3oLi+3yH5ELEGGyzd8jkxrU+yIEMaFCcgtSgGTUB4mwXJCaUTy+bx1k
    B3jjt7CbhY2EzggVloqK+1WU8faPIQ==</DP><DQ>2rNfi/7WKo+wIYuq+nXvg1aDqOvjI+2El2L9R0f
    ALYoapfwNaP0hnN4KD2BNF55VS5aDGaIuCN1lCe9UTmjmTQ==</DQ><InverseQ>SEZ96MdkPgp9A8zU
    39Fu2Z1Qej44cHUFNTwpd88kB+ZGSsLDhT+eUIitN8Tzmj6N2Eb+jY472oQeJL8vHQTvzA==</Invers
    eQ><D>Zd1VD1Qd266GkLRteYyClyYBki7174lG/6LmOqttiVwZtapRcYZLJa4jnnk1XjlcQW/XCY3Jaj
    fZmOZZUUm4DM/V9bDyfcjkG09gr4Ut4+kEl1qLR+C7NW5VfrdvBKW9wdMIFxu3xxhhA70pyXuwgQUHEP
    C4ARmhE4+m8Fkklyk=</D></RSAKeyValue>
    очевидно что они разые. то есть как я понимаю он не находит контейнеры и нафиг создаёт новые ключи и записывает их в контейнер.

    итак вопросы мои
    1 как таки получить пару созданную в сертификате. какая команда или у меня ваще всё не правильно?
    доп инфа в серевре пользователь administrator в хп пользователь с именем 1
    просьба вот таки помочь исправить ошибки...
    возможно я неправильно создаю сертификат - я почти уверен но и наверно неправильно понимаю алгоритм получений ключей из сертификата. ваще я не уверен что закрытый можно получить... короче вот тут помогите
    надо чтоб хотя б открытый моно было получить из сертификата а то чё то ваще никак
     
  18. sadgb

    sadgb Гость

    кстати паш я те репутацию поднял. так что давай чуток осталось это последнее узкое место дальше я всё смогу
     
  19. Pasha

    Pasha Гость

    Для: sadgb
    RSACryptoServiceProvider к сертификатам не имеет отношения. Создавай X509Store для СurrentUser и ищи в нем свой сертификат.
     
  20. sadgb

    sadgb Гость

    итак сегодня я посидел и вот что получил
    в общем создал хранилище добавил туда сертификаты которые хотел
    public static void Main(string[] args)
    {
    //есть у меня teststore где мои сертификаты
    X509Store store = new X509Store("teststore", StoreLocation.CurrentUser);
    store.Open(OpenFlags.ReadWrite);
    X509Certificate2 certificate1 = new X509Certificate2();
    //далее я выбираю нужный мне сертификат из хранилища
    certificate1 = null;
    foreach (X509Certificate2 c in storecollection3)
    {
    if (c.Subject == "CN=XPcert1")
    {
    certificate1 = c;

    break;
    }
    }
    // далее тупо вывод на экран всех параметров сертификата

    Console.WriteLine("{0}Subject: {1}{0}", Environment.NewLine, certificate1.Subject);
    Console.WriteLine("{0}Issuer: {1}{0}", Environment.NewLine, certificate1.Issuer);
    Console.WriteLine("{0}Version: {1}{0}", Environment.NewLine, certificate1.Version);
    Console.WriteLine("{0}Valid Date: {1}{0}", Environment.NewLine, certificate1.NotBefore);
    Console.WriteLine("{0}Expiry Date: {1}{0}", Environment.NewLine, certificate1.NotAfter);
    Console.WriteLine("{0}Thumbprint: {1}{0}", Environment.NewLine, certificate1.Thumbprint);
    Console.WriteLine("{0}Serial Number: {1}{0}", Environment.NewLine, certificate1.SerialNumber);
    Console.WriteLine("{0}Friendly Name: {1}{0}", Environment.NewLine, certificate1.PublicKey.Oid.FriendlyName);
    Console.WriteLine("{0}Public Key Format: {1}{0}", Environment.NewLine, certificate1.PublicKey.EncodedKeyValue.Format(true));
    Console.WriteLine("{0}Raw Data Length: {1}{0}", Environment.NewLine, certificate1.RawData.Length);
    Console.WriteLine("{0}Certificate to string: {1}{0}", Environment.NewLine, certificate1.ToString(true));
    Console.WriteLine("{0}Certificate to XML String: {1}{0}", Environment.NewLine, certificate1.PublicKey.Key.ToXmlString(false));
    //и закрываю хранилище
    store.Close();


    А вот тут начинаеться самое интересно теперь когда сертификат доступен мне надо зашифровать используя этот самый открытый ключ. ну вот что есть у меня для шифрования

    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
    RSAParameters RSAKeyInfo = new RSAParameters();
    RSAKeyInfo.Modulus = ?????????????????????? ; //!!!!!!!!!!!!!!!!!!!
    RSAKeyInfo.Exponent = ?????????????????????? ; //!!!!!!!!!!!!!!!!!!!

    ну и дальше там вызов функции шифрования спараметрами который работает я там внутри импортирую эти значения.
    Вопрос как мне вписать эти хреновы значения модуля и экспоненты . а то уже всё сделал даже пересылку последний момент остался. пожалуйста вот прям 2 строчки напиши чтоб работало )


    ps функция которой шифрую


    static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
    {
    try
    {
    //Create a new instance of RSACryptoServiceProvider.
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

    //Import the RSA Key information. This only needs
    //toinclude the public key information.
    RSA.ImportParameters(RSAKeyInfo);

    //Encrypt the passed byte array and specify OAEP padding.
    //OAEP padding is only available on Microsoft Windows XP or
    //later.
    return RSA.Encrypt(DataToEncrypt,false);
    }
    //Catch and display a CryptographicException
    //to the console.
    catch (CryptographicException e)
    {
    Console.WriteLine(e.Message);

    return null;
    }

    }

    ПОМОГИТЕ Пожалуйста )
     
Загрузка...

Поделиться этой страницей