28 июля 2011 г.

Создание самоподписанного (self-signed) SSL сертификата

И для генерации приватного RSA ключа и для создания CSR и для создания самоподписанных сертификатов буду пользоваться openssl под линуксом. Зачем нужны самоподписанные сертификаты — отдельный разговор, но могут пригодиться для отладки или там тестов. Установку openssl не буду описывать, под linux есть в любом дистрибутиве.

Приватный ключ


Приватный ключ будет 1024-битным RSA-ключом (как вариант зашифрованным TripleDES). Обычно он хранится в визуально читаемом формате .pem. При генерации желательно задать случайную байтовую последовательность из нескольких случайных файлов, чтобы улучшить случайность ключа. В какой-то текущей рабочей папке делаем новый приватный ключ (параметры -des3 для TripleDES и -rand для указания файлов входных):
openssl genrsa -des3 -rand ./file1:./file2 -out myserver.key
49536 semi-random bytes loaded
Generating RSA private key, 512 bit long modulus
......++++++++++++
.................................++++++++++++
e is 65537 (0x10001)
Enter pass phrase for myserver.key:
Verifying - Enter pass phrase for myserver.key:
Как видно запрашивается пароль и подтверждение. Файл myserver.key - это и есть ключ. Учтите: если потеряете или сольёте пароль или сам ключ, то сертификатом пользоваться станет невозможно или бесполезно. Вот примерно как выглядит ключ:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,D3EFE25AEE9849F8

BiwT7mZeJP7/xNtBbE0sDhLOW1Qw7zWKVJyysHIdAqJGb03v6zcWQnL90bhtQFEd
siK8+MJUMtbdzlpfwk5QYMgVxyvYyfvyqd67hb6VTHsQUvII8F4TcRmAM9kBK6nO
l36IN5oRZtzAMCaLdcEDY5KLJXilyJlBECgmG7jHo9S8pzv2OxOK9MGIw4gV6foz
ZxXmFDLnf2E7Y88GgsAvaeP8ytGBl1bvcams4I1GB6awAkSOF+6lgRmulWrWi3Or
9R7aDKsN7skpgBsBwMvgpvE6QuumEjzfQJ3qbW4HdAMrQQsKeHJM4S3fONTl0XhL
cTlpbfaLl+Hjexz7WbAs8atIQx3lEfcWFmC0BCIlCf7Vb+RBp3snKaUoDn0h0YsY
D6cPXZ2SaOx6pABVGkyM4n60A1xJjqgV+6wiBVVVsek=
-----END RSA PRIVATE KEY-----
Можно и без пароля, особенно для тестов (при использовании разные там проги типа apache будут просить его при старте). Ясно понятно, что без пароля надо ещё лучше его хранить. Для беспарольного ключа не нужно при создании ставить ключ -des3. Можно убрать из готового ключа пароль:
openssl rsa -in myserver.key -out myserver.key
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBAMI9L+mz3HAUmwEH50aUf12Od99H6zb3bw0dMS9mvFEUNFfqotBY
M+yZ4jHspSYrTR7LGahN9RaL46qT/pie0LsCAwEAAQJBALDYLItGamjRGd7yZyrn
gJ6ZW6I6RHkjBkSWU3Wov8PAXmrLZRdGn54+O+89eRaB8tFqs+Q7xseo8ezT/mBE
lQECIQDvM/is1DDIrfDKbTvMs3IHL8Pj/aRvcbKw4DnLwfQGoQIhAM/g69Ws4rnF
zOZaikPG7DzOcukPzA4zkNIuFmV7PAXbAiBBYWoyCxl+cJSlL7Atpkqfjj2zvmtI
jsIxuEfz2oKRoQIgZQt/ly2iR4rOPmpkKu3WhvgTAxaaqYyHKKMeX9W3J2ECIQCY
+XTQ1/OpMLDVxzmaUXYEMPDtcO6hHpgaPaSbqR+JFA==
-----END RSA PRIVATE KEY-----

Запрос на подпись сертификатов (CSR)


