+7(499)-938-42-58 Москва
+7(800)-333-37-98 Горячая линия

Ssl подключение сертификат клиентской аутентификации. Применение шифрования

Содержание

SSL-сертификаты бывают разные

Ssl подключение сертификат клиентской аутентификации. Применение шифрования

Чем отличается защищенное соединение от незащищенного – знает довольно большое количество людей. А вот дальше довольно часто начинается темный лес: откуда берется сертификат, чем один сертификат отличается от другого, в чем разница между SSL и TLS и кто это вообще такие, какое отношение сертификат имеет к безопасности и так далее.

В рамках этого поста мы попробуем ответить хотя бы на часть этих и подобных вопросов, а начнем все-таки издалека – с того, что значат HTTP и HTTPS в адресной строке.

Что такое HTTP и HTTPS и чем они отличаются

Когда кто-нибудь из нас заходит на какой-нибудь сайт в Интернете, просто читает его или вводит на нем какие-то данные, происходит обмен информацией между нашим компьютером и сервером, на котором размещен сайт. Происходит он в соответствии с протоколом передачи данных — набором соглашений, определяющих порядок обмена информацией между разными программами.

Протокол, который используется для передачи данных в сети и получения информации с сайтов, называется HTTP (англ. HyperText Transfer Protocol — протокол передачи гипертекста). У него существует расширение, которое называется HTTPS (англ.

HyperText Transfer Protocol Secure — безопасный протокол передачи гипертекста). Его суть — в том, что расширение позволяет передавать информацию между клиентом и сервером в зашифрованном виде.

То есть информация, которой обмениваются клиент и сервер, доступна только этому клиенту и этому серверу, а не третьим лицам (например, провайдеру или администратору Wi-Fi-сети).

Шифрование данных, которые передаются от клиента к серверу, происходит, в свою очередь, в соответствии со своим, криптографическим протоколом. Сначала для этого использовался протокол под названием SSL (англ. Secure Sockets).

У него было несколько версий, но все они в какой-то момент подвергались критике из-за наличия проблем с безопасностью. В итоге была выпущена та версия, которая используется сейчас — ее переименовали в TLS (англ. Transport Layer Security).

Однако название SSL прижилось лучше, и новую версию протокола до сих пор часто называют так.

Для того чтобы использовать шифрование, у сайта должен быть специальный сертификат, или, как он еще называется, цифровая подпись, который подтверждает, что механизм шифрования действительно надежен и соответствует протоколу. Индикаторами того, что у сайта такой сертификат есть, являются, помимо буквы «S» в HTTPS, зеленый замочек и надпись «Защищено» или название компании в адресной строке браузера.

Как сайту получить SSL-сертификат

Существует два способа. Способ первый — веб-мастер может издать и подписать сертификат самостоятельно, сгенерировав криптографические ключи. Такой сертификат будет называться самоподписанным (англ. Self-Signed).

В этом случае соединение с сайтом также будет зашифровано, но при попытке зайти на сайт с таким сертификатом пользователю будет показано предупреждение, что сертификат — недоверенный (неподтвержденный центром или устаревший).

Обычно в окне браузер показывает перечеркнутый замочек и выделенные красным буквы HTTPS, или выделяет красным и перечеркивает буквы HTTPS в поисковой строке — зависит от браузера.

Второй способ (и единственный правильный) — приобрести сертификат, подписанный каким-либо из доверенных центров сертификации (Certificate authority).

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

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

Какими бывают SSL-сертификаты

Сертификаты, подписанные центрами, делятся на несколько видов — в зависимости от уровня надежности, того, кто и как их может получить и, соответственно, цены.

Первый называется DV (англ. Domain Validation — проверка домена). Для его получения физическому или юридическому лицу нужно доказать, что они имеют некий контроль над доменом, для которого приобретается сертификат.

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

Процесс получения такого сертификата обычно занимает несколько минут.

Сертификаты более высокого уровня — OV (англ. Organization Validation — проверка организации).

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

Оформление может занимать несколько дней, пока проверяются все документы. Наличие DV или OV-сертификата у сайта в браузере отображается серым или зеленым замочком, словом Secure и буквами HTTPS в адресной строке.

