Страницы

Поиск по вопросам

Показаны сообщения с ярлыком сертификат. Показать все сообщения
Показаны сообщения с ярлыком сертификат. Показать все сообщения

суббота, 11 апреля 2020 г.

SSL сертификаты перевод из crt в pem

#ssl #сертификат #openssl

                    
Изучаю openssl, хочу: создать сертификат центра сертификации и импортировать его
в браузер, а также сертификат для сайта.
Разобрался, что сертификат для браузера создается через makecert в формате crt. А
для openssl через openssl в формате pem. Как из crt формата перевести в pem?
Если коротко, задача: создать сертификат для firefox, чтобы при запуске openssl s_server
и подключении браузером на https://127.0.0.1:4433/ не вылетало предупреждение о непроверенном
сертификате.    


Ответы

Ответ 1



Конвертирование файла DER (.crt .cer .der) в PEM: openssl x509 -inform der -in certificate.cer -out certificate.pem Конвертирование файла PEM в DER: openssl x509 -outform der -in certificate.pem -out certificate.der Конвертирование файла PKCS#12, который содержит приватный ключ и сертификат в PEM: openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes Конвертирование PEM файла и приватного ключа в PKCS#12: openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

Ответ 2



Не нужно не чего переводить в опенсервере и так все работает!!! в конфигурационном файле апача: SSLCertificateFile "%sprogdir%/userdata/config/cert_files/Имя_сайта.crt" SSLCertificateKeyFile "%sprogdir%/userdata/config/cert_files/Имя_сайта.key"

четверг, 9 апреля 2020 г.

как воспользоваться сертификатами от проекта let's encrypt?

#apache #nginx #ssl #сертификат #letsencrypt

                    
с 3 декабря 2015 года проект let's encrypt перешёл в режим "public beta".

как воспользоваться сертификатами, выдаваемыми этим проектом?
    


Ответы

Ответ 1



можно воспользоваться любой из реализаций клиентов, работающих с системой let's encrypt. например, есть пошаговая инструкция для официального клиента. но мне понравился минималистичный shell-скрипт из репозитория lukas2511, который не требует ни повышенных привилегий для своей работы, ни установки дополнительных программ/пакетов (всё необходимое обычно уже имеется в любой «серверной» установке: bash, openssl, curl и утилиты из coreutils). как я настроил этот клиент для пущей безопасности я создал пользователя letsencrypt (без пароля): $ sudo adduser --disabled-password letsencrypt открыл сеанс оболочки от имени этого пользователя: $ sudo -u letsencrypt -i letsencrypt@host:~$ склонировал репозиторий со скриптом и «перешёл» в созданный каталог: $ git clone https://github.com/lukas2511/letsencrypt.sh.git $ cd letsencrypt.sh если git не установлен, можно скачать архив с файлами и распаковать. скопировал образцовый конфиг: $ cp config.sh.example config.sh создал файл domains.txt для домена (мне требуется, чтобы в сертификате были имена и с www и без): domain.tld www.domain.tld если требуются на этой же машине и сертификаты для других доменов, то можно добавить ещё строк в этот файл, по строке для каждого сертификата. создал каталог для аутентификации: $ mkdir .acme-challenges теперь на время надо вернуться к настройкам http-сервера. можно завершить сеанс пользователя letsencrypt, а лучше открыть другое окно с оболочкой более привилегированного пользователя. в настройках http-сервера надо прописать alias для /.well-known/acme-challenge, чтобы он указывал на созданный в предыдущем пункте каталог. ориентировочно это будет /home/letsencrypt/letsencrypt.sh/.acme-challenges. для nginx в секцию server надо добавить location: location /.well-known/acme-challenge { alias /home/letsencrypt/letsencrypt.sh/.acme-challenges; } для apache в секцию virtualhost надо добавить строку: alias /.well-known/acme-challenge /home/letsencrypt/letsencrypt.sh/.acme-challenges это надо проделать для всех доменов (точнее, отдельных строк в созданном вами файле domains.txt). http-сервер после этого надо перезапустить. теперь можно запускать скрипт для генерации сертификата(-ов). вернитесь к окну, где открыта оболочка, запущенная от имени пользователя letsencrypt (или запустите новую и перейдите в каталог со скриптом): $ ./letsencrypt.sh -c если всё пойдёт нормально, последней строкой выдачи будет: + Done! сертификат и ключ для домена сгенерированы и лежат в каталоге /home/letsencrypt/letsencrypt.sh/certs/domain.tld: cert.pem privkey.pem в принципе, это symlink-и на актуальные версии этих файлов, которые лежат в том же каталоге и в названии которых присутствует метка времени. типа cert-1453143084.pem. теперь можно прописывать эти файлы в настройках http-сервера: файл с сертификатом: /home/letsencrypt/letsencrypt.sh/certs/domain.tld/cert.pem файл с ключом: /home/letsencrypt/letsencrypt.sh/certs/domain.tld/privkey.pem обновление сертификатов производится точно так же, как и генерация: от имени пользователя letsencrypt перейдите в каталог со скриптом и запустите скрипт с тем же самым параметром — ./letsencrypt.sh -c. можно создать соответствующую cron-задачу, которая через пару месяцев (сертификаты генерируются на 90 дней) выполнит скрипт (от имени этого пользователя и в нужном каталоге) и перезапустит http-сервер.

