Pull to refresh

Шифрование почты в Outlook 2010

Reading time7 min
Views45K
Пост адресован всем, кому будет интересно настроить обмен зашифрованными сообщениями между двумя и более пользователями с использованием почтового клиента Outlook 2010. Как известно, шифрование почты в аутлуке выполняется на основе сертификатов и инфраструктуры открытых ключей. В процессе обмена зашифрованными сообщениями будут использоваться сертификаты двух форматов PKCS #12 и X.509.

X.509 (файл с расширением *.cer) – формат сертификата, который помимо общей информации (версия, серийный номер, алгоритм подписи, сведения об издателе, срок действия, сведения о владельце, электронный отпечаток) содержит ваш открытый ключ. Его мы отправляем другим пользователям, с которыми хотим обмениваться зашифрованными сообщениями.

PKCS#12 (файл с расширением *.pfx) – единственный формат сертификата, который помимо общей информации может содержать не только открытый, но и закрытый ключ. С его помощью мы будем расшифровывать сообщения, зашифрованные другими пользователями при помощи нашего открытого ключа, а также ставить свою цифровую подпись.

Сертификаты создадим при помощи программы для шифрования CyberSafe, которая может работать в качестве Центра Сертификации. Корневой сертификат CyberSafe Certification Authority автоматически добавляется в Доверенные в хранилище Windows, сертификат PKCS#12 будет храниться в разделе Личные, а X.509 в разделе Другие пользователи.

Вначале создадим персональный сертификат, содержащий вышеуказанные сертификаты, открытый и закрытый ключи, а также другую информацию. Запускаем программу, переходим на вкладку Ключи и сертификаты, выбираем Создать, заполняем необходимые поля и жмем Далее:



Произойдет генерация ключей, создание сертификатов и их запись в базу данных программы. Если была выбрана опция Опубликовать после создания, сертификат будет опубликован на сервере CyberSafe, где ваш открытый ключ будет доступен для скачивания другим пользователям.

Теперь экспортируем необходимые нам для работы с 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 (%d %s)...'{'Generate Keys (%d bits)...'}, [StKeysGenerate, KeySize, StBit]));
if Aborted then
Exit;

CreatePrivateKey(TmpPrivateKeyFileSpec, TmpPublicKeyFileSpec, KeySize, ARandomFileSpec);

if Assigned(ProgressProc) then
ProgressProc(13, 5, Aborted, Format('%s...', [StGenerateCertificate]){'Generate certificate...'});
if Aborted then
Exit;

if Assigned(ProgressProc) then
ProgressProc(13, 6, Aborted, Format('%s...', [StCreateCertificateRequest]){'Create the certificate request...'});

// Создаем запрос — .csr
RunOpenSSLConsole(Format(
'req -new -key "%s" -out "%s" -days %d -subj %s',
[TmpPrivateKeyFileSpec, TmpCsrFileSpec, ValidDays, Subj]
), True, nil, nil);

if Assigned(ProgressProc) then
ProgressProc(13, 7, Aborted, Format('%s...', [StCreateExtensionsFile]){'Create the extensions file...'});

// 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]){'Create the signed certificate...'});

