Един от най-честите термини, които повечето програмисти намират за объркващи, е „ключове“. Повечето хора не разбират важността и възможностите, които притежават хранилищата за ключове. За да разберем важността на хранилищата за ключове и как WSO2 IS използва хранилища за ключове, първо трябва да добием представа защо се нуждаем от „хранилища за ключове“. За да започнем да го изучаваме, първо трябва да разберем какво е криптиране и декриптиране.

Какво представляват криптирането и декриптирането?

Един от най-важните аспекти на всяко приложение е, че трябва да има процедура за криптиране и декриптиране на данни. За да разберем ролята на хранилището за ключове в процеса на криптиране, първо трябва да разберем какво е криптиране.

Най-просто казано, криптирането означава използване на малко математика и набор от инструкции за маскиране и защита на данните. Тази математика и инструкции превръщат думите от обикновен текст в неразбираем текст, известен като шифрован текст. За да разкрием шифрования текст и да видим обикновения текст, трябва да го дешифрираме.

Има два основни вида криптиране.

  • Симетрично криптиране – Тук използваме един и същ ключ за криптиране и декриптиране на данни.
  • Асиметрично криптиране – Тук използваме два отделни ключа за криптиране и декриптиране на данни.

Сега нека добием представа за асиметричното криптиране, тъй като е от съществено значение за хранилищата за ключове.

Асиметрично криптиране

Асиметричното криптиране е начин, който използва публични и частни ключове за криптиране и декриптиране на данни. При асиметрично криптиране публичният ключ се споделя с външни страни, докато частният ключ се пази в тайна.

Когато публичният ключ криптира данните, съответният частен ключ ги декриптира. Ето защо това е известно още като криптиране с публичен ключ и криптография с публичен ключ.

Асиметричното криптиране е начин за проверка на трети страни, които никога не сте срещали, чрез обществени канали, които са несигурни. За да дадем пример, вие използвате асиметрично криптиране в момента, докато четете тази статия. Виждате ли, че във вашия URL има икона на защитно катинарче или HTTPS? И двете показват, че сте се свързали с уебсайт, който използва сертификат SSL/TLS (Secure Socket Layer/Transport Layer Security) сертификат и защитения TLS протокол. Това всъщност е известно като SSL/TLS процес на ръкостискане. Стъпките на SSL/TLS ръкостисканията са,

  • Съобщението „здравей на клиента“ — Клиентът инициира ръкостискането, като изпрати съобщение „здравей“ до сървъра. Това ще включва TLS версията, която клиентът поддържа, поддържаните пакети за шифроване и поредица от произволни байтове, известни като „клиентски произволни“ — пакетът за шифроване е набор от алгоритми за криптиране за използване при установяване на защитена комуникационна връзка. Те обикновено имат алгоритъм за обмен на ключове, алгоритъм за групово шифроване и алгоритъм за код за удостоверяване на съобщения.
  • Съобщението „здравей на сървъра“ — В отговор на съобщението „здравей“ на клиента, сървърът изпраща съобщение, съдържащо SSL сертификата на сървъра, избрания от сървъра пакет за шифроване и „произволния сървър“, друг случаен низ от байтове, генериран от сървърът.
  • Удостоверяване — Клиентът проверява SSL сертификата на сървъра със сертифициращия орган (CA), който го е издал.
  • The premaster secret — Клиентът изпраща още един произволен низ от байтове, „premaster secret“. Premaster тайната е шифрована с публичния ключ и може да бъде декриптирана само с частния ключ от сървъра (Клиентът получава публичния ключ от SSL сертификата на сървъра)
  • Използва се частният ключ — Сървърът дешифрира предварителния секрет.
  • Създадени сесийни ключове — И клиентът, и сървърът генерират сесийни ключове от случайни клиентски, произволни сървърни и премастер секрет.
  • Клиентът е готов — Клиентът изпраща „завършено“ съобщение, което е криптирано със сесиен ключ.
  • Сървърът е готов— Сървърът изпраща „завършено“ съобщение, криптирано със сесиен ключ.
  • Постигнато сигурно симетрично криптиране — Ръкостискането е завършено и комуникацията продължава с помощта на сесийните ключове.