Ответ 2



Центр сертификации Let's Encrypt использует протокол Automated Certificate Management Environment. Получать сертификат лучше с помощью одного из рекомендованных клиентов. Моим выбором стал GetSSL. Это простой bash скрипт, который умеет сам себя обновлять. При работе использует CLI openssl, и значит нет жесткой привязки к версии. GetSSL автоматизирует процесс получения и продления сертификата с помощью нескольких команд. Например, чтобы получить сертификат для домена domain.tld: srv ~ # getssl -c domain.tld creating main config file /root/.getssl/getssl.cfg Making domain directory - /root/.getssl/domain.tld creating domain config file in /root/.getssl/domain.tld/getssl.cfg srv ~ # getssl domain.tld Первая команда добавляет домен в список для получения (выполняется единожды), вторая - для получения сертификата. В этой статье можно подробнее узнать о процессе получения сертификата с помощью GetSSL.

среда, 26 февраля 2020 г.

Что за сертификат? Как от него избавиться?

#windows #windows_10 #сертификат #rdp


При подключении к удалённому рабочему столу, на удалённом генерируется сертификат
с именем 


  S-1-5-21-183##3189-3615##5645-3821##652-1001/b73cf###-e0cb-414####ea-ab21ffa8a2b2/login.windows.net/c1c942f3-2##49af-98b4-5f34bba3c5df/y.k###kov@so##.ru


(некоторые символы заменены на решетки), действует до 2048 и назначение "Вход со
смарт-картой". 
Локально такой содержится в Сертификаты/Личное и Сертификаты/Local NonRemovable.
Что это за серт? И как сделать чтобы он не генерился удалённо? 

y.k###kov@so##.ru - это моя корпоративная почта. к удалённому компьютеру кроме меня
подключается множество других пользователей, но лишь мой оставляет там этот сомнительный
сертификат, который есть у меня локально и при удалении его и перезапуске - он снова
появляется
    


Ответы

Ответ 1



RDP в Windows поддерживает перенаправление некоторых типов устройств, т.е., при заходе на удаленный сервер, пользователь может взаимодействовать с устройствами с локального компьютера. К перенаправляемым устройствам относятся и считыватели электронных ключей (в интерфейсе Windows это называется смарт-картами). Многие драйвера считывателей настроены таким образом, что при появлении электронного ключа они автоматически регистрируют сертификат в системе. Чтобы предотвратить появление сертификата на удаленном сервере, нужно в параметрах RDP подключения выбрать "Локальные ресурсы - Подробнее", и снять галку с пункта "Смарт карты".

четверг, 13 февраля 2020 г.

Сертификаты Microsoft

#net #сертификат


Решил сдать сертификационный экзамен. Не могли бы обладатели сертификатов подробнее
рассказать о процедуре сертификации (обучение, учебники, стоимость, экзамен и т.д)
Интересуют сертификаты MCTS, MCPD, MCAD (.net 4.0 Web/Win development)    


Ответы

Ответ 1