Запрос на подпись (CSR — Certificate Signing Request) генерируется из приватного ключа. Этот CSR нужен как для настоящего CA (Certification authority, Центр сертификации), типа VeriSign, так и для самостоятельной подписи CSR (см. ниже). Запускаем процесс, генерация CSR сопровождается разными вопросами.
$ openssl req -new -key myserver.key -out myserver.csr
Enter pass phrase for myserver.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.
-----
Country Name (2 letter code) [XX]:RU
State or Province Name (full name) []:Ufa
Locality Name (eg, city) [Default City]:Ufa
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:myserver.ru
Email Address []:***@myserver.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Если используете для подписи на серверах и т.п., то важно(!), чтобы поле Common Name содержало полное имя домена. В итоге получится csr.
-----BEGIN CERTIFICATE REQUEST-----
MIIBMDCB2wIBADB2MQswCQYDVQQGEwJSVTEMMAoGA1UECAwDVWZhMQwwCgYDVQQH
DANVZmExHDAaBgNVBAoME0RlZmF1bHQgQ29tcGFueSBMdGQxEDAOBgNVBAMMB21l
ZHYucnUxGzAZBgkqhkiG9w0BCQEWDGRpbWFAbWVkdi5ydTBcMA0GCSqGSIb3DQEB
AQUAA0sAMEgCQQDCPS/ps9xwFJsBB+dGlH9djnffR+s2928NHTEvZrxRFDRX6qLQ
WDPsmeIx7KUmK00eyxmoTfUWi+Oqk/6YntC7AgMBAAGgADANBgkqhkiG9w0BAQUF
AANBADoJc0TMnwcTJIkFqoyvbPb8ie2uwRFILp3B/7P4oYyBiuWjSIVsJEonVJ78
2fqzGpWU9sE/+th6/+pN4e6sLA4=
-----END CERTIFICATE REQUEST-----

Генерация самоподписанного сертификата


Этого достаточно, чтобы запросить настоящий сертификат. Но нам надо самоподписанный, так что эта замечательная программа может сама сделать сертификат из CSR. Ясно, что такой сертификат будет выдавать предупреждения в браузерах типа "CA неизвестен". Допустим, для сертификата на 90 дней сделать так:
openssl x509 -req -days 90 -in myserver.csr -signkey myserver.key -out myserver.crt
-----BEGIN CERTIFICATE-----
MIIBgDCCASoCCQC0XjlK0HUrRjANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJS
VTEMMAoGA1UECAwDVWZhMQwwCgYDVQQHDANVZmExHDAaBgNVBAoME0RlZmF1bHQg
Q29tcGFueSBMdGQwHhcNMTEwNzI4MDcwODQ0WhcNMTEwOTI2MDcwODQ0WjBHMQsw
CQYDVQQGEwJSVTEMMAoGA1UECAwDVWZhMQwwCgYDVQQHDANVZmExHDAaBgNVBAoM
E0RlZmF1bHQgQ29tcGFueSBMdGQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAx1jU
GNLJZKQrXTZHC8royKX9TGHI5OO4sGNH10fSmJeFFMq3Gur+PwJgZxebp1Uqg9Ig
sZf8KJBQ+hqSXM6wHwIDAQABMA0GCSqGSIb3DQEBBQUAA0EAsPc04WvpbtOFtZ5V
4Xs6p+p68v22W71WKoI6cO1v6XuQYR2BrkoGfb7Ov0P+VWxDHRVgDBWkt9FFS+0x
v/tklQ==
-----END CERTIFICATE-----

Использование сертификата


В итоге сертификат можно будет использовать в nginx, apache итд, подробностей писать незачем, есть соответствующие мануалы. В зависимости от ситуаций потребуются crt-файл, key-файл, пароль от ключа итд. Учтите, что если ключ шифрованый, то при перезагрузке сервера будет запрошен пароль. Про сертификаты, расширения файлов и т.п. вкратце пишут на википедии: http://en.wikipedia.org/wiki/X.509

2 комментария:

  1. Спасибо автору за познавательную статью)
    Хочу заказать ssl сертификаты для своего нового сайта на http://uanic.name/ , поскольку ниже цен на ssl Thawte я не нашел. Но не могу определится какой именно SSL выбрать Thawte SSL 123 или Web Server Cert. Помогите пожалуйста выбрать SSL.

    ОтветитьУдалить
  2. Спасибо за статью. Правда, еще можно немного добавить команд по генерации csr,key и crt в разных ситуациях (на лету без вопросом, с готовым ключом, с ключом без пароля, и тп.), как пишут здесь - http://sysadm.pp.ua/internet/pound-apache-nginx-ssl-setup.html

    ОтветитьУдалить