Въпреки че теорията изглежда като горната TLS връзка, е трудно да се разбере само като се прочете това. За да сме сигурни, че ще го направите правилно, ще използваме следния пример.

Да приемем, че имате Google Chrome като браузър и искате да влезете в YouTube. След това стъпките ще бъдат както следва.

  1. Въведете https://www.youtube.com в адресната лента на браузъра си и въведете enter, казвайки дайте ми youtube.
  2. След това YouTube изпраща Разбира се, ето моя сертификат, който съдържа моя публичен ключ. Беше подписано от google CA.
  3. Тогава браузърът казва: О! Също така познавам Google CA и имам доверие на Google. Освен това имам публичния ключ на Google CA. Така че ще го проверя.
  4. След като потвърди публичния ключ, браузърът казва на https://www.youtube.com Вярвам на Google CA и изглежда, че вие ​​сте този, за когото се представяте. Затова създадох произволен таен ключ и го шифровах с публичния ключ.
  5. Тогава https://www.youtube.com казва Уау! Умен избор. Ще го декриптирам с моя личен ключ, за да мога да имам вашия таен ключ.
  6. След това и браузърът, и https://www.youtube.com са единствените, които имат този произволен таен ключ. Следователно те могат да споделят данни чрез криптиране на данни с помощта на този таен ключ.

За да разберете тази концепция повече, можете да следвате стъпките, като използвате следното изображение.

Хранилища за ключове и Truststores

И така, какво е Keystore? Keystore е хранилище, което съхранява ключовете и сертификатите на верига за доверие. А в Keystore можете да съхранявате както частни, така и публични ключове. Довереното хранилище е друго хранилище, защитено с парола, което съхранява цифрови сертификати.

Keystore и truststore в WSO2 Identity Server

WSO2 IS има файл за съхранение на ключове по подразбиране и файл за доверително хранилище, които са в директория <IS_HOME>/repository/resources/security.

  • wso2carbon.jks — Това е хранилището за ключове по подразбиране, което съдържа частен ключ и самоподписан сертификат за публичен ключ.
  • client-truststore.jks — Това е довереното хранилище по подразбиране, което съдържа сертификати на реномирани сертифициращи центрове, които могат да валидират самоличността на системи на трети страни. Това доверително хранилище също съдържа самоподписания сертификат на хранилището за ключове wso2carbon.jks по подразбиране.

Въпреки че това са файловете за съхранение на ключове, като цяло WSO2 IS има четири типа хранилища за ключове.

  • Основно хранилище за ключове — Шифроване на данните, излизащи извън IS (напр. JWT токен).
  • Вътрешно хранилище за ключове — Шифроване на критичните данни в IS.
  • SSL/TLS Keystore — За улесняване на SSL/TLS връзката.
  • Truststore — За да съдържа цифровите сертификати.

Ако отворите <IS_HOME>/repository/conf/deployment.toml файл, можете да видите, че първичното хранилище за ключове е зададено на wso2carbon.jks

[keystore.primary]
file_name = wso2carbon.jks
password = wso2carbon
[truststore]
file_name="client-truststore.jks"
password="wso2carbon"
type="JKS"

Ако не споменавате вътрешните и SSL/TLS хранилищата за ключове поотделно, гореспоменатият кодов фрагмент гарантира, че тези две хранилища за ключове получават едно и също wso2carbon.jks, което е същото като основното ключово хранилище.

Въпреки че е напълно добре да настроите хранилищата за ключове с помощта на deployment.toml, важно е да знаете къде са конфигурирани тези хранилища за ключове в WSO2 IS, тъй като винаги е добре да знаете как да работите по своя начин, без да използвате файла deployment.toml.

  • Основни и вътрешни хранилища за ключове → <IS_HOME>/repository/conf/carbon.xml
  • SSL/TLS Keystore → <IS_HOME>/repository/conf/tomcat/catalina-server.xml
  • Truststore → <IS_HOME>/repostitory/conf/carbon.xml