И еще есть EV (англ. Extended Validation — расширенная проверка) — сертификаты самого высокого уровня.

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

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

Информацию о сертификате (кем выдан, когда и сколько действует) можно посмотреть, кликнув на название организации или надпись Secure — правда, это можно сделать не во всех браузерах.

Что может быть не так с сертификатами

Один из принципов, по которым основные разработчики браузеров, такие как Google и Mozilla, выстраивают свою политику — безопасность Интернета и пользовательских данных в нем. В этой связи осенью 2017 года Google анонсировала, что отныне будет маркировать все страницы, использующие HTTP-соединение, как «незащищенные», и, по сути, блокировать пользователям доступ к ним.

Фактически, это условие вынудило все сайты на HTTP в ускоренном темпе приобретать доверенные сертификаты. Соответственно, спрос на услуги сертификационных центров вырос в разы, а время на проверку документов последним, естественно, хотелось бы сократить, чтобы выдать как можно больше этих самых сертификатов. Поэтому многие из центров стали проводить проверку гораздо менее тщательно.

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

Последствия для центра не радужные: Google заявила, что перестанет считать доверенными все сертификаты, выданные центром, пока тот полностью не переделает всю систему проверки и не установит новые стандарты.

Mozilla также планирует ужесточить верификацию сертификатов в своих браузерах и тем самым повлиять на требования к их выдаче.

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

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

В этом случае зелеными буквами в адресной строке будет написано как раз-таки название компании (очень похожее на название другой известной компании), что позволит злоумышленнику повысить доверие пользователя к фишинговому сайту.

Поэтому никогда не забывайте об осторожности и соблюдении правил при использовании любой веб-страницы.

Источник: https://www.kaspersky.ru/blog/certificates-are-different/20227/

Авторизация с помощью клиентских SSL сертификатов в IOS и Android

Ssl подключение сертификат клиентской аутентификации. Применение шифрования
Протокол безопасной передачи данных SSL (Secure Sockets Layer) помимо обеспечения безопасной передачи данных так же позволяет реализовать авторизацию клиентов при помощи клиентских SSL сертификатов. Данная статья является практическим руководством по реализации данного вида авторизации в мобильных приложениях на IOS и Android.

Процесс организации работы сервера обеспечивающего такой вид авторизации в статье не рассматривается, однако в конце приведены ссылки по данной тематике.

Процесс авторизации выглядит следующим образом.

При переходе клиента в закрытую область сервер запрашивает у клиента сертификат, если проверка прошла успешно то клиент получает доступ к закрытому контенту в ином случае клиент может получить ошибку “No required SSL certificate was sent”.

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

curl ­­cert client.crt ­­key client.key ­k someserive.com