Сертифицировался на MCPD Windows Developer 4. В общем, обучиться можно самому. Вот отсюда берешь необходимые номера к экзаменам и ищешь учебные пособия по ним, готовишься. Приходишь в экзаменационный центр Prometric в своем городе. Выясняешь стоимость и процедуру сдачи экзаменов (цена за экзамен ~$50). Регистрируешься и сдаешь по одному. На разные экзамены дают разное количество времени, в среднем 1:20 - 1:30. Количество вопросов в одном экзамене около 40. Я не знаю, как сейчас, но когда я сдавал многих учебных пособий еще не было. Средняя цена на одно учебное пособие $40-50. UPD Вот центры Prometric в РБ. Звони, узнавай, регистрируйся на сайте Prometric и удачи. Должен огорчить, 70-711 стоит $80, остальные, наверное, столько же.

воскресенье, 26 января 2020 г.

Как сделать HTTPS запрос с защитой от MITM?

#delphi_7 #https #openssl #сертификат


Нужен пример кода для скачивания странички или файла по https протоколу с проверкой
подлиности то есть, что бы в сессию нельзя было вклинится и подделать ответ. Все это
дело будет на делфи 7 но устроит и код на си можно использовать winapi (Win7+) и/или
openSSL dll'ку.
    


Ответы

Ответ 1



Достаточно будет сделать дополнительную проверку публичного ключа сервера. Смысл в том, чтобы клиент был вкурсе, что на стороне сервера нет чужака, т.к. задача MITM - подменить для клиента публичный ключ, которым клиент шифрует pre master secret. Если Вы заранее знаете приватный ключ сервера, то MITM Вам уже не страшен, т.к. вы можете легко проверить, соответствует ли Вашему, заранее известному, приватному ключу пришедший со стороны сервера публичный ключ. Это легко сделать, если взять произвольную строку, закодировать ее публичным ключом, и раскодировать приватным (заранее известным Вам). Если не получили исходную строку, то можете сигнализировать пользователю об атаке MITM и предпринимать соответствующие действия. Код не привожу, т.к. решение слишком специфично и требует на мой взгляд какой-то готовой инфраструктуры, которой у меня сейчас нет. Возможно позднее, когда будет на это время и возможности. Но если Вы предоставите свой код или API, который умеет у Вас мониторить SSL, в частности - пакет Server Certificate то минимальный алгоритм работы с OpenSSL я приведу. В большинстве случаев, приватный ключ Вам доступен не будет. Это логично, на то он и "приватный", чтобы гарантировать безопасность только диалога, а не всей цепочки посредников, так или иначе, вовлеченных в "беседу". Поэтому я приведу еще один оч. хороший вариант, т.н. - сertificate authority. В такой конфигурации, для проверки подлинности сертификата, владелец сервера выдает1 своим пользователям корневой сертификат (CA). Суть этой защиты в том, что любой сертификат сервера подписывается цифровой подписью, которая может быть проверена этим CA. Конечно, OpenSSL имеет и на такой случай API, но я пока не сталкивался с необходимостью такой проверки, поэтому пока не подскажу с кодом, но его можно легко нагуглить по ключевым словам openssl api verify ca. Более простой вариант - воспользоваться openssl напрямую: $ openssl verify -verbose -CAfile cacert.pem server.crt server.crt: OK но это потребует установленных бинарников openssl на стороне клиента. 1 Сертификат CA передается клиенту любым доступным способом, например: высылается по почте, или выкладывается в публичный доступ на сайте владельца, или устанавливается в хранилище сертификатов на стороне клиента через инсталятор - вариантов масса, главное - чтобы он был доступен клиенту в момент установки соединения с сервером. Поскольку ответ стал жертвой модераторского произвола, и все мои комментарии кто-то заботливо выпилил в чат, оставив только "правильные". привожу основные доводы в самом ответе: Этот изувеченный модератором мой второй ответ. Мой первый ответ был дан, чтобы объяснить, как приватный ключ защищает от MITM (и этот ответ модератор совершенно необдуманно слил со вторым). Мой второй ответ был дан чтобы показать способ, придуманный специально для предотвращаения MITM. Дискуссия по поводу неправильных действий модератора на мете. Дискуссия по аналогичному вопросу с общей меты (благодарю @Саша Черных за информацию) Надеюсь, здравый смысл участников сообщества победит неквалифицированное поведение администрации.

воскресенье, 12 января 2020 г.

Установка списка отзывов (*.crl) в хранилище компьютера

#c_sharp #сертификат


Ребята, подскажите пожалуйста как в C# установить *.crl в хранилище компьютера.
Есть код для установки сертификата в корневые сертификаты:

