Почнемо з невеликою теорії.
В даний час протокол SSL практично непомітно для користувача взаємодіє з іншими протоколами Інтернет і забезпечує передачу конфіденційної інформації по мережах загального користування в зашифрованому вигляді. Програмне забезпечення OpenSSL підтримує протоколи SSL (Secure Sockets Layer) v2 / v3 і TLS v1 (Transport Layer Security). Утиліта командного рядка openssl може використовуватися для виконання наступних завдань:
- Створення та управління ключами RSA і DSA
- Створення сертифікатів формату x509, запитів на підпис сертифікатів, відновлення сертифікатів
- Шифрувати дані за допомогою симетричного або асиметричного алгоритму шифрування
- Працювати з S / MIME
- Виробляти ssl / tls тестування серверів і клієнтів
SSL використовує асиметричні алгоритми шифрування, т.зв. шифрування з відкритим ключем. У такому алгоритмі один ключ використовується для розшифровки даних, зашифрованих іншим ключем. Ці два ключа (private / public) - пара ключів - створюються одночасно, за допомогою математичної формули. Це єдиний спосіб знайти два ключа, володіють спеціальною асиметрією (при якій один з ключів може розшифрувати зашифроване другим): обчислення одного з ключів по другому - завдання неймовірно складна. При застосуванні шифрування з відкритим ключем один ключ з пари робиться вільно доступним, т.зв. public key, а другий
Сертифікат містить публічний ключ, підписаний одним з кореневих довірених центрів сертифікації, дані про організацію, що видала сертифікат і в деяких випадках зашифрований закритий ключ, а також відбиток (хеш) публічного ключа. Сертифікати мають час дії, по закінченню якого вони автоматично вважаються недійсними, ієрархія сертифікатів зазвичай будується на підставі мережі довіри (бувають досить довгі ланцюжки сертифікатів, що ведуть до довіреній ключу з root CA).
Створення кореневого (самоподпісанного) сертифіката.
Для початку треба поставити (якщо ще не поставили) openssl (на даний момент порт знаходиться - / usr / ports / security / openssl).
Створена папки (створив папки в '/ usr / local / etc /', але це не принципово).
# Cd / usr / local / etc
# Mkdir -p CA / newcerts CA / private<
Папка CA буде містити сертифікат нашого CA, базу даних сертифікатів, які ми підписали, а також ключі, запити та сертифікати, які ми сгенерируем. Вона також буде нашою робочою директорією, коли ми будемо створювати або підписувати сертифікати.
CA / newcerts - буде містити копію кожного сертифіката, який ми підпишемо.
CA / private - буде містити наш CA private key.
Цей ключ (CA private key) дуже важливий. Не втрачайте цей ключ, без нього, ви не зможете підписати або оновити сертифікати. Не показуйте цей ключ нікому, якщо його впізнають, то зловмисник зможе видавати себе за вас.
Створюємо БД для сертифікатів (робимо це в нашій робочій директорії "CA"):
# Echo '01'> serial
# Touch index.txt
Створюємо openssl.cnf і записуємо в нього:
#
# /usr/local/etc/CA/openssl.cnf
#
# Задаємо робочу директорію
dir =.
# В даній секції описуються основні опції
[Req]
# Довжина ключа в бітах
default_bits = 8192
# Алгоритм шифрування
default_md = md5
# Дозволені символи
string_mask = nombstr
# Вказуємо, що DN (Distinguished Name) буде описана в секції req_distinguished_name
distinguished_name = req_distinguished_name
# В даній секції вказуються дані, які будуть використовуватися
# За умовчанням при генерації запиту на підписання сертифіката
[Req_distinguished_name]
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Значення за замовчуванням
0.organizationName_default = Unix4Me
localityName_default = Moscow
stateOrProvinceName_default = Russia
countryName_default = RU
[V3_ca]
basicConstraints = CA: TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid: always, issuer: always
Створюємо самоподпісанний кореневий сертифікат (генерітся з використанням пароля)
# Openssl req -new -x509 -extensions v3_ca -keyout private / rootCA.key -out rootCA.crt -days 3650 -config ./openssl.cnf
Generating a 8192 bit RSA private key
. ++
. ++
writing new private key to 'private / rootCA.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', The field will be left blank.
-----
Organization Name (company) [Unix4Me]:
Organizational Unit Name (department, division) []: UnitName
Email Address []: [email protected]
Locality Name (city, district) [Moscow]:
State or Province Name (full name) [Russia]:
Country Name (2 letter code) [RU]:
Common Name (hostname, IP, or your name) []: MyName
Коли час дії кореневого сертифікату закінчується, всі підписані ним сертифікати стають недійсними. Для виправлення цієї ситуації, необхідно створити і розповсюдити новий кореневий сертифікат.
Створення запиту на підпис сертифіката
Тепер на базі створеного кореневого сертифіката, ми можемо створити будь-яку кількість сертифікатів для ssl додатків. Ця процедура складається з створення закритого ключа і запиту на підпис сертифіката, а далі в підпису його нашим кореневих сертифікатом.
Для створіння не кореневих сертифікатів - внесемо зміни в openssl.cnf (додамо в кінець файлу):
[V3_req]
basicConstraints = CA: FALSE
subjectKeyIdentifier = hash
і в секцію [req] після параметра distinguished_name додамо:
req_extensions = v3_req
Створюємо запит на сертифікат для веб сервера. Необхідно звернути увагу на поля:
# Openssl req -new -nodes -out web.unix4me.ru.csr -keyout web.unix4me.ru.key -config ./openssl.cnf
Generating a 8192 bit RSA private key
. ++
. ++
writing new private key to 'web.unix4me.ru.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', The field will be left blank.
-----
Organization Name (company) [Unix4Me]:
Organizational Unit Name (department, division) []: Web Server unix4me.ru
Email Address []: [email protected]
Locality Name (city, district) [Moscow]:
State or Province Name (full name) [Russia]:
Country Name (2 letter code) [RU]:
Common Name (hostname, IP, or your name) []: unix4me.ru
В результаті виконання цієї команди ми отримали два файли:
- web.unix4me.ru.key - секретний закритий ключ
- web.unix4me.ru.csr - запит на підпис сертифіката
Ці файли необхідно зберегти. Коли термін дії сертифіката закінчиться, то запит може бути використаний знову для створення нового сертифіката з новим терміном дії. Закритий ключ необхідний для SSL кодування.
----
підпис сертифіката
Тепер додамо в конфігураційний файл (openssl.cnf) секцію [ca]. Ця секція визначає шляхи до різних частин, наприклад баз даних, CA сертифікат і закритий ключ. Вона також містить деякі базові настройки. Додаємо перед секцією [req]
[Ca]
default_ca = CA_default
[CA_default]
serial = $ dir / serial
database = $ dir / index.txt
new_certs_dir = $ dir / newcerts
certificate = $ dir / rootCA.crt
private_key = $ dir / private / rootCA.key
default_days = 365
default_md = md5
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
[Policy_match]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
Щоб підписати запит зроблений на попередньому кроці:
# Openssl ca -out web.unix4me.ru.crt -config ./openssl.cnf -infiles web.unix4me.ru.csr
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/rootCA.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName: PRINTABLE: 'Unix4Me'
organizationalUnitName: PRINTABLE: 'Web Server unix4me.ru'
localityName: PRINTABLE: 'Moscow'
stateOrProvinceName: PRINTABLE: 'Russia'
countryName: PRINTABLE: 'RU'
commonName: PRINTABLE: 'unix4me.ru'
Certificate is to be certified until Apr 15 14:47:22 2022 GMT (3650 days)
Sign the certificate? [Y / n]: y
1 out of 1 certificate requests certified, commit? [Y / n] y
Write out database with 1 new entries
Data Base Updated
В результаті оновили нашу бд і отримуємо два файли
- web.unix4me.ru.crt - безпосередньо сам сертифікат
- newcerts /<серийный номер>.pem - копія сертифіката
Якщо ви будете користуватися послугами сторонніх центрів сертифікації, таких як VeriSign, VISA, Thawte, Baltimore і т.д. Те Ви повинні будете відіслати запит на підпис сертифіката (web.unix4me.ru.csr) в один з центрів сертифікації. Після закінчення деякого часу, як правило, 1-3 тижні вам надішлють готовий і підписаний сертифікат (web.unix4me.ru.crt). Який вже можна буде використовувати безпосередньо в ПО. Природно це послуга платна.