Однако стоит заметить, что в последняя версия curl 7.30.0 в OS X сломана и не может быть использована для организации тестирования (http://curl.haxx.se/mail/archive-2013-10/0036.html).

Для передачи клиентского сертификата мы будем использовать файл в формате PKCS#12. В файлах PKCS#12 хранятся одновременно и закрытый ключ, и сертификат (разумеется в зашифрованном виде). Примерная организация PKCS#12 файла показана на рисунке. Сконвертировать Ваш client.crt в файл формата PKCS#12 можно при помощи следующей команды:

openssl pkcs12 ­export ­in client.crt ­inkey client.key ­out client.p12

После того как мы получили файл в формате PKCS#12 можно переходить к разработке и тестированию нашего мобильного приложения. Начнем с IOS.

1. Реализуем IOS версию приложения

Необходимо подключить к Вашему проекту Security.Framework Для осуществления запроса нам необходимо извлечеть из PKCS#12 цифровой сертификат и ассоциированный с ним приватный ключ (SecIdentityRef). Наличие данного объекта позволит нам получить соответствующий NSURLCredential. Итак реализуем функецию extractIdentityAndTrust.

OSStatus extractIdentityAndTrust(CFDataRef inP12data, SecIdentityRef *identity){ OSStatus securityError = errSecSuccess; CFStringRef password = CFSTR(“”); const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { password }; CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); securityError = SecPKCS12Import(inP12data, options, &items); if (securityError == 0) { CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0); const void *tempIdentity = NULL; tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity); *identity = (SecIdentityRef)tempIdentity; } if (options) { CFRelease(options); } return securityError;} Производим извлечение при помощи функции SecPKCS12Import, незабываем указать пароль к серитификату. Далее реализуем делегат canAuthenticateAgainstProtectionSpace, вызов данного делегата позволяет нам определить свойства сервера, а именно протокол, механизм авторизации. У нас реализация этого делегата будет простой, укажем, что обрабатываем любой способ аутентификации представленный сервером. – (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace{ return YES;} Обработаем возможные ошибки: – (void)connection:(NSURLConnection*) connection didFailWithError:(NSError *)error{ NSLog(@”Did recieve error: %@”, [error localizedDescription]); NSLog(@”%@”, [error userInfo]);} Теперь перейдем к реализации непосредственно механизма аутентификации. Реализуем делегат didRecieveAuthentificationChallenge: – (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{ NSLog(@”Authentication challenge”); // load cert NSString *path = [[NSBundle mainBundle] pathForResource:@”keystore” ofType:@”p12″]; NSData *p12data = [NSData dataWithContentsOfFile:path]; CFDataRef inP12data = (__bridge CFDataRef)p12data; SecIdentityRef myIdentity; OSStatus status = extractIdentityAndTrust(inP12data, &myIdentity); SecCertificateRef myCertificate; SecIdentityCopyCertificate(myIdentity, &myCertificate); const void *certs[] = { myCertificate }; CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL); NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity certificates:(__bridge NSArray*)certsArray persistence: NSURLCredentialPersistenceForSession]; [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];} Загружаем наш сертификат, извлекаем из него нужные нам данные, создаем NSURLCredential, передаем нужную информацию, сохраняем данные аутентификации только в контексте текущей сессии. Ну и для полноты картины приведу код подготавливающий NSURLConnection: NSString *key = @”test”; NSError *jsonSerializationError = nil; NSMutableDictionary *projectDictionary = [NSMutableDictionary dictionaryWithCapacity:1]; [projectDictionary setObject:key forKey:@”test”]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:projectDictionary options:nil error:&jsonSerializationError]; NSURL *requestUrl = [[NSURL alloc] initWithString:@”https://your_service”]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestUrl cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; [request setHTTPMethod:@”POST”]; [request setValue:@”UTF-8″ forHTTPHeaderField:@”content-charset”]; [request setValue:@”application/json” forHTTPHeaderField:@”Accept”]; [request setValue:@”application/json” forHTTPHeaderField:@”Content-Type”]; [request setValue:[NSString stringWithFormat:@”%d”, [jsonData length]] forHTTPHeaderField:@”Content-Length”]; [request setHTTPBody: jsonData]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [connection start]; Реализацию делегата didReceiveData приводить не буду.

2. Реализуем Android версию приложения

Начну сразу с кода: KeyStore keystore = KeyStore.getInstance(“PKCS12”); keystore.load(getResources().openRawResource(R.raw.keystore), “”.toCharArray()); SSLSocketFactory sslSocketFactory = new AdditionalKeyStoresSSLSocketFactory(keystore); HttpParams params = new BasicHttpParams();HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);HttpProtocolParams.

setContentCharset(params, HTTP.UTF_8);HttpProtocolParams.setUseExpectContinue(params, true); final SchemeRegistry registry = new SchemeRegistry();registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80));registry.