private static void InstallRootCertificate(string cerFileName)
{
   X509Store store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine);
   X509Certificate2 certificate = new X509Certificate2(cerFileName);
   store.Open(OpenFlags.ReadWrite);
   store.Add(certificate);
   store.Close();
}


Но он, по понятным причинам не подходит для crl.
Заранее спасибо.
    


Ответы

Ответ 1



Хотя вопрос был задан очень давно, и уже, возможно, не актуален, все же предложу решение, поскольку проблема интересная. Ее решение может быть полезно, например, когда нужно автоматизировать обновление списков отозванных сертификатов на десятках серверов. К сожалению, никаких стандартных средств для решения этой задачи .NET не предоставляет. Придется использовать обертки для crypt32.dll и unsafe-код. Ниже приведет пример решения. Его основу составляет класс CrlFile, который позволят открыть crl-файл и импортировать его в стандартное хранилище (класс System.Security.Cryptography.X509Certificates.X509Store). Дополнительная информация: https://msdn.microsoft.com/en-us/library/windows/desktop/aa376011(v=vs.85).aspx https://blogs.msdn.com/b/gproano/archive/2005/03/22/400645.aspx?Redirected=true class Program { static void Main(string[] args) { var store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); var crl = new CrlFile(@"d:\tmp\ca\root.crl"); crl.Import(store, CrlAddDisposition.CERT_STORE_ADD_REPLACE_EXISTING); store.Close(); } } public class CrlFile { // по уму здесь нужна реализация SafeHandle, // но чтобы не удлинять код оставим, как есть private IntPtr _context; private readonly string _file; public CrlFile(string file) { _file = file; } public bool Import(X509Store store, CrlAddDisposition disp, ref IntPtr storeContext) { EnsureCrlContext(); return Crypto32Interop.CertAddCRLContextToStore(store.StoreHandle, _context, (uint)disp, storeContext); } public bool Import(X509Store store, CrlAddDisposition disp) { var storeContext = IntPtr.Zero; return Import(store, disp, ref storeContext); } private unsafe void EnsureCrlContext() { if (_context != IntPtr.Zero) return; var context = new IntPtr(Crypto32Interop.CERT_QUERY_CONTENT_CRL); var handle = GCHandle.Alloc(_file, GCHandleType.Pinned); var data = handle.AddrOfPinnedObject(); bool ret = Crypto32Interop.CryptQueryObject( Crypto32Interop.CERT_QUERY_OBJECT_FILE, data, Crypto32Interop.CERT_QUERY_CONTENT_FLAG_CRL, Crypto32Interop.CERT_QUERY_FORMAT_FLAG_ALL, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(&context)); _context = Crypto32Interop.CertDuplicateCRLContext(context); Crypto32Interop.CertFreeCRLContext(context); handle.Free(); } ~CrlFile() { if (_context != IntPtr.Zero) Crypto32Interop.CertFreeCRLContext(_context); } } public static class Crypto32Interop { public const uint CERT_QUERY_CONTENT_CTL = 2; public const uint CERT_QUERY_CONTENT_CRL = 3; public const uint CERT_QUERY_OBJECT_FILE = 1; public const uint CERT_QUERY_FORMAT_BINARY = 1; public const uint CERT_QUERY_FORMAT_BASE64_ENCODED = 2; public const uint CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3; public const uint CERT_QUERY_CONTENT_FLAG_CRL = (1 << (int)CERT_QUERY_CONTENT_CRL); public const uint CERT_QUERY_CONTENT_FLAG_CTL = (1 << (int)CERT_QUERY_CONTENT_CTL); public const uint CERT_QUERY_FORMAT_FLAG_BINARY = (1 << (int)CERT_QUERY_FORMAT_BINARY); public const uint CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 << (int)CERT_QUERY_FORMAT_BASE64_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << (int)CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ALL = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr CertDuplicateCRLContext(IntPtr pCrlContext); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertFreeCRLContext(IntPtr pCrlContext); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertAddCRLContextToStore( [In] IntPtr hCertStore, [In] IntPtr pCrlContext, [In] uint dwAddDisposition, [Out] IntPtr ppStoreContext); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CryptQueryObject( [In] uint dwObjectType, [In] IntPtr pvObject, [In] uint dwExpectedContentTypeFlags, [In] uint dwExpectedFormatTypeFlags, [In] uint dwFlags, [Out] IntPtr pdwMsgAndCertEncodingType, [Out] IntPtr pdwContentType, [Out] IntPtr pdwFormatType, [In, Out] IntPtr phCertStore, [In, Out] IntPtr phMsg, [In, Out] IntPtr ppvContext); } public enum CrlAddDisposition : uint { CERT_STORE_ADD_NEW = 1, CERT_STORE_ADD_USE_EXISTING = 2, CERT_STORE_ADD_REPLACE_EXISTING = 3, CERT_STORE_ADD_ALWAYS = 4, CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5, CERT_STORE_ADD_NEWER = 6, CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7, }

