Використання сертифікатів: Підпис даних на стороні клієнта (исходники), Різне, Програмування, статті

Одна з задач, яка у вас може виникнути – це підписати деякі дані на стороні клієнта в браузері користувача. Таке завдання може виникнути тоді, коли користувач подає деякі важливі дані, і для того, щоб він в майбутньому не відмовлявся зі словами “Це робив не я!” від цих даних. Для цього можуть служити сертифікати. Детальніше про сертифікати і про SSL можна дізнатися де завгодно, досить в пошуковику набрати “SSL сертифікати” та інформації про їх призначення і про необхідність буде предостатньо.

Для реальних завдань вам, швидше за все, знадобляться сертифікати задовольняють алгоритмам ГОСТу, одна з програм реалізує їх це КріптоПро, хоча навіть ніби як і єдина. Але для того щоб розробляти або тестувати сама програма вам не знадобиться. Ідея сертифікатів так же в тому, що користувач і розробник не повинні вникати в те, які алгоритми вони реалізують, які типи ключів в них містяться, і програма, що працює з сертифікатами одного типу так само працювала б на сертифікатах іншого типу (це в теорії, на практиці може бути будуть проблеми з деякими настройками контейнерів і взагалі адмініструванням). Головне – для нашого завдання – це щоб сертифікат сервера і клієнта відповідали одному алгоритму.


Для тестування ми можемо скористатися Windows Server 2003 і його службою сертифікації. Для цього необхідно за допомогою майстра компонентів Windows встановити службу сертифікації, під час установки будуть задані деякі питання, щодо імені сервера сертифікації, терміну його служби і решти. Після установки ми будемо мати за адресою localhost/certsrv/ веб сайт, що надає можливість запросити сертифікат. А в адмініструванні в центрі сертифікації ми зможемо підтверджувати запити на видачу сертифікатів. Якщо розробляти ви будете на Vista, або Windows 7, тоді вам необхідно буде встановити на Win2003 патч KB922706.


Інший спосіб створювати тестові сертифікати за допомогою програмки makecert. Так само можна використовувати і будь-які інші тестові служби сертифікації. У крипто про так само є зовнішній тестовий сервер сертифікації.


Перше що необхідно зробити – це встановити сертифікат ЦС на машину, на якій ви будете розробляти ваше додаток, щоб вона могла довіряти цьому центру видачі та могла використовувати сертифікати від цього центру.


Друге – це згенерувати сертифікат перевірки сервера на цю машину. Ім’я сертифіката має збігатися з dns ім’ям веб-додатки, але так як ми розробляємо програму локально, то для тестів ми візьмемо ім’я localhost (хочу зауважити, що якщо ви видали сертифікат на ім’я www.mydns.ru, то звернувшись до mydns.ru ви побачите помилку про те, що сертифікат виданий не на це ім’я). Важливо ще знати, що є сховище сертифікатів користувача, і окремо сховище сертифікатів машини. За замовчуванням, стандартно, сертифікати встановлюються в сховище користувача, а для того щоб сертифікат перевірки сервера використовувати на сайті необхідно його покласти в Local Computer / Personal. Подивитися в яких місцях які сертифікати знаходяться можна таким способом: запускаємо Microsoft Management Console (викликаючи mmc.exe) там натискаємо ctrl + m і вибираємо snap-in Certificates (спочатку користувача, потім Local Computer) і там ви бачимо повне дерево сертифікатів.



Наступним дією нам потрібно встановити сертифікат localhost на сайт. Відкриваємо IIS і залежно від його версії установки можуть бути різні. В IIS 5.1 або 6.0 у вікні властивостей сайту потрібно перейти на вкладку Security і там за допомогою кнопки Security встановити сертифікат. В IIS 7 необхідно відкрити властивості “Bindings …” і там додати binding з типом https, в цьому ж вікні необхідно буде вибрати сертифікат (Якщо сертифікату в спадному списку немає, значить він лежить не в вірною директорії або сертифікат не з типом перевірки автентичності сервера).



Тепер можемо перевірити, що наш веб-сайт відгукується на https і може з’єднатися за допомогою SSL шифрування для цього набираємо в браузері https://localhost/… (Якщо не відкривається – перевірте що встановлений сертифікат ЦС в Trusted Root Certification Authorities).


Установка сертифікату на сайт дає нам доступ до сайту з шифруванням. Можна використовувати за допомогою налаштувань так само і двостороннє шифрування, тоді кожен користувач, що заходить на сайт за https шляху повинен буде вказати і свій сертифікат (настройка може бути “не вказувати”, “бажаний”, “необхідний”). Для того щоб виробляти підписування на клієнті даних необхідності в установці серверного сертифіката нету, але навряд чи перед вами буде стоять завдання підписи без установки зашифрованого з’єднання.