register(new Scheme(“https”, sslSocketFactory, 3123)); ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);DefaultHttpClient httpclient = new DefaultHttpClient(manager, params); HttpPost httpPostRequest = new HttpPost(“https://your_service”); // datas – array which contains data to send to serverStringEntity se = new StringEntity(datas[0].toString(), HTTP.UTF_8); // Set HTTP parametershttpPostRequest.setEntity(se);httpPostRequest.setHeader(“Accept”, “application/json”);httpPostRequest.setHeader(“Content-Type”, “application/json”); HttpResponse response = httpclient.execute(httpPostRequest); Получаем экземпляр соответствующего KeyStore в нашем случае это (PKCS12), загружаем из ресурсов наш сертификат, вторым аргументом указываем пароль. Далее создаем экземпляр SSLSocketFactory, использую собственную реализацию SSLSocketFactory, позволяющую инициализировать SSL контекст с использованием нашего сертификата. Код фабрики приведен чуть ниже. Далее конфигурируем параметры подключения, регистрируем нашу фабрику, указываем порт на который будем посылать запрос, формируем соответсвующий POST и выполняем запрос. Код фабрики:import java.io.IOException;import java.net.Socket;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.UnrecoverableKeyException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.Arrays; import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.TrustManagerFactory;import javax.net.ssl.X509TrustManager; import org.apache.http.conn.ssl.SSLSocketFactory; /** * Allows you to trust certificates from additional KeyStores in addition to * the default KeyStore */public class AdditionalKeyStoresSSLSocketFactory extends SSLSocketFactory { protected SSLContext sslContext = SSLContext.getInstance(“TLS”); public AdditionalKeyStoresSSLSocketFactory(KeyStore keyStore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(null, null, null, null, null, null); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, “”.toCharArray()); sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new ClientKeyStoresTrustManager(keyStore)}, new SecureRandom()); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } /** * http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#X509TrustManager */ public static class ClientKeyStoresTrustManager implements X509TrustManager { protected ArrayList x509TrustManagers = new ArrayList(); protected ClientKeyStoresTrustManager(KeyStore… additionalkeyStores) { final ArrayList factories = new ArrayList(); try { // The default Trustmanager with default keystore final TrustManagerFactory original = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); original.init((KeyStore) null); factories.add(original); for ( KeyStore keyStore : additionalkeyStores ) { final TrustManagerFactory additionalCerts = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); additionalCerts.init(keyStore); factories.add(additionalCerts); } } catch (Exception e) { throw new RuntimeException(e); } /* * Iterate over the returned trustmanagers, and hold on * to any that are X509TrustManagers */ for (TrustManagerFactory tmf : factories) for ( TrustManager tm : tmf.getTrustManagers() ) if (tm instanceof X509TrustManager) x509TrustManagers.add( (X509TrustManager) tm ); if ( x509TrustManagers.size() == 0 ) throw new RuntimeException(“Couldn't find any X509TrustManagers”); } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { for ( X509TrustManager tm : x509TrustManagers ) { try { tm.checkClientTrusted(chain, authType); return; } catch ( CertificateException e ) { } } throw new CertificateException(); } /* * Loop over the trustmanagers until we find one that accepts our server */ public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { for ( X509TrustManager tm : x509TrustManagers ) { try { tm.checkServerTrusted(chain, authType); return; } catch ( CertificateException e ) { } } throw new CertificateException(); } public X509Certificate[] getAcceptedIssuers() { final ArrayList list = new ArrayList(); for ( X509TrustManager tm : x509TrustManagers ) list.addAll(Arrays.asList(tm.getAcceptedIssuers())); return list.toArray(new X509Certificate[list.size()]); } } }

Заключение

Мы рассмотрели как производить авторизацию по SSL с использованием клиентского сертификата. Полезная информация:

Certificate, Key, and Trust Services Tasks for iOS

Описание PKCS12
Creating .NET web service with client certificate authentication
Certificate Authentication in asp.net
Java 2-way TLS/SSL (Client Certificates) and PKCS12 vs JKS KeyStores Спасибо за внимание!

Источник: https://habr.com/post/194530/

Основы SSL

Ssl подключение сертификат клиентской аутентификации. Применение шифрования

SSL — семейство протоколов для установки шифрованного соединения между двумя сторонами, желающими обмениваться данными.

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

Симметричный ключ генерируется во время handshake и действует только для одной SSL сессии. Если сессия не остается активной, ключ устаревает (expire). Максимальное время после которого SSL сессия устаревает (expire) может быть задано. После устаревания сессии handshake должен быть повторен с начала. Результатом установки сессии является новый симметричный ключ.

Сертификаты и ключи

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

Асимметричное шифрование использует пары ключей для шифрования — приватный ключ и соответствующий ему публичный ключ. Данные зашифрованные одним ключом могут быть расшифрованы парным ключом. Аналогично данные подписанные одним ключом, могут быть проверены вторым ключом. Приватный ключ, как предполагает его имя, должен храниться в секрете.

Сертификаты

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

Также сертификат содержит цифровую подпись организации выдавшей сертификат (certificate authority CA). Цифровая подпись гарантирует, что сертификат не подделан.

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

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

В процессе установления SSL/TLS сессии, клиент создает часть сессионного ключа, шифрует сообщение с помощью публичного ключа сервера и передает на сервер.

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

Сертификаты бывают двух типов.

  • Официально выданные сертификаты, подписанные Certificate Authority организацией
  • Self-signed сертификаты

Self-signed сертификаты — сертификаты введенные для тестирования, чтобы разработчики, не дожидаясь получения официально-подписанного сертификата могли тестировать свое программное обеспечение.

Self-signed сертификат отличается тем, что подлинность его невозможно проверить, если только вы его не сделали лично или не получили на цифровом носителе из надежного источника. В остальном self-signed сертификаты точно такие, как и официальные.

Программно они могут использоваться точно также.

Доверие (Trust)

Ключевым понятием SSL соединения является концепция доверия (trust) сертификату. Важным является способ получения сертификата, используемого для соединения.

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

Однако при установке соединения из веб-браузера, к примеру, сертификат сервера может получаться с самого сервера, с которым вы устанавливаете соединение. Встает вопрос подлинности сертификата. Что если хакер создал его собственную пару асимметричных ключей и затем сделал собственный сертификат для подделки сервера банка?

Модель доверия, простая. Каждый клиент или сервер решает, что он доверяет определенным организациям (certificate authorities (CA)) выдающим сертификаты. Доверять CA, значит доверять что любые сертификаты выданные CA легальные и что идентифицирующая информация в сертификате корректна и заслуживает доверия.

Verisign — пример CA, подписывающий множество сертификатов для больших Internet компаний. Все браузеры верят Verisign по умолчанию. Идентификационная информация сертификата содержит цифровую подпись, сгенерированную CA. Клиент или сервер доверяет CA, добавляя сертификат в файл хранилище, называемый ‘truststore’.

Сохранение CA сертификата в truststore позволяет java проверять цифровую подпись сертификата сгенерированную CA и решить доверять сертификату или нет.

Если хакер подкладывает поддельный сертификат для Barclay’s банка, ваш браузер будет пытаться проверить цифровую подпись у сертификата. Эта проверка будет не успешной поскольку в truststore нет сертификата, которым подписан сертификат злоумышленника.

Certificate Chain

На практике формат сертификатов таков, что в сертификат может входить множество подписей. В сертификате хранится не одна подпись а некий «Certificate Chain»

Когда генерируются приватный и публичные ключи, для публичного ключа автоматически генерируется self-signed сертификат. Т.е. изначально вы получаете пару из приватного ключа и сертификата, содержащего подписанный публичный ключ. Self-signed certificate — такой сертификат, в котором создатель ключа и подписывающий является одним лицом.

Позже, после генерации Certificate Signing Request (CSR) и получения ответа от Certification Authority (CA), self-signed (самоподписанный) сертификат заменяется на цепочку сертификатов (Сertificate Chain). В цепочку добавляется сертификат от CA, подтверждающий подлинность публичного ключа, за ним сертификат, подтверждающий подлинность публичного ключа CA.

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

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

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

Рассмотрим SSL глубже. Бывает два вида SSL соединений.

Простая аутентификация (1 way SSL authentication)

Перед установкой шифрованного SSL/TLS соединения должна быть выполнена аутентификация. Чтобы простое соединение могло быть установлено, должен быть установлен сервер с закрытым ключом, для которого получен сертификат. Клиент также должен хранить список организаций СА, которым он доверяет.

imx_onewayssl.gif

Клиент проверяет подлинность сервера перед установкой шифрованного соединения.

2 way SSL authentication (двусторонняя аутентификация)

При таком типе аутентификации и сервер, и клиент, оба предоставляют сертификаты для проверки подлинности друг-друга перед установкой шифрованного соединения.

imx_twowaysslcacert.png

Проверка сертификата

При односторонней аутентификации (первый тип), сервер имеет сертификат с парным приватным ключом.

Данные зашифрованные с помощью публичного серверного ключа могут быть расшифрованы с помощью приватного ключа на сервере.

Клиент, желающий установить соединение с сервером, проверяет сертификат сервера прежде чем переходить к установке шифрованного соединения. Клиент должен проверить следующее:

  • Действителен ли по-прежнему сертификат (не завершился ли срок действия сертификата (expiry date passed))
  • Сертификат предоставленный сервером действительно соответствует его имени хоста.
  • Есть ли организация выдавшая сертификат CA в списке, которому клиент доверяет?
  • Проверить цифровую подпись на сертификате

Проверяются также другие мелкие детали, такие как алгоритм шифрования цифровой подписи, длины ключа и т.д.

При 2 стороней аутентификации клиент и сервер оба владеют приватными ключами и сертификатами. Оба проверяют сертификаты друг-друга, перед установкой шифрованного соединения. Клиент проделывает проверки описанные выше и сервер выполняет те же действия над клиентским сертификатом.

Запрос подписи и подписывание сертификатов

Создание ключей и сертификатов регламентируется стандартами.

Ключи генерируются в соответствии с PKCS (http://ru.wikipedia.org/wiki/PKCS).

Когда пара состоящая из публичного и приватного ключей сгенерирована, создается объект запроса на сертификат, называющийся Certificate Signing Request (CSR), регламентируемый стандартом PKCS#10. Trusted CA (certificate authority) должен затем решить хочет ли он подписать CSR, доверяет ли он запрашивающему регистрацию клиенту и предоставленной им информации в его сертификате.

Если CA (certificate authority) рещает доверять запросу на подпись сертификата (CSR), результатом становится выпуск подисанного сертификата с идентификационной информацией предоставленной в CSR. Сертификат регламентируется стандартом X.509.

Взято:https://dev64.wordpress.com/2013/06/12/ssl-basic/

Источник: https://javadev.ru/https/ssl-basics/

Ssl что это такое. Принципы шифрования сертификатом

Ssl подключение сертификат клиентской аутентификации. Применение шифрования

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

, если нет, то я вам об этом очень подробно расскажу на личных примерах, все как полагается, после этого вы уже будите более тонко понимать все рубежи безопасности, которые предоставляют нам SSL сертификаты, без них сейчас уже не возможно представить современный IT мир, с его банковскими переводами, электронной почтой smime или интернет магазинами.

Что такое SSL и TLS

Secure Socket Layer или ssl это, технология, призванная сделать доступ к сайтам более надежным и безопасным.

 Сертификат шифрования позволяет, надежно защитить трафик, передаваемый между браузером пользователя и веб ресурсом (сервером), к которому браузер обращается, все это происходит за счет протокола https.

Сделано, это все после того, как бурное развитие интернета привело к огромному количеству сайтов и ресурсов, которые требуют от пользователя ввод личных, персональных данных:

  • Пароли
  • Номера кредитных карт
  • Переписка

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

Разработкой технологии SSL выступила компания Netscape Communications, позднее она представила Transport Layer Security или проще TLS, это протокол основанный по спецификации SSL 3.0.

И Secure Socket Layer и Transport Layer Security призваны обеспечить передачу данных между двумя узлами по интернету.

SSL и TLS не имеют принципиальных различий в своей работе, могут даже быть использованы на одном сервере одновременно, делается это исключительно из соображений обеспечения работы новых устройств и браузеров, так и устаревших, где Transport Layer Security не поддерживается.

Если рассматривать современный интернет, то там в качестве сертификата безопасности сервера и шифрования используется TLS, просто знайте это

Для примера откройте сайт Яндекса, я это делаю в Google Chrome, там на против адресной строки есть значок замка, щелкаем по нему. Тут будет написано, что подключение к веб-сайту защищено и можно нажать подробнее.

сразу видим значок Secure TLS connection, как я и говорил, большая часть интернет ресурсов именно на этой технологии. Давайте посмотрим сам сертификат, для этого жмем View certificate.

В поле о сведениях о сертификате видим его предназначение:

  1. Обеспечивает получение идентификации от удаленного компьютера
  2. Подтверждает удаленному компьютеру идентификацию вашего компьютера
  3. 1.2.616.1.113527.2.5.1.10.2

История версий сертификатов шифрования

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

  • SSL 1.0 > данная версия в народ так и не попала, причины, возможно нашли его уязвимость
  • SSL 2.0 > эта версия ssl сертификата была представлена в 1995 году, на стыке тысячелетий, она так же была с кучей дыр безопасности, сподвигнувшие компанию Netscape Communications к работе над третье версией сертификата шифрования
  • SSL 3.0 > пришел на смену SSL 2.0 в 1996 году.  Стало это чудо развиваться и в 1999 году крупные компании Master Card и Visa купили коммерческую лицензию на его использование. Из 3.0 версии появился  TLS 1.0
  • TLS 1.0 > 99 год, выходит обновление SSL 3.0 под названием TLS 1.0, проходит еще семь лет, интернет развивается и хакеры не стоят на месте, выходит следующая версия.
  • TLS 1.1 > 04.2006  это его отправная точка, было исправлено несколько критичных ошибок обработки, а так же появилась защита от атак, где делался режим сцепления блоков шифротекста
  • TLS 1.2 > появился в августе 2008
  • TLS 1.3 > появится в конце 2016 года

Принцип работы TLS и SSL

Давайте разбираться как работает протоколы SSL и TLS. Начнем с основ, все сетевые устройства имеют четко прописанный алгоритм общения друг с другом, называется он OSI, который порезан на 7 уровней.

В ней есть транспортный уровень отвечающий за доставку данных, но так как модель OSI это некая утопия, то сейчас все работаю по упрощенной модели TCP/IP, из 4 уровней.

Стек TCP/IP, сейчас стандарт передачи данных в компьютерных сетях и он включает в себя, большое количество известных вам протоколов прикладного уровня:

Список можно продолжать очень долго, так их более 200 наименований. Ниже представлена схема сетевых уровней.

Ну и схема стека SSL/TLS, для наглядности.

Теперь все тоже самое простым языком, так как не всем понятны эти схемы и принцип работы ssl и tls не понятен. Когда вы открываете например мой блог pyatilistnik.

org, то вы обращаетесь по прикладному протоколу http, при обращении сервер видит вас и передает на ваш компьютер данные.

Если это представить схематично, то это будет простая матрешка, прикладной протокол http, кладется в стек tcp-ip.

Если бы на Pyatilistnik.org стоял бы сертификат шифрования TLS, то матрешка протоколов была бы посложнее и выглядела бы вот так. Тут прикладной протокол http, кладется в SSL/TLS, который в свою очередь кладется в стек TCP/IP.

Все тоже самое, но уже зашифровано, и если хакер перехватит эти данные по пути их передачи, то получит всего навсего цифровой мусор, а вот расшифровать данные может только та машина, которая устанавливала соединение с сайтом.

Этапы установки соединения SSL/TLS

  1. Клиент обращается к серверу, устанавливая с ним соединение, далее запрашивается защищенное подключение, тут два варианта, если вы изначально обращаетесь на порт 443, который предназначен для TLS/SSL соединения, или после того как вы установили обычное подключение, клиент делает дополнительный запрос на защищенное соединение.

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

    По умолчанию сервер будет стараться использовать самый современный алгоритм (SSLv3, TLSv1, TLSv1.1, TLSv1.2)

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

  4. Клиент проверяет ликвидность полученного сертификата от сервера, для этого он обращается к центру сертификации, который его выдавал, и спрашивает есть ли у тебя такой сертификат, если все нормально, можно продолжать.

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

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

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

  6. Все защищенный канал настроен и будет работать до тех пор, пока не будет разорвано соединение.

Вот еще одна красивая и наглядная схема создания защищенного канала.

Установка соединения SSL/TLS на уровне сетевых пакетов

На иллюстрации, черные стрелки показывают сообщения, которые отправляются открытым текстом, синие – это сообщения, подписанные открытым ключом, а зеленые – это сообщения, отправленные с помощью шифрования объёмных данных и того MAC, о которых стороны договорились в процессе переговоров.

Ну и подробно про каждый этап обмена сетевых сообщений протоколов SSL/TLS.

  • 1. ClientHello > пакет ClientHello делает предложение со списком поддерживаемых версий протоколов, поддерживаемые наборы шифров в порядке предпочтения и список алгоритмов сжатия (обычно NULL). Еще от клиента приходит случайное значение 32 байта, его содержимое указывает отметку текущего времени, его позже будут использовать для симметричного ключа и идентификатора сессии, который будет иметь значение ноль, при условии, что не было предыдущих сессий.
  • 2. ServerHello > пакет  ServerHello, отсылается сервером, в данном сообщении идет выбранный вариант, алгоритма шифрования и сжатия. Тут так же будет случайное значение 32 байта (отметка текущего времени), его также используют для симметричных ключей. Если ID текущей сессии в ServerHello имеет значение ноль, то создаст и вернёт идентификатор сессии.  Если в сообщении ClientHello был предложен идентификатор предыдущей сессии, известный данному серверу, то протокол рукопожатия будет проведён по упрощённой схеме. Если клиент предложил неизвестный серверу идентификатор сессии, сервер возвращает новый идентификатор сессии и протокол рукопожатия проводится по полной схеме.
  • 3.Certificate (3) > в данном пакете сервер отправляет клиенту свой открытый ключ (сертификат X.509), он совпадает с алгоритмом обмена ключами в выбранном наборе шифров. Вообще можно сказать в протоколе, запроси открытый ключ в DNS, запись типа KEY/TLSA RR. Как я писал выше этим ключом будет шифроваться сообщение.
  • 4. ServerHelloDone > Сервер говорит, что сессия установилось нормально.
  • 5. ClientKeyExchange > Следующим шагом идет отсылка клиентом ключа pre-master key, используя случайные числа (или отметки текущего времени) сервера и клиента. Данный ключ (pre-master key) как раз и шифруется открытым ключом сервера. Данное сообщение может расшифровать только сервер, с помощью закрытого ключа. Теперь оба участника вычисляют общий секретный ключ master key из ключа pre-master.
  • 6. ChangeCipherSpec — клиент > смысл пакета, указать на то, что теперь весь трафик, который идет от клиента, будет шифроваться, с помощью выбранного алгоритма шифрования объёмных данных и будет содержать MAC, вычисленный по выбранному алгоритму.
  • 7. Finished — клиент > Это сообщение содержит все сообщения, отправленные и полученные во время протокола рукопожатия, за исключением сообщения Finished. Оно шифруется с помощью алгоритма шифрования объемных данных и хэшируется с помощью алгоритма MAC, о которых договорились стороны. Если сервер может расшифровать и верифицировать это сообщение (содержащее все предыдущие сообщения), используя независимо вычисленный им сеансовый ключ, значит диалог был успешным. Если же нет, на этом месте сервер прерывает сессию и отправляет сообщение Alert с некоторой (возможно, неконкретной) информацией об ошибке
  • 8. ChangeCipherSpec — сервер > пакет, говорит, что теперь весь исходящий трафик с данного сервера, будет шифроваться.
  • 9.Finished — сервер >Это сообщение содержит все сообщения, отправленные и полученные во время протокола рукопожатия, за исключением сообщения Finished
  • 10. Record Protocol (протокол записи) > теперь все сообщения шифруются ssl сертификатом безопасности

Как получить ssl сертификат безопасности

Давайте теперь поймем где взять сертификат шифрования, или как получить ssl сертификат безопасности. Способов конечно несколько, есть как платные, так и бесплатные.

Бесплатный способ получить tls сертификат безопасности

Этот способ, подразумевает использование самоподписного сертификата (self-signed), его можно сгенерировать на любом веб-сервере с ролью IIS или Apache. Если рассматривать современные хостинги, то в панелях управления, таких как:

  • Directadmin
  • ISPmanager
  • Cpanel

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

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

Давайте смотреть как можно получить ssl сертификат безопасности, для этого формируется запрос на выпуск сертификата, называется он CSR запрос (Certificate Signing Request).

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

Напоминаю открытый ключ не является конфиденциальным, поэтому вставляется в CSR запрос. Вот пример Certificate Signing Request запроса.

Все эти не понятные данные легко можно интерпретировать специальными CSR Decoder сайтами.

Примеры двух сайтов CSR Decoder:

  • http://www.sslshopper.com/csr-decoder.html
  • http://certlogik.com/decoder/

Источник: http://pyatilistnik.org/ssl-chto-eto-takoe-printsipyi-shifrovaniya-sertifikatom/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.