суббота, 11 января 2020 г.

Как работает SSL в мобильных приложениях?

#алгоритм #ssl #шифрование #сертификат


В браузере все понятно, у него заранее есть список вшитых сертификатов CA, которыми
он проверяет сертификат сервера... Но как происходит проверка в мобильных приложениях?
Или, допустим, когда я отправляю запрос, допустим, через BurpSuite?
    


Ответы

Ответ 1



Общие принципы SSL (а точнее, инфраструктуры ключей) продолжают работать и в контексте мобильных приложений. Набор CA (или, по-русски, ЦС – центров сертификации): может быть размещен в ОС (чаще всего, т. к. он используется по умолчанию [обычно]). может поставляться с приложением (что не такая уж редкость, см. Firefox). может отсутствовать вовсе, если клиент заранее знает публичный ключ сервера сам, или может попросить пользователя проверить отпечаток ключа в интерфейсе (привет, SSH!), или просто плевать хотел на безопасность (и такое бывает! ¯\_(ツ)_/¯). Может использоваться несколько вариантов сразу. Например, Яндекс.Браузер использует гибрид: он рассчитывает на системное хранилище, но отпечатки (хэши) сертификатов ЦСов оттуда сравнивает с известными ему (за уточнение механизма спасибо Abyx). Их немного, поэтому зашить в бинарник не проблема. Таким образом ЯБ пытается предупреждать ситуации, в которых соединение пользователя компрометируется через сторонний ЦС, установленный в систему без его ведома. Так что, как видите, SSL довольно хорошо гнётся под разные ситуации. Но реально этим богатством редко пользуются. В подавляющем большинстве случаев сервер имеет ключ, заверенный известным ЦС, а клиент имеет только пачку известных ЦС в ОС. Сервер предоставляет доказательства, указывающие через известные ЦС на подлинность своего ключа. Так клиент понимает, что это тот самый сервер.

Ответ 2



Если говорить про Android (он построен на ядре Linux), там есть папка с сертификатами /etc/ssl, в которой хранится список всех установленных сертификатов в системе. Мобильные приложения при установке защищенного соединения обращаются к этому списку.

вторник, 31 декабря 2019 г.

Сертификация Microsoft. Есть ли смысл? [закрыт]

#net #сертификат


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Update the question so it
can be answered with facts and citations by editing this post.
                        
                        Закрыт 5 месяцев назад.
                                                                                
           
                
        
В поисках первой работы на junior .NET разработчика появилась идея получить сертификацию.
Подскажите, есть ли в этом практический смысл? Увеличит ли это шансы? Как я указал
- работа первая, т.е. опыта коммерческой разработки нет.
Конкретно, я думал получить MCSD: Web Applications.
Для этого необходимо сдать 3 экзамена:

Programming in HTML5 with JavaScript and CSS3 (бесплатно)
Developing ASP.NET 4.5 MVC Web Applications (80$)
Developing Windows Azure and Web Services (80$)

В принципе подготовиться - не проблема, но не уверен есть ли в них смысл и стоит
ли тратить 160$.    


Ответы

Ответ 1



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

Ответ 2



Смысл есть в двух случаях: 1) Бумажки помогут вам выделиться при всех прочих равных (в т.ч. если вы новичок). 2) Бумажки помогут вам, если вы будете устраиваться на работу на Западе — там это дело любят. Во всех остальных случаях опыт ценится куда больше, чем бумажки.

пятница, 27 декабря 2019 г.

Регистрация программы

#регистрация #сертификат #юридические_аспекты


Подскажите, нужна ли регистрация программы, сертификат качества, регистрация авторских
прав и т.д., для того что использовать программу в коммерческих целях?.. Или можно
на основе доверительных отношений продавать ПО организациям и частным лицам? Кто нибудь
занимался этим (выпускал на рынок свои программные продукты)? Спасибо
    


Ответы

Ответ 1