Тъй като вече знаем подробностите за хранилищата за ключове и тяхната роля в WSO2 IS, можем да разгледаме сценарий как можем да добавим нов SSL/TLS сертификат към хранилище за ключове и да го конфигурираме в WSO2 IS.

Създаване на сертификат с помощта на Keystore

В този случай ще разгледаме два сценария,

  • Създаване на самоподписан сертификат
  • Създаване на сертификат, подписан от CA

Създаване на самоподписан сертификат и добавянето му към Truststore

Отидете до <IS_HOME>/repository/resources/security и създайте ново хранилище за ключове, което включва частен ключ, като използвате следната команда.

keytool -genkey -alias wso2carbon_1 -keyalg RSA -keysize 2048 -keystore newkeystore.jks -dname "CN=localhost, OU=Home, O=Home, L=SL, S=WS, C=LK" -storepass mypassword -keypass mypassword

Тук
CN → Общо име
OU → Организационна единица
O → Организация
L → Местоположение
S → Щат
C → Държава

Тази команда ще генерира ново хранилище за ключове със следните подробности.
- Име на хранилището за ключове — newkeystore.jks
- Псевдоним на публичния сертификат — wso2carbon_1
- Парола за хранилище за ключове — mypassword
- Парола за личен ключ — mypassword

След това ще създадем сертификат, използвайки създадения JKS файл.

keytool -exportcert -keystore newkeystore.jks -alias wso2carbon_1 -file wso2carbon.crt

След като въведете паролата на хранилището за ключове, която в този случай е mypassword, ще получите сертификат с име wso2carbon.crt Тъй като това е самоподписан сертификат, трябва да го добавим към нашия client-truststore.jks За да направите това, изпълнете следната команда.

keytool -importcert -keystore client-truststore.jks -alias wso2carbon_1 -file wso2carbon.crt

Тази команда ще поиска паролата на client-truststore.jks, а паролата по подразбиране на truststore е wso2carbon След добавяне на сертификата можете да видите ключовете на client-truststore.jks, като използвате следната команда.

keytool -list -keystore client-truststore.jks -storepass wso2carbon

Тъй като вече имаме сертификат, свързан към localhost по подразбиране, нека го премахнем в client-truststore.jks Ако въведете следното и потърсите wso2carbon псевдоним, можете да го намерите.

keytool -list -v -keystore client-truststore.jks -storepass wso2carbon

Тъй като вече добавихме самоподписания сертификат, нека изтрием псевдонима по подразбиране, като изпълним следната команда (това не е задължително).

keytool -delete -noprompt -alias wso2carbon -keystore client-truststore.jks -storepass wso2carbon

Но все пак трябва да направим нещо, а именно да зададем новосъздаденото хранилище за ключове като TLS хранилище за ключове в deployment.toml, защото в противен случай сертификатът, който ще се покаже, когато отидем до localhost:9443, ще бъде този, който е конфигуриран в wso2carbon.jks За да конфигурирате TLS keystore отворете файла deployment.toml на адрес <IS_HOME>/repository/conf и добавете следното.

[keystore.tls]
file_name = "newkeystore.jks"
type = "JKS"
password = "mypassword"
alias = "wso2carbon_1"
key_password = "mypassword"

Сега нека стартираме WSO2 IS, като отидем до папката bin на пакета WSO2 IS и напишем sh wso2server.sh След като IS започне, отидете на localhost:9443 и щракнете върху частта Not Secure в адресната лента и щракнете върху Certificate is not valid

И тогава можете да откриете, че нашият самоподписан сертификат е добавен правилно.

Създаване на подписан от CA сертификат и добавянето му към Truststore

За да направим това, първо ще получим нов WSO2 IS пакет и ще създадем нов JSK файл в директорията <IS_HOME>/repository/resources/security.