Тепер приступимо до підписування даних. Створюємо ASP.NET веб-сайт, на сторінку Default.aspx кладемо наступні контроли:

<div>

<asp:TextBox runat=”server” ID=”tbDataText” Width=”400px”/>
</div>
<div>

<asp:Button runat=”server” ID=”btnSignData” Text=”Підписати дані”
OnClientClick=”if (SignData() == false) return false;”
onclick=”btnSignData_Click” />
</div>
<div>

<asp:TextBox runat=”server” ID=”tbSignedData” TextMode=”MultiLine” Width=”600px” Rows=”24″ />
</div>
<div>

<asp:Label runat=”server” ID=”lblData” />
</div>

Кнопка btnSignData спочатку викликає javascript функцію SignData () з наступним кодом:

<script language=”javascript” type=”text/javascript” >
function SignData()
{
/ / Необхідні константи
    var CAPICOM_STORE_OPEN_READ_ONLY = 0;
    var CAPICOM_CURRENT_USER_STORE = 2;
    / / Перевіряємо, що підтримуються ActiveXObject (Internet Explorer)
    if (window.ActiveXObject) {
     try {
/ / Підписувані дані
     var tbDataText = document.getElementById(“<%= tbDataText.ClientID %>”);
     / / Створюємо необхідні об’єкти ActiveX
     var CertStore = new ActiveXObject(“CAPICOM.Store”);
     var Signer = new ActiveXObject(“CAPICOM.Signer”);
     var SignedAuth = new ActiveXObject(“CAPICOM.SignedData”);
     / / Відкриваємо сховище сертифікатів користувача тільки для читання
     CertStore.Open(CAPICOM_CURRENT_USER_STORE, “MY”, CAPICOM_STORE_OPEN_READ_ONLY);
     / / Виводимо користувачеві вікно вибору сертифіката
     try {
     var certificate = CertStore.Certificates.Select(
     “Виберіть сертифікат для підпису документа.”
     , “Виберіть один із сертифікатів”, false);
     }
     catch (e) {
     / / Користувач не вибрав сертифікат
     return false;
     }
     / / Підписувані дані
     SignedAuth.Content = “Дата підпису:” + (new Date()) + “, Дані:” + tbDataText.value;
     / / Обраний сертифікат
     Signer.Certificate = certificate.Item(1);
     / / Сюди запишемо дані (можна писати в hidden поле, тут зроблено для прикладу)
     var lblData = document.getElementById(“<%= tbSignedData.ClientID %>”);
     / / Підписуємо
     lblData.value = SignedAuth.Sign(Signer, false);
     } catch (e) {
     alert(“Неможливо підписати дані. Переконайтеся що браузером разрешно використання ActiveX. Додайте сайт в Trusted Sites.”);
     return false;
     }
     return true;
    }
    else {
     alert(“Використовуйте Internet Explorer для перегляду даного сайту”);
     return false;
    }
}
</script>

Даний скрипт якраз і підписує дані на стороні клієнта. Він працює тільки в IE, під час роботи скрипта він може лаятися, вимагати прав на запуск ActiveX об’єктів, найпростіше додати даний сайт в зону Trusted Sites.


На стороні сервера можемо виконувати наступний код при натисканні на кнопку:

protected void btnSignData_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
/ / Дивимося, що підписана
SignedCms cms = new SignedCms();
cms.Decode(Convert.FromBase64String(tbSignedData.Text));
/ / Перевіряємо підпис
cms.CheckSignature(false);
/ / Що підписано
sb.AppendLine(Encoding.Unicode.GetString(cms.ContentInfo.Content));
/ / Порівняємо сертифікат, яким були підписані дані, і клієнтський сертифікат
if (Request.IsSecureConnection && Request.ClientCertificate.IsPresent)
{
X509Certificate2 cert = new X509Certificate2(Request.ClientCertificate.Certificate);
if (cms.SignerInfos.Count > 0 &&
string.Compare(cms.SignerInfos[0].Certificate.SerialNumber, cert.SerialNumber) == 0
&& string.Compare(cms.SignerInfos[0].Certificate.Issuer, cert.Issuer) == 0)
{
sb.AppendLine(“
Дані підписані клієнтським сертифікатом”);
}
else
{
sb.AppendLine(“
Дані підписані відмінним від клієнтського сертифікатом”);
}
}
lblData.Text = sb.ToString();
}

Для виконання даного коду може знадобитися встановити reference на бібліотеку System.Security, що включає namespace System.Security.Cryptography.


Таким способом ви зможете не просто зберігати будь-які дані, може бути важливі вам, а до того ж і бути впевненим в їх достовірності. Сподіваюся, ця стаття вам допоможе в початковому вивченні сертифікатів.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*