А Вы когда-нибудь видели сертификаты качества для программ Microsoft, Oracle и т.д.? Сертификаты качества выдают ЭТИ фирмы только за дорого стоящее их имя, к которому, можно сказать, проникся уважением мир. Вот и по желанию программисты сертифицируются у этих фирм. Возможно, у этих же фирм и есть какие-то сертификаты качества для программ. Так, чтобы была сертификация у государства?!!! Это уже, по-моему, нонсенс. Тогда государство должно создавать комиссию, состоящую из профессиональных разработчиков или тестировщиков ПО, которые и выносили бы вердикт программе. Но это же бессмыслица, по-моему, для государств. Как я знаю работу некоторых частников в Беларуси, так они заключают договор о создании и сопровождении некоторого ПО, разрабатывают, получают деньги за программу и сопровождают свою программу. И никакого сертификата по своей программе не получают. Т.е. Тут уже в любом случае сертифицирующей стороной выступает заказчик. А как может знать какой-то эксперт, что же надо стороне-заказчику? Вы можете 100% создать патент на свою программу или кусок программного кода. Такие операции уже существуют и используются. Там есть много своих тонкостей, которые Вы должны уже узнавать именно в комиссии по сертификации.

Ответ 2



Ответ юриста (Регистрация ПО): Безусловно, в случае если Вы будете использовать ПО в коммерческих целях, регистрация необходима. Регистрация ПО - это удостоверение существования программы в объективной форме и указание на авторство. Регистрация программы для ЭВМ осуществляется в соответствии в соответствии с положениями Гражданского кодекса РФ по желанию правообладателя.

суббота, 22 июня 2019 г.

как воспользоваться сертификатами от проекта let's encrypt?

с 3 декабря 2015 года проект let's encrypt перешёл в режим "public beta".
как воспользоваться сертификатами, выдаваемыми этим проектом?


Ответ

можно воспользоваться любой из реализаций клиентов, работающих с системой let's encrypt
например, есть пошаговая инструкция для официального клиента.

но мне понравился минималистичный shell-скрипт из репозитория lukas2511, который не требует ни повышенных привилегий для своей работы, ни установки дополнительных программ/пакетов (всё необходимое обычно уже имеется в любой «серверной» установке: bash, openssl, curl и утилиты из coreutils).
как я настроил этот клиент
для пущей безопасности я создал пользователя letsencrypt (без пароля):
$ sudo adduser --disabled-password letsencrypt открыл сеанс оболочки от имени этого пользователя:
$ sudo -u letsencrypt -i letsencrypt@host:~$ склонировал репозиторий со скриптом и «перешёл» в созданный каталог:
$ git clone https://github.com/lukas2511/letsencrypt.sh.git $ cd letsencrypt.sh
если git не установлен, можно скачать архив с файлами и распаковать. скопировал образцовый конфиг:
$ cp config.sh.example config.sh создал файл domains.txt для домена (мне требуется, чтобы в сертификате были имена и с www и без):
domain.tld www.domain.tld
если требуются на этой же машине и сертификаты для других доменов, то можно добавить ещё строк в этот файл, по строке для каждого сертификата. создал каталог для аутентификации
$ mkdir .acme-challenges теперь на время надо вернуться к настройкам http-сервера. можно завершить сеанс пользователя letsencrypt, а лучше открыть другое окно с оболочкой более привилегированного пользователя.
в настройках http-сервера надо прописать alias для /.well-known/acme-challenge, чтобы он указывал на созданный в предыдущем пункте каталог. ориентировочно это будет /home/letsencrypt/letsencrypt.sh/.acme-challenges
для nginx в секцию server надо добавить location
location /.well-known/acme-challenge { alias /home/letsencrypt/letsencrypt.sh/.acme-challenges; } для apache в секцию virtualhost надо добавить строку:
alias /.well-known/acme-challenge /home/letsencrypt/letsencrypt.sh/.acme-challenges
это надо проделать для всех доменов (точнее, отдельных строк в созданном вами файле domains.txt).
http-сервер после этого надо перезапустить. теперь можно запускать скрипт для генерации сертификата(-ов). вернитесь к окну, где открыта оболочка, запущенная от имени пользователя letsencrypt (или запустите новую и перейдите в каталог со скриптом):
$ ./letsencrypt.sh -c
если всё пойдёт нормально, последней строкой выдачи будет:
+ Done! сертификат и ключ для домена сгенерированы и лежат в каталоге /home/letsencrypt/letsencrypt.sh/certs/domain.tld
cert.pem privkey.pem
в принципе, это symlink-и на актуальные версии этих файлов, которые лежат в том же каталоге и в названии которых присутствует метка времени. типа cert-1453143084.pem теперь можно прописывать эти файлы в настройках http-сервера:
файл с сертификатом: /home/letsencrypt/letsencrypt.sh/certs/domain.tld/cert.pem файл с ключом: /home/letsencrypt/letsencrypt.sh/certs/domain.tld/privkey.pem обновление сертификатов производится точно так же, как и генерация: от имени пользователя letsencrypt перейдите в каталог со скриптом и запустите скрипт с тем же самым параметром — ./letsencrypt.sh -c
можно создать соответствующую cron-задачу, которая через пару месяцев (сертификаты генерируются на 90 дней) выполнит скрипт (от имени этого пользователя и в нужном каталоге) и перезапустит http-сервер