keytool -genkey -alias wso2carbon_1 -keyalg RSA -keysize 2048 -keystore newkeystore.jks -dname "CN=nipunaupekshatest95.tk, OU=Home, O=Home, L=SL, S=WS, C=LK" -storepass mypassword -keypass mypassword

След това можете да намерите нов jks файл, създаден във вашата директория. Тук можете да видите, че съм използвал nipunaupekshatest95.tk като общо име. Тъй като общото име трябва да бъде името на домейна, вмъкнах nipunatestupeksha95.tk там. Можете дори да използвате localhost за CN. Но за localhost не можете да получите цифрово сертифицирани сертификати от проверен CA. Следователно, за да следвате статията, можете да получите безплатен домейн .tk от freenom и да го използвате.

Можете да видите какво има във вашето хранилище за ключове, като

keytool -list -v -keystore mykeystore.jks -storepass mypassword

За да направите това валидно, трябва да направите файл със заявка за подписване на сертификат (CSR) и след това да го сертифицирате от сертифициращ орган (CA). За да направите CSR, можете да използвате един от методите, описани по-долу.

Първият е директно създаване на CSR и изпращането му на CA. Да направя това,

keytool -certreq -alias wos2carbon_1 -file wso2carbon.csr -keystore newkeystore.jks -storepass mypassword

Вторият метод е създаване на файл .pem (файл с подобрена поверителност на пощата) и изпращането му на CA. Да направя това,

keytool -certreq -v -alias wso2carbon_1 -file csr-for-wso2carbon.pem -keypass mypassword -storepass mypassword -keystore newkeystore.jks

След като създадете някое от тях, можете да го сертифицирате от CA. Можете да подпишете такъв безплатно от SSLForFree. За да го използвате, създайте акаунт и отидете, за да получите нов сертификат. Там можете да въведете nipunaupekshatest95.tk като ваш домейн.

След това за срок на валидност изберете 90-дневен сертификат. А за CSR & Contract изберете поставяне на съществуващ CSR. След това отворете csr-for-wso2carbon.pem или wso2carbon.csr от VSCode или Notepad и копирайте и поставете съдържанието там.

След това финализирайте поръчката си.

След това те ще ви помолят да потвърдите вашия домейн. Най-лесният начин да направите това е да го потвърдите с помощта на DNS(CNAME)

След това отидете във вашия акаунт във freenom и изберете домейна, който сте получили, и изберете „Управление на Freenom DNS“

След това копирайте и поставете съответно стойностите. И за тип изберете CNAME.

След това щракнете върху Save Changesin freenom и отидете на уебсайта на SSLForFree и отидете на следващата стъпка и щракнете върху Проверка на домейн.

Ако всичко е минало добре и е изчакано достатъчно време, сървърът ще разбере, че домейнът всъщност принадлежи на вас и ще ви издаде сертификат, подписан от CA.

След това ще получите имейл, че домейнът е сертифициран. Можете да изтеглите сертификата, като отидете в раздела за сертификати в SSLForFree.

След като разархивирате изтегления файл, можете да видите, че има два файла, ca_bundle.crt и certificate.crt Тук ca_bundle.crt съдържа основния сертификат на CA и набор от междинни сертификати. А certificate.crt е сертификатът, подписан от CA.

За да добавите основния сертификат на CA и междинни сертификати, използвайте изпълнете следната команда.

keytool -import -v -trustcacerts -alias ca_bundle -file ca_bundle.crt -keystore newkeystore.jks -storepass mypassword

След това добавете подписания от CA SSL сертификат към хранилището за ключове, като използвате следната команда. И се уверете, че използвате същия псевдоним, който сте използвали при създаването на хранилището за ключове.

keytool -import -v -alias wso2carbon_1 -file certificate.crt -keystore newkeystore -keypass mypassword -storepass mypassword

Сега нека добавим това към client-truststore.jks, за да му се доверим като SSL/TLS сертификат. За да направим това, първо трябва да извлечем публичния ключ от нашето хранилище за ключове.

