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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline alanko  
#1 Оставлено : 10 июня 2015 г. 10:20:34(UTC)
alanko

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

Группы: Участники
Зарегистрирован: 10.06.2015(UTC)
Сообщений: 11
Мужчина
Российская Федерация
Откуда: Москва

Здравствуйте!

Создаю сообщение использую код из примеров. Подписываю Body и добавляю его через AlternateView как smime.p7m. Отдельно добавляю вложение через AlternateView, например test.txt.

В The Bat сообщение подписано (иконка в интерфейсе), в Outlook просто письмо с вложением (иконки подписи нет).
При этом если вложение не добавлять, в Outlook отображается подписанное письмо.

Кто-нибудь сталкивался с подобным, в чем особенность почтовых клиентов?
Offline Андрей Писарев  
#2 Оставлено : 10 июня 2015 г. 10:23:41(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,358
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2217 раз в 1731 постах
Автор: alanko Перейти к цитате
Здравствуйте!

Создаю сообщение использую код из примеров. Подписываю Body и добавляю его через AlternateView как smime.p7m. Отдельно добавляю вложение через AlternateView, например test.txt.

В The Bat сообщение подписано (иконка в интерфейсе), в Outlook просто письмо с вложением (иконки подписи нет).
При этом если вложение не добавлять, в Outlook отображается подписанное письмо.

Кто-нибудь сталкивался с подобным, в чем особенность почтовых клиентов?


А зачем добавлять test.txt, если есть smime.p7m?
Техническую поддержку оказываем тут
Наша база знаний
Offline alanko  
#3 Оставлено : 10 июня 2015 г. 10:32:15(UTC)
alanko

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

Группы: Участники
Зарегистрирован: 10.06.2015(UTC)
Сообщений: 11
Мужчина
Российская Федерация
Откуда: Москва

Что бы добавить в письмо вложение. Так понимаю вы указываете на то, что вложение должно быть внутри smime.p7m?
Offline Андрей Писарев  
#4 Оставлено : 10 июня 2015 г. 10:50:11(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,358
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2217 раз в 1731 постах
Автор: alanko Перейти к цитате
Что бы добавить в письмо вложение. Так понимаю вы указываете на то, что вложение должно быть внутри smime.p7m?


Да.
Техническую поддержку оказываем тут
Наша база знаний
Offline alanko  
#5 Оставлено : 2 июля 2015 г. 4:45:39(UTC)
alanko

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

Группы: Участники
Зарегистрирован: 10.06.2015(UTC)
Сообщений: 11
Мужчина
Российская Федерация
Откуда: Москва

С предыдущим вопросом разобрался, как программу закончу могу выложить решение.
Сейчас новая вводная, сделать так, что бы письма отображались и в почтовом клиенте с проверкой подписи, и в веб браузере с просмотром текста и вложения письма.
Кто-нибудь нашел решение - как (есть особенность с кодировкой?) и что подписывать?
Формирую письмо с подписью в outlook, все замечательно - в bat письмо читается и подпись проверяется, в браузере письмо читается.
Формирую письмо через свою программу - в браузере письмо читается, в клиенте читается, но подпись - недостоверна.

Исходник