// На основе запроса создаем сертификат, подписаный корневым сертификатом
RunOpenSSLConsole(Format(
'x509 -req -days %d -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);

if Assigned(ProgressProc) then
ProgressProc(13, 9, Aborted, Format('%s...', [StConvertCertificate]){'Convert the certificate from the CER to the PEM format...'});

// Конвертируем 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]){'Create the PFX certificate file...'});

// Делаем 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';

if Assigned(ProgressProc) then
ProgressProc(13, 11, Aborted, Format('%s...', [StExportPublicKey]){'Export public keys from the PFX certificate file...'});

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-файле и следуем инструкциям Мастера импорта сертификатов. Так как этот сертификат содержит ваш закрытый ключ, в процессе импорта потребуется ввести пароль, который был указан при его создании.

Далее открываем Outlook и идем: Файл > Параметры > Центр управления безопасностью > Параметры центра управления безопасностью > Защита электронной почты. В разделе Шифрованная электронная почта отмечаем галками пункты:

  • Шифровать содержимое и вложения исходящих сообщений
  • Добавлять цифровую подпись к исходящим сообщениям

Теперь из списка установленных в хранилище сертификатов нужно выбрать тот, который будет использоваться для шифрования и создания цифровой подписи. Для этого здесь же нажимаем Параметры… > Выбрать и выбираем свой сертификат:



На этом, в принципе, все:). Однако давайте убедимся в том, что у нас все работает правильно и выполним проверку шифрования “на себя”.

Создадим новый контакт. Идем Главная > Контакты > Создать контакт. На вкладке Общие достаточно заполнить поля Полное имя и Эл. почта, после чего переходим на вкладку Сертификаты, где нажимаем Импорт:



В проводнике Windows находим свой сертификат в формате *.cer



Убеждаемся, что сертификат был импортирован и отображается в окне Сертификаты (цифровые подписи). Нажимаем Сохранить и Закрыть. Теперь мы можем отправить сами себе зашифрованное сообщение. Для этого идем Почта > Главная > Создать сообщение. В поле Кому, добавляем свой контакт, выбрав его из Адресной книги:



Отправляем письмо. Переходим во Входящие и находим там отправленное нами сообщение. Оно зашифровано, о чем свидетельствует иконка с синим замочком в верхнем левом углу. Кликаем на нем мышью, чтобы автоматически расшифровать и открыть.

Если отправленное письмо не отображается во входящих, перейдите на вкладку Отправка и получение и нажмите Обновить папку.



Для просмотра свойств безопасности сообщения или информации о цифровой подписи, кликаем на соответствующих иконках в поле с общей информацией о сообщении:



Проверка функции шифрования “на себя” выполнена.

Теперь отправляем сообщение, заверенное своей цифровой подписью, другим пользователям и получаем их подписанные сообщения. Это позволит нам обменяться открытыми ключами друг с другом, поскольку подписанное письмо содержит открытый ключ.

Получив такое письмо от другого пользователя добавляем его в Контакты (Адресную книгу). Далее необходимо экспортировать X.509 сертификат пользователя в файл и установить его в хранилище Windows. Для этого в поле с общей информацией о письме нажимаем на значок цифровой подписи и выбираем Сведения > Подробности > Показать сертификат > Состав > Копировать в файл и следуем инструкциям Мастера экспорта сертификатов. Экспортированный сертификат добавляем к контакту пользователя также, как мы делали это при проверке функции шифрования “на себя”.

Если у вас еще нет сертификата (и открытого ключа корреспондента), при отправке ему первого сообщения функцию шифрования следует отключить, иначе аутлук не сможет его зашифровать и будет выдавать ошибку. Отключить функцию шифрования, оставив включенной функцию цифровой подписи можно на вкладке Параметры:



В завершении хотелось бы добавить, что сделать свой открытый ключ доступным для других пользователей можно опубликовав его на публичных серверах ключей, таких как сервер CyberSafe. Естественно, там также можно попробовать найти открытые ключи интересующих вас пользователей, не дожидаясь, пока они вам их пришлют.

Если открытый ключ скачивается с не доверенного сервера либо вы получаете его по электронной почте, нельзя быть точно уверенным в подлинности такого ключа. Может оказаться так, что это злоумышленник отправил вам вместо ключа вашего друга свой «фальшивый» ключ. Тогда он сможет прочитать все зашифрованные сообщения, которые вы отправляете своему другу, а вот ваш друг сделать этого не сможет.

Поэтому в таком случае подлинность открытого ключа должна быть проверена по его электронному отпечатку. Один из самых простых способов сверить отпечаток – созвониться с владельцем открытого ключа по скайпу или по телефону.
Tags:
Hubs:
Total votes 19: ↑8 and ↓11-3
Comments0

Articles

Information

Website
cybersafesoft.com
Registered
Employees
11–30 employees
Location
Россия