суббота, 9 марта 2019 г.

Установка списка отзывов (*.crl) в хранилище компьютера

Ребята, подскажите пожалуйста как в C# установить *.crl в хранилище компьютера. Есть код для установки сертификата в корневые сертификаты:
private static void InstallRootCertificate(string cerFileName) { X509Store store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine); X509Certificate2 certificate = new X509Certificate2(cerFileName); store.Open(OpenFlags.ReadWrite); store.Add(certificate); store.Close(); }
Но он, по понятным причинам не подходит для crl. Заранее спасибо.


Ответ

Хотя вопрос был задан очень давно, и уже, возможно, не актуален, все же предложу решение, поскольку проблема интересная. Ее решение может быть полезно, например, когда нужно автоматизировать обновление списков отозванных сертификатов на десятках серверов.
К сожалению, никаких стандартных средств для решения этой задачи .NET не предоставляет. Придется использовать обертки для crypt32.dll и unsafe-код. Ниже приведет пример решения. Его основу составляет класс CrlFile, который позволят открыть crl-файл и импортировать его в стандартное хранилище (класс System.Security.Cryptography.X509Certificates.X509Store).
Дополнительная информация:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa376011(v=vs.85).aspx https://blogs.msdn.com/b/gproano/archive/2005/03/22/400645.aspx?Redirected=true

