Создание самоподписанных сертификатов
Понедельник, января 10, 2011 | Автор:

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

# mkdir certs && cd certs
# ee openssl.cnf

# Задаем рабочую директорию
dir = .
[ ca ]
default_ca = CA_default
[ CA_default ]
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
# В данной секции описываются основные опции
[ req ]
# Длина ключа в битах
default_bits = 4096
# Алгоритм шифрования
default_md = md5
# Разрешенные символы
string_mask = nombstr
# Указываем, что DN (Distinguished Name) будет описана в секции req_distinguished_name
distinguished_name = req_distinguished_name
# В данной секции указываются данные, которые будут использоваться
# по умолчанию при генерации запроса на подписание сертификата
[ req_distinguished_name ]
#Чтобы часто не вводить данные в командную строку, добавьте следующую строку в
#секцию [ req ] после параметра distinguished_name.
req_extensions = v3_req
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 = domain.local, LTD
organizationalUnitName_default= System Administrator
emailAddress_default = xxx@xxx.xx
localityName_default = Volgograd
stateOrProvinceName_default = Russia
countryName_default = RU
commonName_default = Sysadmin Root SA
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

Прописываем серийник

#echo 000001 > rootCA.srl

Создаем корневой сертификат и подписываем его.С его помощью мы подпишем все остальные

!Не забудьте парольную фразу !

# openssl req -config openssl.cnf -out rootCA.pem -keyout rootCAkey.pem -new -x509 -days 365

Ну, собственно, и создаем сами сертификаты и подписываем их

#openssl req -config openssl.cnf -out soareq.pem -keyout soakey.pem -new
#openssl x509 -in soareq.pem -out soa.pem -CA rootCA.pem -CAkey rootCAkey.pem -days 365 -req
#openssl rsa -in soakey.pem -out mx.soa.key
#openssl x509 -in soa.pem -out soa.der -outform DER

Вот и всё. Осталось просто прописать их в конфигурационные файлы нужных служб

POSTFIX — /usr/local/etc/postfix/main.cf

smtpd_tls_cert_file = /usr/local/etc/postfix/CA/soa.pem
smtpd_tls_key_file = /usr/local/etc/postfix/CA/mx.soa.key
smtpd_tls_CAfile = /usr/local/etc/postfix/CA/rootCA.pem

Для FTP-сервера VSFTPD в конфиге прописываются немного по-другому:

ssl_enable=YES
rsa_cert_file=/usr/local/etc/vsftpd/vsftpd.pem

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

Apache 1.x — /usr/local/etc/apache/httpd.conf

SSLCertificateFile «/usr/local/etc/apache/ssl.crt/server.crt»
SSLCertificateKeyFile «/usr/local/etc/apache/ssl.key/server.key»

Apache 2.x — /usr/local/etc/apache2/extra/httpd-ssl.conf — должно быть прописано

SSLCertificateFile «/usr/local/etc/apache22/ssl.crt/server.crt»
SSLCertificateKeyFile «/usr/local/etc/apache22/ssl.key/server.key»

НО! Если всё-таки не получилось создать сертификаты через порты можно сделать их несколькими командами

openssl genrsa -rand /dev/random -out ca.key 4096
openssl req -config openssl.cnf -new -key ca.key -out ca.csr
openssl x509 -days 11 -signkey ca.key -in ca.csr -req -out ca.crt

openssl genrsa -rand /dev/random -out server.key
openssl req -new -key server.key -out server.csr
openssl x509 -days 17 -CAserial rootCA.srl -CA ca.crt -CAkey ca.key -in server.csr -req -out server.crt

EXIM — /usr/local/etc/exim/configure

Для создания сертификатов для exim выполняем команду

cd /usr/local/etc/exim/ && openssl req -x509 -newkey rsa:4096 -keyout exim.pem -out exim.pem  -days 9999 -nodes

В конфиге прописыем 2 строки:

tls_certificate = /usr/local/etc/exim/exim.pem
tls_privatekey = /usr/local/etc/exim/exim.pem