Код:
using System;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace SignMail
{
    class Program
    {
        static void Main(string[] args)
        {
            //Проверка корректности переданных параметров
            if (args.Length == 0)
            {
                Console.WriteLine(
                   "Mail.SignMessage <server> <smtpport> <login> <password> <from> <to> <subject> <mailbody> <file_attach>");
                return;
            }
        
        //РАЗБЕРЕМ ПЕРЕДАННЫЕ ПАРАМЕТРЫ
        // Адрес SMTP сервера
        string smtpserver = args[0];
        // порт подключения
        int smtpport = int.Parse(args[1]);
        // логин для авторизации
        string login = args[2];
        // пароль для авторизация
        string pass = args[3];
        // адрес отправителя
        string from = args[4];
        // адрес получателя
        string to = args[5];
        // текст темы
        string mailsubject = args[6];
        // текст сообщения
        string mailbody = args[7];
        string attachFile = args[8];

        // подстрока поиска собственного сертификата - 
        // считаем, что строка отправителя содержится в
        // Subject сертификата.
        string signercertdn = args[4];

        // Проверям существует ли файл
        if (!File.Exists(attachFile))
        {
            Console.WriteLine("File not found.");
            return;
        }

        // Распарсим информацию о файле вложения
        FileInfo fname = new FileInfo(attachFile);
        string attachname = fname.Name;

        // декодируем файл в base64
        string encoded = base64encode(attachFile);

        // Ищем сертификат для подписи.
        X509Store store = new X509Store(StoreLocation.LocalMachine);
        store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
        X509Certificate2Collection certColl = store.
            Certificates.Find(X509FindType.FindBySubjectName,
            signercertdn, false);
        if (certColl.Count == 0)
        {
            Console.WriteLine("Certificate not found.");
            return;
        }
        if (certColl.Count > 1)
        {
            Console.WriteLine("Found more than one signing certificate.");
            return;
        }
        X509Certificate2 signercert = certColl[0];

        // Создаем тело сообщения для подписи.
        string strbody =
            "Content-Type: multipart/mixed;boundary=\"--line888\"\r\n" +
            "\r\n" +
            "----line888\r\n" +
            "Content-Type: text/plain;charset=\"utf-8\"\r\n" +
            "Content-Transfer-Encoding: quoted-printable\r\n" +
            "\r\n" +
            mailbody +
            "\r\n" +
            "----line888\r\n" +
            "Content-Type: application/octet-stream;name=\"" + attachname + "\"\r\n" +
            "Content-Transfer-Encoding: base64\r\n" +
            "Content-Disposition: attachment; filename=\"" + attachname + "\"\r\n" +
            "\r\n" +
            encoded +
            "\r\n" +
            "----line888--\r\n";

        // Подписываем.
        byte[] data = Encoding.UTF8.GetBytes(strbody);
        ContentInfo content = new ContentInfo(data);
        SignedCms signedCms = new SignedCms(content, true);
        CmsSigner signer = new CmsSigner(
            SubjectIdentifierType.IssuerAndSerialNumber,
            signercert);
        signedCms.ComputeSignature(signer);
        byte[] signedbytes = signedCms.Encode();

        string signData = Convert.ToBase64String(signedbytes, Base64FormattingOptions.InsertLineBreaks);

        //Создаем тело письма для отправки
        string msgbody =
           "----line222\r\n" +
           "Content-Type: multipart/mixed;boundary=\"--line888\"\r\n" +
           "\r\n" +
           "----line888\r\n" +
           "Content-Type: text/plain;charset=\"utf-8\"\r\n" +
           "Content-Transfer-Encoding: quoted-printable\r\n" +
           "\r\n" +
           mailbody +
           "\r\n" +
           "----line888\r\n" +
           "Content-Type: application/octet-stream;name=\"" + attachname + "\"\r\n" +
           "Content-Transfer-Encoding: base64\r\n" +
           "Content-Disposition: attachment; filename=\"" + attachname + "\"\r\n" +
           "\r\n" +
           encoded +
           "\r\n" +
           "----line888--\r\n" +
           "----line222\r\n" +
           "Content-Type: application/pkcs7-signature; name=\"smime.p7s\"\r\n" +
           "Content-Transfer-Encoding: base64\r\n" +
           "Content-Disposition: attachment; filename=\"smime.p7s\"\r\n" +
           "Content-Description: S/MIME Cryptographic Signature\r\n" +
           "\r\n" +
           signData +
           "\r\n" +
           "----line222--\r\n";


        // Создаем email сообщение
        MailMessage msg = new MailMessage();
        msg.From = new MailAddress(from);
        msg.To.Add(new MailAddress(to));
        msg.Subject = mailsubject;
        msg.Headers.Remove("Content-Transfer-Encoding");
        
        // Выставляем параметры для просмотра сообщения.
        ContentType mimeType = new System.Net.Mime.ContentType("multipart/signed; protocol=\"application/pkcs7-signature\"; boundary=\"--line222\"");

        AlternateView av = AlternateView.CreateAlternateViewFromString(msgbody, mimeType);
        av.TransferEncoding = TransferEncoding.EightBit;
        msg.AlternateViews.Add(av);

        // Отправляем сообщение.
        SmtpClient client = new SmtpClient(smtpserver);
        client.Credentials = new NetworkCredential(login, pass);
        client.Port = smtpport;
        client.EnableSsl = true;
        try
        {
            Console.WriteLine("Sending mail...");
            client.Send(msg);
            client.Dispose();
            Console.WriteLine("Mail was sent successfully!");
            string[] keys = msg.Headers.AllKeys;
            Console.WriteLine("Headers");
            foreach (string s in keys)
            {
                Console.WriteLine("{0}:", s);
                Console.WriteLine("    {0}", msg.Headers[s]);
            }
        }
        catch (Exception ep)
        {
            Console.WriteLine("failed to send mail:");
            Console.WriteLine(ep.Message);
        }

        }
        
        // Функция преобразования файла в строку в base64
        public static string base64encode(string filename)
        {
            FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
            byte[] filebytes = new byte[fs.Length];
            fs.Read(filebytes, 0, Convert.ToInt32(fs.Length));
            string encodedData = Convert.ToBase64String(filebytes, Base64FormattingOptions.InsertLineBreaks);
            return encodedData;
        }
    }
}