class Program { static void Main(string[] args) { var store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite);
var crl = new CrlFile(@"d:\tmp\ca
oot.crl"); crl.Import(store, CrlAddDisposition.CERT_STORE_ADD_REPLACE_EXISTING); store.Close(); } }
public class CrlFile { // по уму здесь нужна реализация SafeHandle, // но чтобы не удлинять код оставим, как есть private IntPtr _context;
private readonly string _file;
public CrlFile(string file) { _file = file; }
public bool Import(X509Store store, CrlAddDisposition disp, ref IntPtr storeContext) { EnsureCrlContext(); return Crypto32Interop.CertAddCRLContextToStore(store.StoreHandle, _context, (uint)disp, storeContext); }
public bool Import(X509Store store, CrlAddDisposition disp) { var storeContext = IntPtr.Zero; return Import(store, disp, ref storeContext); }
private unsafe void EnsureCrlContext() { if (_context != IntPtr.Zero) return;
var context = new IntPtr(Crypto32Interop.CERT_QUERY_CONTENT_CRL);
var handle = GCHandle.Alloc(_file, GCHandleType.Pinned); var data = handle.AddrOfPinnedObject();
bool ret = Crypto32Interop.CryptQueryObject( Crypto32Interop.CERT_QUERY_OBJECT_FILE, data, Crypto32Interop.CERT_QUERY_CONTENT_FLAG_CRL, Crypto32Interop.CERT_QUERY_FORMAT_FLAG_ALL, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(&context));
_context = Crypto32Interop.CertDuplicateCRLContext(context); Crypto32Interop.CertFreeCRLContext(context); handle.Free(); }
~CrlFile() { if (_context != IntPtr.Zero) Crypto32Interop.CertFreeCRLContext(_context); } }
public static class Crypto32Interop { public const uint CERT_QUERY_CONTENT_CTL = 2; public const uint CERT_QUERY_CONTENT_CRL = 3;
public const uint CERT_QUERY_OBJECT_FILE = 1;
public const uint CERT_QUERY_FORMAT_BINARY = 1; public const uint CERT_QUERY_FORMAT_BASE64_ENCODED = 2; public const uint CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3;
public const uint CERT_QUERY_CONTENT_FLAG_CRL = (1 << (int)CERT_QUERY_CONTENT_CRL); public const uint CERT_QUERY_CONTENT_FLAG_CTL = (1 << (int)CERT_QUERY_CONTENT_CTL); public const uint CERT_QUERY_FORMAT_FLAG_BINARY = (1 << (int)CERT_QUERY_FORMAT_BINARY); public const uint CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 << (int)CERT_QUERY_FORMAT_BASE64_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << (int)CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ALL = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr CertDuplicateCRLContext(IntPtr pCrlContext);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertFreeCRLContext(IntPtr pCrlContext);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertAddCRLContextToStore( [In] IntPtr hCertStore, [In] IntPtr pCrlContext, [In] uint dwAddDisposition, [Out] IntPtr ppStoreContext);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CryptQueryObject( [In] uint dwObjectType, [In] IntPtr pvObject, [In] uint dwExpectedContentTypeFlags, [In] uint dwExpectedFormatTypeFlags, [In] uint dwFlags, [Out] IntPtr pdwMsgAndCertEncodingType, [Out] IntPtr pdwContentType, [Out] IntPtr pdwFormatType, [In, Out] IntPtr phCertStore, [In, Out] IntPtr phMsg, [In, Out] IntPtr ppvContext); }
public enum CrlAddDisposition : uint { CERT_STORE_ADD_NEW = 1, CERT_STORE_ADD_USE_EXISTING = 2, CERT_STORE_ADD_REPLACE_EXISTING = 3, CERT_STORE_ADD_ALWAYS = 4, CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5, CERT_STORE_ADD_NEWER = 6, CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7, }

понедельник, 4 марта 2019 г.

Как работает SSL в мобильных приложениях?

В браузере все понятно, у него заранее есть список вшитых сертификатов CA, которыми он проверяет сертификат сервера... Но как происходит проверка в мобильных приложениях? Или, допустим, когда я отправляю запрос, допустим, через BurpSuite?


Ответ

Общие принципы SSL (а точнее, инфраструктуры ключей) продолжают работать и в контексте мобильных приложений. Набор CA (или, по-русски, ЦС – центров сертификации):
может быть размещен в ОС (чаще всего, т. к. он используется по умолчанию [обычно]). может поставляться с приложением (что не такая уж редкость, см. Firefox). может отсутствовать вовсе, если клиент заранее знает публичный ключ сервера сам, или может попросить пользователя проверить отпечаток ключа в интерфейсе (привет, SSH!), или просто плевать хотел на безопасность (и такое бывает! ¯\_(ツ)_/¯).
Может использоваться несколько вариантов сразу. Например, Яндекс.Браузер использует гибрид: он рассчитывает на системное хранилище, но отпечатки (хэши) сертификатов ЦСов оттуда сравнивает с известными ему (за уточнение механизма спасибо Abyx). Их немного, поэтому зашить в бинарник не проблема. Таким образом ЯБ пытается предупреждать ситуации, в которых соединение пользователя компрометируется через сторонний ЦС, установленный в систему без его ведома.

Так что, как видите, SSL довольно хорошо гнётся под разные ситуации. Но реально этим богатством редко пользуются.
В подавляющем большинстве случаев сервер имеет ключ, заверенный известным ЦС, а клиент имеет только пачку известных ЦС в ОС. Сервер предоставляет доказательства, указывающие через известные ЦС на подлинность своего ключа. Так клиент понимает, что это тот самый сервер.

четверг, 20 декабря 2018 г.

Сертификация Microsoft. Есть ли смысл?

В поисках первой работы на junior .NET разработчика появилась идея получить сертификацию. Подскажите, есть ли в этом практический смысл? Увеличит ли это шансы? Как я указал - работа первая, т.е. опыта коммерческой разработки нет. Конкретно, я думал получить MCSD: Web Applications. Для этого необходимо сдать 3 экзамена: Programming in HTML5 with JavaScript and CSS3 (бесплатно) Developing ASP.NET 4.5 MVC Web Applications (80$) Developing Windows Azure and Web Services (80$) В принципе подготовиться - не проблема, но не уверен есть ли в них смысл и стоит ли тратить 160$.


Ответ

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