X.509 (файл з розширенням * .cer) - формат сертифіката, який крім загальної інформації (версія, серійний номер, алгоритм підпису, відомості про видавця, термін дії, відомості про власника, електронний відбиток) містить ваш відкритий ключ. Його ми відправляємо іншим користувачам, з якими хочемо обмінюватися зашифрованими повідомленнями.
PKCS # 12 (файл з розширенням * .pfx) - єдиний формат сертифіката, який крім загальної інформації може містити не тільки відкритий, але і закритий ключ. З його допомогою ми будемо розшифровувати повідомлення, зашифровані іншими користувачами за допомогою нашого відкритого ключа, а також ставити свою цифровий підпис.
Сертифікати створимо за допомогою програми для шифрування CyberSafe. яка може працювати в якості Центру Сертифікації. Кореневий сертифікат CyberSafe Certification Authority автоматично додається в Довірені в сховище Windows, сертифікат PKCS # 12 буде зберігатися в розділі Особисті. а X.509 в розділі Інші користувачі.
Спочатку створимо персональний сертифікат. що містить вищевказані сертифікати, відкритий і закритий ключі, а також іншу інформацію. Запускаємо програму, переходимо на вкладку Ключі та сертифікати. вибираємо Створити. заповнюємо необхідні поля і натискаємо Далі:
Тепер експортуємо необхідні нам для роботи з Outook сертифікати в окремі файли:
Сертифікати в CyberSafe створюються на основі бібліотеки OpenSSL, код створення сертифіката наведено нижче:
procedure TOpenSSL.CreateSignedCert (const FileName: String; OutFiles: TStringList;
const Password: String;
ValidDays: Integer; KeySize: Integer; const ExtendedKeyUsage: String;
const CommonName, Email, Organization, OrganizationalUnit, Country: String;
const CAFileSpec, CAPFXFileSpec, CAPrivateKeyPassword: String;
ARandomFileSpec: String = ";
ProgressProc: TProgressProc = nil; LogMsgProc: TLogMsgProc = nil);
var
TmpPrivateKeyFileSpec, TmpPublicKeyFileSpec: String;
TmpCerFileSpec, TmpPfxFileSpec, TmpCsrFileSpec, TmpCASerialFileSpec, TmpExtFileSpec, TmpPemFileSpec: String;
TmpCAPrivateKeyFileSpec: String;
Subj: String;
TempDir: String;
Aborted: Boolean;
WasError: Boolean;
OutPublicKeyFileSpec: String;
begin
WasError: = True;
TempDir: = GetTempDir;
try
CheckIsFileExists (CAFileSpec);
// Витягуємо приватний ключ з кореневого сертифіката
TmpCAPrivateKeyFileSpec: = TempDir + ChangeFileExt (ExtractFileName (CAPFXFileSpec), ") + '.privateKey.pem';
ExportPrivateKeyFromPfx (CAPFXFileSpec, TmpCAPrivateKeyFileSpec, CAPrivateKeyPassword);
// Все файли створюємо в тимчасовому каталозі, і тільки після успішного створення всіх - // переносимо на місце постійного зберігання
TmpPrivateKeyFileSpec: = TempDir + FileName + '.privateKey.pem';
TmpPublicKeyFileSpec: = TempDir + FileName + '.publicKey.pem';
TmpCerFileSpec: = TempDir + FileName + '.cer';
TmpPemFileSpec: = TempDir + FileName + '.pem';
TmpPfxFileSpec: = TempDir + FileName + '.pfx';
TmpCsrFileSpec: = TempDir + FileName + '.csr';
TmpCASerialFileSpec: = TempDir + FileName + '.srl';
Subj: = GetSubj (CommonName, Email, Organization, OrganizationalUnit, Country);
Aborted: = False;
if Assigned (ProgressProc) then
ProgressProc (13, 4, Aborted, Format ( '% s (.% S) ...', [StKeysGenerate, KeySize, StBit]));
if Aborted then
Exit;
CreatePrivateKey (TmpPrivateKeyFileSpec, TmpPublicKeyFileSpec, KeySize, ARandomFileSpec);
if Assigned (ProgressProc) then
ProgressProc (13, 5, Aborted, Format ( '% s ... ", [StGenerateCertificate]));
if Aborted then
Exit;
if Assigned (ProgressProc) then
ProgressProc (13, 6, Aborted, Format ( '% s ... ", [StCreateCertificateRequest]));
// Створюємо запит - .csr
RunOpenSSLConsole (Format (
'Req -new -key "% s" -out "% s" -days. -subj% s ',
[TmpPrivateKeyFileSpec, TmpCsrFileSpec, ValidDays, Subj]
), True, nil, nil);
if Assigned (ProgressProc) then
ProgressProc (13, 7, Aborted, Format ( '% s ... ", [StCreateExtensionsFile]));
// www.openssl.org/docs/apps/x509v3_config.html
TmpExtFileSpec: = StrToFile (
// 'keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign' +
'KeyUsage = digitalSignature, keyEncipherment' +
iif (ExtendedKeyUsage <> », # 13 # 10'extendedKeyUsage = '+ ExtendedKeyUsage,»),
TempDir + FileName + '.extensions.cfg'
);
if Assigned (ProgressProc) then
ProgressProc (13, 8, Aborted, Format ( '% s ... ", [StCreateSignedCertificate]));
// На основі запиту створюємо сертифікат, підписаний кореневим сертифікатом
RunOpenSSLConsole (Format (
'X509 -req -days. -passin pass:% s -in "% s" -CAform DER -CA "% s" -CAkey "% s" -CAserial "% s" -CAcreateserial -out "% s" -outform DER -extfile "% s" ',
[ValidDays, Password, TmpCsrFileSpec, CAFileSpec, TmpCAPrivateKeyFileSpec, TmpCASerialFileSpec, TmpCerFileSpec, TmpExtFileSpec]
), False, nil, nil);
// Конвертуємо cer => pem для наступної крманди експорту в pfx
RunOpenSSLConsole (Format (
'X509 -in "% s" -inform DER -out "% s" -outform PEM',
[TmpCerFileSpec, TmpPemFileSpec]
), False, nil, nil);
if Assigned (ProgressProc) then
ProgressProc (13, 10, Aborted, Format ( '% s ... ", [StCreatePFX]));
// Робимо pfx з отриманого pem і ключів
RunOpenSSLConsole (Format (
'Pkcs12 -password pass:% s -export -in "% s" -inkey "% s" -name "% s" -out "% s"',
[Password, TmpPemFileSpec, TmpPrivateKeyFileSpec, FileName, TmpPfxFileSpec]
), False, nil, nil);
OutPublicKeyFileSpec: = TmpPublicKeyFileSpec + '.signed';
ExportPublicKeyFromPfx (TmpPfxFileSpec, OutPublicKeyFileSpec, Password);
// А результат додаємо до списку файлів
OutFiles.Add (TmpCerFileSpec);
OutFiles.Add (TmpPfxFileSpec);
OutFiles.Add (TmpPrivateKeyFileSpec);
OutFiles.Add (TmpPublicKeyFileSpec);
OutFiles.Add (OutPublicKeyFileSpec);
WasError: = False;
finally
// Видаляємо тимчасові файли
if WasError then
begin
CheckDeleteFile (TmpCerFileSpec);
CheckDeleteFile (TmpPfxFileSpec);
CheckDeleteFile (TmpPrivateKeyFileSpec);
CheckDeleteFile (TmpPublicKeyFileSpec);
CheckDeleteFile (OutPublicKeyFileSpec);
end;
CheckDeleteFile (TmpCsrFileSpec);
CheckDeleteFile (TmpCASerialFileSpec);
CheckDeleteFile (TmpExtFileSpec);
CheckDeleteFile (TmpPemFileSpec);
CheckDeleteFile (TmpCAPrivateKeyFileSpec);
end;
end;
Встановимо експортований сертифікат у форматі PKCS # 12 в сховище Windows. Для цього двічі натискаємо на pfx-файлі і слідуємо інструкції Майстра імпорту сертифікатів. Так як цей сертифікат містить ваш закритий ключ, в процесі імпорту буде потрібно ввести пароль, який був зазначений при його створенні.
- Шифрувати вміст і вкладення вихідних повідомлень
- Додавати цифровий підпис до вихідних повідомлень
Тепер зі списку встановлених в сховище сертифікатів потрібно вибрати той, який буде використовуватися для шифрування і створення цифрового підпису. Для цього тут же натискаємо Параметри ...> Вибрати і вибираємо свій сертифікат:
На цьому, в принципі, все :). Однак давайте переконаємося в тому, що у нас все працює правильно і виконаємо перевірку шифрування "на себе".
У провіднику Windows знаходимо свій сертифікат у форматі * .cer
Відправляємо лист. Переходимо до вхідних і знаходимо там відправлене нами повідомлення. Воно зашифровано, про що свідчить іконка з синім замочком у верхньому лівому кутку. Кількома на ньому мишею, щоб автоматично розшифрувати і відкрити.
Якщо відправлений лист не відображається у вхідних, перейдіть на вкладку Відправка і отримання і натисніть Оновити папку.
Перевірка функції шифрування "на себе" виконана.
Тепер відправляємо повідомлення, завірене своїм цифровим підписом, іншим користувачам і отримуємо їх підписані повідомлення. Це дозволить нам обмінятися відкритими ключами один з одним, оскільки підписаний лист містить відкритий ключ.
Якщо у вас ще немає сертифіката (і відкритого ключа кореспондента), при відправці йому першого повідомлення функцію шифрування слід відключити, інакше Аутлук не зможе його зашифрувати і видаватиме помилку. Відключити функцію шифрування, залишивши включеною функцію цифрового підпису можна на вкладці Параметри:
Якщо відкритий ключ скачується з не довіреної сервера або ви отримуєте його по електронній пошті, не можна бути точно впевненим в автентичності такого ключа. Може виявитися так, що це зловмисник відправив вам замість ключа вашого друга свій «фальшивий» ключ. Тоді він зможе прочитати все зашифровані повідомлення, які ви відправляєте своєму другові, а ось ваш друг зробити цього не зможе.