keytool -export -alias wso2carbon_1 -keystore newkeystore.jks -file wso2carbonhttps://www.youtube.compublic_key.pem

След като извлечем публичния ключ към .pem файл, можем да го добавим към client-truststore.jks

keytool -import -alias wso2carbon_1 -file wso2carbonhttps://www.youtube.compublic_key.pem -keystore client-truststore.jks -storepass wso2carbon

Сега добавихме успешно SSL сертифицирането към client-truststore. Сега ще преименуваме файла wso2carbon.jks на internal.jks и файла newkeystore.jks на wso2carbon.jks След като направим това, можем да добавим следните конфигурации към файла deployment.toml в директория <IS_HOME>/repository/conf. Това е алтернативен начин за конфигуриране на настройкаkeystore.tls във файла deployment.toml.

[server]
hostname = "nipunaupekshatest95.tk"
node_ip = "127.0.0.1"
base_path = "https://$ref{server.hostname}:${carbon.management.port}"
[keystore.primary]
file_name = "wso2carbon.jks"
password = "mypassword"
alias = "wso2carbon_1"
[keystore.internal]
file_name = "internal.jks"
password = "wso2carbon"
alias = "wso2carbon"

Сега стартирайте сървъра, като отидете на <IS_HOME>/bin и напишете sh wso2server.sh

Сега, ако отидете на nipunaupekshatest95.tk:9443/carbon, ще можете да видите, че уебсайтът е защитен.

(Тук не съм прикачил екранни снимки на резултата, тъй като към момента на писане DNS услугата на freenom не работи. Но повярвайте ми, че работи :))

Резюме на командите на Keytool

  • Създайте хранилище за ключове → keytool -genkey -alias wso2carbon -keyalg RSA 2048 -keystore wso2carbon.jks -dname "CN=localhost, OU=Home, L=SL, S=WS, C=LK" -storepass wso2carbon -keypass wso2carbon -validity 360 -ext "SAN=DNS:localhost.com"
  • Избройте хранилището за ключове → keytool -list -keystore wso2carbon.jks -storepass wso2carbon
  • Разширете хранилището за ключове → keytool -list -v -keystore wso2carbon.jks -storepass wso2carbon
  • Преместете списъка с хранилище за ключове във файл → keytool -list -v -keystore wso2carbon.jks -storepass wso2carbon >> keystore.txt
  • Сертификат за износ → keytool -exportcert -keystore wso2carbon.jks -alias wso2carbon -file wso2carbon.crt
  • Сертификат за импортиране → keytool -importcert -keystore client-truststore.jks -alias wso2carbon2 -file wso2carbon.crt
  • Създаване на CSR с помощта на JKS→ keytool -certreq alias -wso2carbon_1 -file wso2carbon.csr -keystore newkeystore -storepass mypassword
  • Създаване на PEM файл с помощта на JKS →keytool -certreq -v -alias wso2carbon_1 -file csr-for-wso2carbon.pem -keypass mypassword -storepass mypassword -keystore newkeystore.jks
  • Добавяне на основни и междинни сертификати на CA към JKS → keytool -import -v -trustcacerts -alias ca_bundle -file ca_bundle.crt -keystore newkeystore.jks -storepass mypassword
  • Добавяне на подписания от CA SSL/TLS сертификат към хранилището на ключове → keytool -import -v -alias wso2carbon_1 -file certificate.crt -keystore newkeystore -keypass mypassword -storepass mypassword

допълнителни бележки

  • Свойството -ext в keytool ви позволява да добавяте SAN (алтернативни имена на субекти) към хранилището на ключове. Можете да добавите DNS, IP или имейл като SAN.

В тази статия обсъдихме какво представляват хранилищата за ключове и как се използват в WSO2 IS. Надявам се, че имате добра представа за тях. :) И това е доста голяма статия, така че не се колебайте да посочите, ако има правописни грешки или грешки. :)

Препратки