- Что в tls 1.3?
- Basic constraints
- Capi и scvp
- Certificate verification: chain
- Generate ssl certificates with subject alt names
- How do i configure the subject alternative name (san) certificates in websphere application server?
- Intermediate certificate
- Ocsp stapling
- Policy
- Root certificate
- Session id
- Session ticket
- Tls-handshake full vs resumed
- Дополнительная защита
- Как всё это тестить?
- Маленький бонус
- Не отозван ли сертификат?
- Не протух ли сертификат?
- Ответ клиента
- Подпись
- Сertificate transparency
- Тот ли домен?
- Тот ли тип использования?
- Reinit
Что в tls 1.3?
Все упомянутые трудности решаются использованием TLS 1.3. Половины проблем вообще нет, всё проще, красивее, всё прям отличненько. Но TLS 1.3 еще распространен маловато. Самые важные отличия TLS 1.3 (их очень много, они везде, поэтому только самые важные):
- Плохие шифры удалены, остались только хорошие. Инициализировать сессию TLS 1.3 на плохих шифрах не получится. Всё дело в новых cipher suites: тут и другие алгоритмы обмена сеансовых ключей, и так называемый HMAC – не будем углубляться в подробности, потому что Патрик устал. Вкратце: раньше подпись каждого TLS-пакета шла отдельно. На это были атаки, потому что было известно, какой там контент находится. Сейчас ее запихали вовнутрь (режим AEAD), и в TLS 1.3 по-другому быть не может, соответственно, мы избавились от таких атак.
- Handshake стал короче – нет старых сообщений, нет старых расширений, нет возможности по каким-то странным штукам обменяться ключиками. То есть, он тупо короче количественно – даже самый полный TLS 1.3 handshake короче, чем в TLS 1.2.
- Переход на шифрованный канал происходит почти что сразу. Для этого используются разные ключики: да, пока не договорились о хороших ключиках, оптимальных, мы используем какие попало, но канал уже шифрованный. То есть hello – hello и пошло всё зашифрованное. Из-за этого сложнее всё это ломать.
- Всё регламентировано, больше не надо пытаться менять размеры пакетов, забивая их ноликами, чтобы сложнее было расшифровывать.
- Своя пара ключей на каждую сеансовую фазу. Сеансовые ключи меняются: пока мы ни о чем не договорились – они такие, договорились о более крутых – они более крутые, сертификаты проверили и всё хорошо – еще другие ключи. В итоге их много, они усложняются и очень трудно это всё поломать. Еще одна важная вещь, почему это быстрее: Early Data (она же 0-RTT, Zero Round Trip Time) – это когда у тебя в TLS-handshake посылается полезная инфа – ну например GET-запрос. То есть нет такого, что поговорили-поговорили и только потом посылаем что-то отдельным потоком. Сразу же в handshake идет запрос. Как только сервер его получил, он начинает его обрабатывать, отдает клиенту свои данные, сертификат и пока клиент проверяет, сервер уже готов отдать. И может даже в TLS-handshake и отдать иногда.
- Есть pre-shared key, то есть клиент с сервером могут договориться и сохранить сеансовые ключи для последующих соединений. И, соответственно, когда происходит handshake таких вот договорившихся клиентов, на этап выбора ключей время не тратится. Долго объяснять, как это сделано криптографически, но тех атак, которые были на Session ID, вот в этом месте сейчас нет (что хорошо). Всё стало безопаснее и быстрее.
Основная проблема, что поддержка TLS 1.3 – она во всех браузерах, которые актуальны, есть, но не во всех по дефолту включена. Например, в Safari нет (но там очень легко включить), Google Chrome и Mozilla Firefox уже по дефолту поддерживают TLS 1.3. Ngnix с TLS 1.3 – без проблем, в Apache есть нюансы, а вот с почтовыми клиентами хуже — там только Exim молодец, а остальные не очень.
В общем, это наше будущее, там всё получше и попроще, самое главное. Но пока оно еще не везде наступило.
Basic constraints
Еще одна штука, которая улучшает секьюрити (и с этим были серьезные баги до 2003 года в Internet Explorer): в промежуточных сертификатах в поле Basic Constraints должно быть написано
CA: true
, что означает, что этим сертификатам разрешено подписывать конечные сертификаты. Если этой штуки нет, то клиент при проверке цепочки должен сказать: «я не могу принять этот промежуточный сертификат» – несмотря на то, что все подписи совпадают, в субъекте всё совпадает и т.д.
Еще раз, если кто не понял: если эту штуку не проверять, я могу получить сертификат от Let’s Encrypt и потом этим сертификатом подписывать что угодно. И цепочка будет валидная.
Capi и scvp
Еще про верификацию и про цепочку. Есть маленькая особенность – похвалим здесь Windows. Если сервер не отдал сертификат, в обычном (традиционном) подходе сертификат нам взять неоткуда, цепочки нет, всё сломалось. Так вот, в Windows есть такая штука как Certificate API, и она может достроить цепочку, взяв промежуточные сертификаты из своего хранилища.
Как эти сертификаты туда попадают? Либо залиты в хранилище, либо из сертификата, установленного на сервере. Например, в Plesk, если получить сертификат от Comodo и поставить его на домен – в хранилище попадет промежуточный сертификат от Comodo.
Ну и еще люди, которым Windows нравится, придумали SCVP (Server-based Certificate Validation Protocol). В действительности не работает почти ни у кого и нигде – в смысле глобально и массово, — но как концепция есть. Более того, есть продукты, которые это делают, и даже в каких-то сетях это может быть настроено.
Это сервис, который за тебя эту цепочку строит и частично даже проверяет, что удобно. Если там заявлена поддержка DPV (Delegated Path Validation), то он цепочку еще и провалидирует. То есть, клиенту надо этому сервису отправить сертификат и получить ответ – продолжать сессию или рвать.
Предположительно это могло бы всё ускорить, но из-за того, что сервису тоже надо как-то доверять, идея глохнет. И всё-таки она была.
Итак, вот у нас получается такая вот цепочка.
Прежде всего мы проверяем, что с подписями у нас всё нормально: выстраиваем цепочку, проверяем подписи – и считаем, что содержимое сертификатов верно. Дальше нам надо проверить конечный сертификат. Промежуточный нам проверять не надо, потому что мы идем к Патрику и проверить нам надо только самый последний сертификат.
Давайте проверять.
Certificate verification: chain
Возможно, вы обратили внимание на формулировку: посылается не сертификат, а
сертификаты
– сейчас станет понятно, почему (в общем-то, догадаться нетрудно).
Сертификат подписывается ишьюером – тем человеком, который этот сертификат выписал. Для того, чтобы считать этот сертификат правильным и все данные в нем верными, мы должны доверять этому ишьюеру – то есть верить, что он всякую фигню не подписывает. Чтобы вся эта система работала, придумали такую концепцию как корневой сертификат (root certificate).
Generate ssl certificates with subject alt names
Open ssl.conf
in a text editor.
Edit the domain(s) listed under the [alt_names]
section so that they match the local domain name you want to use for your project, e.g.
DNS.1 = my-project.dev
Additional FQDNs can be added if required:
DNS.1 = my-project.dev
DNS.2 = www.my-project.dev
DNS.3 = fr.my-project.dev
Create a directory for your project, e.g. my_project
and save ssl.conf
inside it.
Open Terminal and navigate to ‘my_project’:
cd my_project
Generate a private key:
openssl genrsa -out private.key 4096
Generate a Certificate Signing Request
openssl req -new -sha256
-out private.csr
-key private.key
-config ssl.conf
(You will be asked a series of questions about your certificate. Answer however you like, but for ‘Common name’ enter the name of your project, e.g. my_project
)
Now check the CSR:
openssl req -text -noout -in private.csr
You should see this:
X509v3 Subject Alternative Name: DNS:my-project.site
and
Signature Algorithm: sha256WithRSAEncryption
Generate the certificate
openssl x509 -req
-sha256
-days 3650
-in private.csr
-signkey private.key
-out private.crt
-extensions req_ext
-extfile ssl.conf
Add the certificate to keychain and trust it:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain private.crt
(Alternatively, double click on the certificate file private.crt
to open Keychain Access. Your project name my_project
will be listed under the login keychain. Double click it and select ‘Always trust’ under the ‘Trust’ section.)
If you are using MAMP Pro, add (or edit) a host with the server name you listed under the [alt_names]
section of your ssl.conf. On the SSL tab select the Certificate file and Certificate key that you just generated.
Save changes and restart Apache.
How do i configure the subject alternative name (san) certificates in websphere application server?
Step 1: Backing up WebSphere Application Server Config or Entire WAS Profile
Before following steps, please take backup by running backupConfig on dmgr more detail check the following link
IBM Knowledge Center – backupConfig command
https://www.my-sertif.ru/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/rxml_backupconfig.html
WAS has backupConfig command which will backup entire config directory
Tells the backupConfig command not to stop the servers before backing up the configuration
Example command
cd to was profile path (WAS_INSTALL_HOME>/profiles/<PROFILE_NAME>/bin)
backupConfig.bat -nostop
Backing up WebSphere Application Server Entire profiles
Open the command prompt. Browse to the WAS_INSTALL_HOME>/bin directory. For example, you can type the following: cd WAS_INSTALL_HOME>/bin
Use the WebSphere Application Server manageprofiles command with the backupProfile parameter.manageprofiles.bat -backupProfile -profileName -backupFile
For example:
Stand-alone Env:
manageprofiles.bat -backupProfile -profileName AppSrv01 -backupFile c:backupAppSrv01yymmdd.zip
Network deployment Env:
manageprofiles.bat -backupProfile -profileName Dmgr01 -backupFile c:backupDmgr01yymmdd.zip
YouTube link How do I run the backupConfig and restoreConfig scripts in WebSphere Application Server?
https://www.youtube.com/watch?v=EXAfSx1gVwc
Step 2: How to generate a CSR with Subject Alternative Name (SAN) for IBM WebSphere Default KeyStore
Note: A Personal certificate request places a valid self-signed certificate in the KeyStore. This placeholder certificate is later replaced with the certificate that the Certificate Authority signs and returns. You must have a default certificate assigned to the SSL configuration. If a default certificate is not assigned, when multiple personal certificates exist in a KeyStore and no default certificate is selected, the selection of a certificate within the SSL configuration KeyStore is random, which might cause SSL handshake errors.
WAS Admin console doesn’t have feature to generate a CSR with Subject Alternative Name (SAN) Therefore we need to use WAS ikeyman tool to generate a CSR with Subject Alternative Name (SAN) for IBM WebSphere Default KeyStore (WAS Default KeyStore for the Node is NodeDefaultKeystore –> WAS_INSTALL_HOME>/profiles/<NodePROFILE_NAME>/config/cells/cell_name/nodes/node_name/key.p12)
Perform the following steps using IBM WebSphere ikeyman tool.
Start the key management utility (iKeyman) from WAS_INSTALL_HOME>/profiles/<PROFILE_NAME>/bin
IBM Key Management interface will start after running the command
1. Start iKeyman. ( Example C:WASv8.5profilesAppSrv01bin>ikeyman.bat )
2. From the IBM Key Management window, Select for the Key database type (Available format JKS, PCSK12, CMS. Etc) > click Key Database File > Open.
specify the file name and location of the key database (Example WAS_INSTALL_HOME>/profiles/<NodePROFILE_NAME>/config/cells/cell_name/nodes/node_name/key.p12) from which you want to generate the CSR. Click on the browse button to locate & select the KeyStore. Then click, OK.
3. Type the current key database password in the Password Prompt window and click OK. The key database contents are shown in the IBM Key Management window.
4. In the middle of the IKEYMAN GUI, you will see a section called “Key database content.”
Click on the “down arrow” to the right to display a list of three choices
Select “Personal Certificate Requests” and From the Personal Certificate Requests section, click New
5. Fill out the required information as per your environment requirement.
Key Label is the name used to identify the certificate in the KeyStore database.
NOTE: Using the site name (for example, www.my-sertif.ru or servername.my-sertif.ru) as the label is a good practice.
In the Key Size list, select a key length for the certificate. The key size determines the strength of the encryption. Key Size must be at least 2048 bits (Depend on your requirement)
From the Signature Algorithm list, select an algorithm to apply to the certificate Example Sha256 (Depend on your requirement)
Common Name (CN): The Common Name is the Host Domain Name. This value is the CN value in the certificate distinguished name (DN). (for example, www.my-sertif.ru or servername.my-sertif.ru or wildcard *.my-sertif.ru)
Note: If you want to get wildcard certificates, then the Common Name should be in the format example: *.my-sertif.ru, For example, you have the multiple servers with server1.my-sertif.ru, server2.my-sertif.ru, and server3.my-sertif.ru or anything.my-sertif.ru in this case Wildcards will secure any first-level subdomain of the domain
Depend on your requirement fill out the remaining information
Organization field, organization value in the certificate distinguished name.
organization Unit field, type the organization unit portion of the distinguished name.
locality Name stateName country
In the Subject Alternative Names section, the DNS Name field, all entries of the domains separated each with comma. Where it can contain multiple FQDNs examples server1.my-sertif.ru, server2.my-sertif.ru.etc, this setting allows for multiple domains to be used in SSL certificates.
Subject Alternate Name (SAN) extensions are fields in a certificate request that inform SSL Clients of alternate hostnames that correspond to the signed certificate. Normal certificates (issued without a wildcard string in their Distinguished Name) are only valid for a single hostname. For example, a certificate created for my-sertif.ru is not valid on www.my-sertif.ru unless a Subject Alternate Name of “www.my-sertif.ru” or is added to the certificate.
Note: The request functions as a temporary placeholder for the signed certificate until you manually receive the certificate in the KeyStore.
Note: You need to follow the instructions to submit your Certificate Signing Request file to an appropriate Certification Authority. Please check with your CA vendor
Step 3: Adding CA Intermediate and Root Certificates to the WAS KeyStore and Truststore
On the administrative console page, Add the CA Root certificate into WAS Nodedefaultkeystore and Nodedefaultruststore
1. Click Security > SSL certificate and key management > Key stores and certificates > keystore ( Nodedefaulttruststore & NodedefaultKeystore > Signer certificates > Add.
2. Enter an alias for the signer certificate in the Alias field
3. Enter the full path to the signer certificate file in the File name field.
4. Select a data type from the list in the Data type field. Example Base64.
Alias. Enter the name used to identify the Root CA certificate in the keystore. Filename. Enter the full path to the Root CA certificate. Data type. Select Base64-encoded ASCII data from the list.
5. Click Apply and Save the changes.
Step 4: Receive the certificate issued by Certificate Authority into WAS KeyStore (NodeDefaultKeystore)
Note: These steps are the same for any WAS keystore ( CellDefaultKeystore or NodeDefaultKeystore)
1. Start iKeyman. (Example C:WASv8.5profilesAppSrv01bin>ikeyman.bat)
2. From the IBM Key Management window, Select for the Key database type (Available format JKS, PCSK12, CMS. Etc) > click Key Database File > Open.
specify the file name and location of the key database (Example WAS_INSTALL_HOME>/profiles/<NodePROFILE_NAME>/config/cells/cell_name/nodes/node_name/key.p12) from which you want to generate the CSR. Click on the browse button to locate & select the KeyStore. Then click, OK.
Type the current key database password in the Password Prompt window and click OK. The key database contents are shown in the IBM Key Management window
3. Click Personal Certificates in the Key Database content frame, then click Receive.
4. Select the Receive button. You are prompted for the location of the signed certificate and Enter the location of the signed certificate
Certificate filename
Specify the name of the certificate file, typically in .arm format, or another acceptable format such as .cer or another format .p7b or another format .der, etc.
5. Click OK. You will see the new certificate displays under the personal certificate section
Step 5: Replace the default certificate with the CA certificate
Note: Once you received the CA certificate using ikeyman. You will see two certificates under NodeDefaultKeyStore
1. Click Security > SSL certificate and key management > Key stores and certificates > NodeDefaultKeyStore.
2. Under Additional Properties, click Personal certificates.
3. Select the certificate to be replaced. The alias list must include the certificate to be replaced and the certificate to replace it with.
4. Click Replace.
5. Select a replacement certificate alias from the list.
You can delete one of the following types of certificates:
6. Select Delete old certificate to remove the existing or expired certificate.
7. Click Apply and Save.
Your results depend on what you selected:
==> If you selected Delete old certificate, the new certificate alias replaces all of the references to the certificate alias in the configuration.
==> If the new certificate alias replaces the existing alias, the WebSphere Application Server runtime checks to make sure that:
All of the SSL Configurations objects reference the certificate o The Dynamic SSL Configuration Selections objects, and the SSL Configuration group objects reference the certificate.
==> If you selected Delete old certificate, the existing certificate will be deleted.
Step 6: Adding CA Intermediate and Root Certificates to the dmgr & node (unmanaged Truststore — profile_root/etc/trust.p12) by retrieveSigners command
Note: Each profile has both an unmanaged keystore (profile_root/etc/key.p12) and an unmanaged trustore (profile_root/etc/trust.p12) which are used by clients connecting to WAS from outside of the WAS JVM, such as wsadmin, serverStatus, stopServer, syncNode, backupConfig and other WAS scripts. These keystores and truststores are outside of WAS configuration directory (profile_root/config/cells/cell name) and thus cannot be managed in the WAS admin console by default
Using this retrieveSigners command, you can extract the signer to a file.
For DMGR
cd WAS_INSTALL_HOME>/profiles/<DMGRPROFILE_NAME>/bin and execute the following command.
retrieveSigners CellDefaultTrustStore ClientDefaultTrustStore
It will attempt to add all Signer certificate from CellDefaultTrustStore (WAS_INSTALL_HOME>/profiles/<DMGRPROFILE_NAME>/config/cells/cell_name/trust.p12 ) to ClientDefaultTrustStore (WAS_INSTALL_HOME>/profiles/<DMGRPROFILE_NAME>/etc/trust.p12). If you have any one singer already existing in etc/trust.p12, then you will see this message in the output CWPKI0309I: All signers from remote keystore already exist in local keystore.
For NODE
cd WAS_INSTALL_HOME>/profiles/<PROFILE_NAME>/bin and execute the following command.
retrieveSigners NodeDefaultTrustStore ClientDefaultTrustStore
It will attempt to add all Signer certificate from NodeDefaultTrustStore (WAS_INSTALL_HOME>/profiles/<PROFILE_NAME>/config/cells/cell_name/nodes/Nodename/trust.p12 ) to ClientDefaultTrustStore (WAS_INSTALL_HOME>/profiles/<PROFILE_NAME>/etc/trust.p12). If you have any one singer already existing in etc/trust.p12, then you will see this message in the output CWPKI0309I: All signers from remote keystore already exist in local keystore.
More details please check the following infocenter link
https://www.my-sertif.ru/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/rxml_retrievesigners.html
Step 7: How to verify the WAS using CA certificate with Subject Alternative Name (SAN)
Using Internet Explorer or Chrome, you can view the certificate. Example
https://Appserverhostname:9044/yourappcontext (Application example)
You will see the certificate in the browser.
Intermediate certificate
Следующий в цепочке – Intermediate Certificate. Зачем он нужен? Дело в том, что в случае, если с Root CA Certificate что-то пошло не так, очень сложно его поменять. Центру сертификации нужно сделать новый приватный ключ, новый публичный ключ, всем это всё нужно обновить и так далее, это утомительно и это ломает всю секьюрити.
И вообще, чем меньше мы работаем с машиной, на которой находится этот CA, тем меньше шансов, что этот приватный ключ украдут. Поэтому CA выписывают промежуточные сертификаты и уже с их помощью подписывают конечные (end-entity) сертификаты для вашего домена.
Такая цепочка происходит очень часто и сертификат для нашего Патрика может быть подписан Губкой Бобом, а сертификат Губки Боба – Мистером Крабсом (а Губка Боб работает на мистера Крабса, как мы знаем из мультика). То есть это, в принципе, может быть вообще одна организация.
Для того, чтобы всё это провалидировать, клиенту нужно всю эту цепочку составить и проверить: взять ключик рутового сертификата, проверить, что промежуточный правильный и подпись валидна, потом взять ключик промежуточного сертификата и проверить конечный сертификат.
Цепочка должна присутствовать в списке сертификатов, которые сервер отсылает. По факту бывает всякое. Бывает, что не посылаются. Symantec, например, очень любил в бесплатные сертификаты не вставлять промежуточный. И поэтому в браузерах ничего не работало.
На самом деле, для большей производительности, поиск производится не по ишьюеру и субъекту, а с помощью расширений (extensions) – там вся эта информация лежит в виде хэшей, поэтому всё происходит быстрее. Но иногда хэшей нет, тогда происходит поиск по текстовым полям субъекта и ишьюера, и вот здесь могут случаться атаки.
Поэтому если вы видите сертификат, в котором этих полей нет, можно возбудиться и что-нибудь покопать – возможно, там всё не очень хорошо.
Ocsp stapling
Это примерно в ту же степь, но тут мы уже начинаем уходить от структуры Certificate Authority. То есть возлагаем эту проверку на сервер. Как это работает: сервер периодически ходит по этому OSCP URL-у и говорит: «OCSP-resolver, посмотри-ка, вот этот мой сертификат – в отозванных или нет?».
OCSP-resolver отвечает подписанным ответом, наш сервер его запоминает, и когда клиент приходит, ему отдаётся этот ответ. То есть у клиента есть подписанный ответ и в нём написано, что всё хорошо. Из-за того, что серверов меньше, чем клиентов и сервер может на какое-то время это кэшировать, нагрузка на всех становится меньше.
Тут есть тоже некоторые проблемы: текущий механизм — это только на один сертификат, а у нас цепочка (и это важно). А еще, из-за того, что мой сервер отвечать на это не обязан, клиент не может рассчитывать на то, что OSCP-stapling точно будет. И поэтому отказаться ни от CRL, ни от OCSP не получается – просто потому, что серверы не обязаны опрашивать и отвечать. Ну и еще один аспект: если в вебе с этим нормально, то в почте всё плохо, а в FTP даже слов таких не знают.
Проблема того, что сервер не обязан отвечать, может решиться добавлением в сертификат еще одного поля – так как оно еще не утряслось, у него просто номер, — в котором мы говорим клиенту, что сервер таки обязан ответить, и если он не ответил, считать этот сертификат невалидным.
Вот это всё вместе теоретически может начать работать, но пока еще мало распространено.
Google и Mozilla, так как им всё это не нравится, сделали свой CRL. И зашили его в браузер. Огонь вообще! Это работает быстро, ну и на этом все плюсы заканчиваются. Для того чтобы не помереть, они не запихивают в него DV-сертификаты. То есть если DV-сертификат отозван, они считают – ну и ладно.
Так что если DV-сертификат отозван и при этом нет OSCP-степлинга, Chrome об этом не скажет – он посчитает этот сертификат нормальным. На самом деле, правильно пользоваться OSCP-степлингом иOCSP Must Staple флагом в сертификате.
Policy
Как мы уже знаем, если браузер смотрит в это поле и находит там определенные сочетания циферок и буковок, то он должен понять, что это EV-сертификат и, возможно надо сделать дополнительные вещи. Вот тут у нас указан Global Sign Repository – и иногда браузер должен сходить по указанному там адресу и получить ответ, что всё хорошо.
Root certificate
В принципе, это даже не обязательно должен был быть сертификат – вполне хватило бы просто пары ключей. Потому что единственное, что нам от него надо – это знать, что такому-то центру сертификации (Certificate Authority, CA) соответствует такой-то публичный ключ.
Откуда появляется вера в центры сертификации как в «хороших парней»? Все просто договорились, что вот таким-то организациям можно доверять. У каждого клиента есть список соответствия CA и публичного ключа. Таким образом, каждый клиент знает, что есть вот такой чувак и ключ для него такой. И так это всё и проверяется. То есть – просто записано, просто договорились, что верим.
Session id
До TLS 1.3 для решения этой проблемы использовались укороченные сессии. Когда сервер отвечает клиенту, он отдает ему Session ID. Если у клиента этот Session ID тоже есть, он отсылает его серверу и вот эта часть, которая в рамочке, пропускается. Потому что сервер запоминает контекст всей этой штуки и продолжает так, как будто это уже произошло.
Сессионный ключ выбран, и клиенту не надо проверять сертификат, потому что он есть в этом сессионном ключе. Если окажется, что сертификат там какой-то другой, то выбранный сессионный ключ не будет работать и клиент просто не сможет расшифровать сообщение сервера.
Так это всё работает. Это побыстрее, но тоже есть проблемы, — возрастает нагрузка на сервер, ну и есть атаки с перехватом Session ID. Потому что этот Session ID идет по открытому каналу.
Session ticket
Еще для ускорения можно использовать Session Ticket — это в принципе то же самое, что и Session ID, только передается зашифрованный контекст, а не циферка, которую можно украсть. Бывает, что сессию установить не удалось, тогда придет алерт. С ними тоже связаны атаки на TLS, потому что алерты имеют определенную структуру и определенный размер.
Если алерт произошел на этапе, когда уже трафик идет зашифрованным, то из-за того, что алерт понятной структуры и злоумышленник может знать, что ему в этом алерте отвечают – задача расшифровывания становится сильно проще. Поэтому в TLS 1.3 это уже не используется.
Tls-handshake full vs resumed
В этой статье мы не стали подробно останавливаться на том, как выбираются сессионные ключи. Там тоже много работы на процессоре, много вычислительных действий – и следующая проблема после безопасности это производительность. Всё это происходит медленно, особенно, если ходить в CRL списки и делать прочие дополнительные проверки. А если еще цепочка сертификатов огромная, то всё может быть прям совсем медленно, и с этим надо что-то делать.
Дополнительная защита
Вся структура TLS является уязвимой в одной точке – точке доверия, то есть вот эти вот сертификационные центры, рутовые сертификаты — если с ними что-то не то, всё разлетелось. Есть по сути две попытки с этим как-то бороться.
Как всё это тестить?
Инструментов для тестирования много, большинство из них не очень, вот эти плюс-минус ничего:
Маленький бонус
То, что не влезло.
На картинку тоже не всё влезло – тема очень большая, но на практике можно фокусироваться таким образом, чтобы на любом уровне понимать идею в целом и смочь разгрести что происходит, понять, что вам нужно доучить, что сейчас конкретно нужно узнать и всё вот это.
Эта картинка — про ключевые слова. Из литературы можно рекомендовать очень крутую статью на русском языке «Ключи, шифры, сообщения: как работает TLS» – прочитать целиком вряд ли удастся, но в качестве справочника пригодится. Открыл, нашел что надо, почитал, ключевые слова узнал, пошел в википедию и на английском прочитал (на русском почему-то плохо написано).
На английском написано отлично: идея, зачем, почему, ссылочки. Не знаешь, что такое HSTS – иди в википедию, там будет ссылочки на статьи для Патриков, то есть чайников. Еще на RFC, но это читать невозможно. Общий смысл станет понятен даже из самой статьи в Википедии.
Вот и всё! Вы молодцы 🙂
Не отозван ли сертификат?
Самая интересная вещь – мы дошли до нее, ура! Самая прикольная, самая неработающая 🙂
Если говорить кратко, то сейчас здесь во всей инфраструктуре TLS очень большие проблемы, потому что: не работает ничего. И эту проблему как раз и хотят решать тем, чтобы срок действия сертификата сделать очень маленьким. Когда нужно отзывать сертификат?
Чаще всего – когда ваш приватный ключ утек. Ваш приватный ключ утек – вы попали. Надо сертификат отозвать, потому что если не отозвать, тот кто украл ваш ключ, сможет подсовывать клиентам ваш сертификат и представляться вами. Надо сказать: чуваки, я поменял свой ключ – тот сертификат не действителен!
Если сделать время действия сертификата очень маленьким, то в принципе можно не отзывать, а подождать, когда он кончится. Отсюда все эти экстремальные предложения с минутами и часами. Ну, а если у тебя сертификат на 3 года, а ключ украли на второй день – то три года кто-то сможет представляться тобой.
Как же проверить, отозван сертификат или нет?
Не протух ли сертификат?
После этого нам надо проверить, что сертификат не протух – это логично, ведь сертификаты выдаются на какое-то время.
Сейчас все certificate Authority договорились, что максимальный срок – 2 года (раньше было 3). Еще дальше они хотят сделать 1 год, а некоторые радикалы хотят, чтобы был месяц. Let’s Encrypt сейчас на 3 месяца выдает. А совсем радикальные радикалы хотят на каждое соединение новый сертификат выписывать.
Ответ клиента
Итак, Патрик проверил сертификаты и начинает отвечать Губке Бобу.
Если у клиента просили сертификаты, он их отдает. Дальше он отдает информацию для того, чтобы сделать ключики – так же, как сервер, clientKeyExchange. Поле CertificateVerify – неинтересная инфа на тему «как валидировать сертификат», в TLS 1.3 она и выглядит-то уже по-другому, потому что не сильно нужна.
После этого клиент переходит на шифрованный канал и посылает сообщение Finished – «я готов к шифрованному каналу». Сервер проверяет это сообщение – что там всё нормально, как договорились, что оно расшифровывается, что не успели на данном этапе ничего подменить и это всё еще Патрик, — тоже переходит на шифрованный канал и отдает свое Finished-сообщение, которое в свою очередь проверяет клиент. И после этого идет общение уже данными приложений по шифрованному каналу.
Подпись
Про подпись уже упоминалось. Это вот пример, как это может выглядеть структурно: вот есть подпись, вот алгоритм этой подписи, мы берем какую-нибудь библиотечку, которая умеет с этим работать и проверяем, что тело сертификата подписано вот этой подписью и что всё действительно хорошо.
Дальше мы из этого сертификата достаем следующие поля и начинаем проверять их. Вы видите, что ишьюер у нас – Global Sign, мы взяли его ключик и проверили, что подпись работает.
Сertificate transparency
Итак, всё хорошо, но Google не был бы Google, если бы не придумал еще одну технологию конкретно для себя. Она называется Сertificate Transparency. Откуда что идет: Google очень беспокоится о том, чтобы кто-нибудь не выписал плохой сертификат на него самого – чтобы именно Google не пострадал от того, что кто-то там выписывает какие-то нехорошие сертификаты.
И вот с помощью Сertificate Transparency каждый владелец домена (и вообще кто угодно) может посмотреть, какие сертификаты на этот домен были выписаны. Дальше он может этот сертификат взять и с ним что-нибудь сделать. Например, проверить, хороший он или нет. Ну и возбудиться (или не возбудиться).
Это не только технология, но и набор процессов. То есть Google говорит: ребята, вот у нас есть Сertificate Transparency, мы в него записываем только нормальные сертификаты – такие, где цепочка есть, цепочка правильная и всё нормально. Мы можем время записи Сertificate Transparency Log запихать в сертификат, чтобы клиент мог четче посмотреть, что вот этот сертификат в Transparency Log должен быть тогда-то.
Мы гарантируем, что это вот эта штука не редактируема обратно (из-за того, что блокчейн) – ну то есть нельзя взять и подменить старые записи, можно только добавлять новые. И давайте, ребята, кто-нибудь из вас будет периодически ходить по этому логу, и проверять, что там всё нормально, а если что-то не так, говорить нам и мы будем это править. А другие ребята пусть держат у себя всё это, потому что надо, чтобы было много мощностей на вот эту вот штуку.
Тот ли домен?
Тут всё понятно: если домен Wikipedia, а сертификат выписан на домен Plesk, то что происходит вообще? Кажется очевидным и капитанистым, но было несколько багов, когда клиенты это не проверяли. Сейчас, по счастью, такого бардака уже нет и стараются проверять все. Но опять-таки есть нюанс. Это SAN – Subject Alternative Name.
Тот ли тип использования?
Кроме проверки, тот ли это домен, не истёк ли срок годности и валидна ли подпись, из таких вещей, которые достаточно просто делаются, у нас еще есть пункт «тот ли тип использования».
Сертификаты бывают разные. То есть, если в Key Usage не указаны вот эти вот два параметра, то это – по идее! – должно влиять на то, как клиент с этим работает.
Key agreement – это как раз когда мы выписываем сеансовые ключи и договариваемся о них. Обычно вся эта коммуникация подписывается или шифруется вот этим вот публичным ключом, который чуть выше. Но если в key usage не прописан key agreement, то это означает, что ишьюер этого сертификата запрещает использовать этот сертификат для вот этого назначения.
Сейчас на практике это почти не встречается, то есть эти вещи у большинства сертификатов одинаковые, но тем не менее — в принципе могут быть и другие. И бывает, что сертификат НЕ подходит для чего-то. Для чего он подходит – написано здесь. Клиент должен это проверять.
Reinit
Что еще бывает в TLS-handshake в принципе? Иногда серверу бывает нужно инициализировать сессию повторно – чаще всего тогда, когда сертификат клиента был не нужен и вдруг стал нужен. Тогда сервер говорит: давай перезапустим. Ну и клиент может сказать еще раз Client Hello. В TLS 1.3 это тоже убрали, потому что тоже были атаки – атаки были везде!