Буду рад любым мыслям.
Offline Максим Коллегин  
#6 Оставлено : 2 июля 2015 г. 10:24:04(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
Сертификат в подпись включается?
Знания в базе знаний, поддержка в техподдержке
Offline alanko  
#7 Оставлено : 2 июля 2015 г. 12:27:00(UTC)
alanko

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

Группы: Участники
Зарегистрирован: 10.06.2015(UTC)
Сообщений: 11
Мужчина
Российская Федерация
Откуда: Москва

Про сертификат не могу сказать, подпись реализована кодом из примера .net SDK.
И к подписи претензий особых нет, если делать вариант только для outlook, сообщение отображается корректно и подпись проверяется. Так понимаю проблема в хеше, вопрос от чего считает хеш outlook (да и the bat тоже).
Offline Максим Коллегин  
#8 Оставлено : 2 июля 2015 г. 19:45:03(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
Отличный код, а можно мы его добавим в наш SDK?
Посмотрите, что написано в свойствах сертификата в outlook. С первым попавшимся сертификатом у меня было так:
Untitled.png (19kb) загружен 112 раз(а).
Взял сертификат с назначением ключа Secure Email (1.3.6.1.5.5.7.3.4) - проверилось хорошо.

Отредактировано пользователем 2 июля 2015 г. 19:46:20(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline alanko  
#9 Оставлено : 3 июля 2015 г. 17:26:20(UTC)
alanko

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

Группы: Участники
Зарегистрирован: 10.06.2015(UTC)
Сообщений: 11
Мужчина
Российская Федерация
Откуда: Москва

По поводу кода уточню у заказчика, думаю проблем возникнуть не должно, напишу позже здесь или можете написать в личку.

Я думаю недостаточно точно сформулировал вопрос. Отправляя письмо вы можете его просмотреть и в отулук (с проверкой подписи) и в веб браузере (без проверки подписи)?
Offline Максим Коллегин  
#10 Оставлено : 3 июля 2015 г. 18:43:40(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 718 раз в 622 постах
В outlook всё хорошо. В браузере - не смотрел. В каком? OWA?
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.