LINUX.ORG.RU

OpenSSL verify chain cerificate and CRL


0

3

Здравствуйте, не уверен, что если спросить кратко, то будет понятна суть вопроса, поэтому я изложу по порядку:

Цель:

  • Развернуть на ноутбуке (не подключенном к сети) с Windows 7 центр сертификации на OpenSSL
  • Развернуть на сервере freeRADIUS2 для EAP-TLS аутентификации мобильных терминалов

Шаги по воплощению:
1. устанавливаю дистрибутив OpenSSL 0.9.8y 2. Генерирую корневй ключ и сертификат:

openssl req -new -x509 -keyout ca_wifi.key -out ca_wifi.pem -days 8500 -config ca_wifi.cnf
openssl x509 -inform PEM -outform DER -in ca_wifi.pem -out ca_wifi.der
3. Генерирую ключ и сертификат (подписанный корневым ключом) для RADIUS сервера:
openssl req    -new -out server_radius.csr -keyout server_radius.key -config server_radius.cnf
openssl ca     -batch -keyfile ca_wifi.key -cert ca_wifi.pem -in server_radius.csr  -key %PASSWORD_CA% -out server_radius.crt -extensions xpserver_ext -extfile xpextensions -config ca_wifi.cnf
openssl pkcs12 -export -in server_radius.crt -inkey server_radius.key -out server_radius.p12  -passin pass:%PASSWORD_SRV% -passout pass:%PASSWORD_SRV%
openssl pkcs12 -in server_radius.p12 -out server_radius.pem -passin pass:%PASSWORD_SRV% -passout pass:%PASSWORD_SRV%
openssl verify -CAfile ca_wifi.pem server_radius.pem
4. Генерирую ключ и сертификат (подписанный корневым ключом) для первого клиента:
openssl req    -new  -out motorola001.csr -keyout motorola001.key -config motorola001
openssl ca     -batch -keyfile ca_wifi.key -cert ca_wifi.pem -in motorola001.csr -key %PASSWORD_CA% -out motorola001.crt -extensions xpclient_ext -extfile xpextensions -config ca_wifi.cnf
openssl pkcs12 -export -in motorola001.crt -inkey motorola001.key -out motorola001.p12 -passin pass:%PASSWORD_CLNT001% -passout pass:%PASSWORD_CLNT001%
openssl pkcs12 -in motorola001.p12 -out motorola001.pem -passin pass:%PASSWORD_CLNT001% -passout pass:%PASSWORD_CLNT001%
openssl verify -CAfile ca_wifi.pem motorola001.pem
5. Генерирую списк отозванных сертификатов (CRL):
openssl ca -gencrl -keyfile ca_wifi.key -key %PASSWORD_CA% -cert ca_wifi.pem -out crl_wifi.pem -config ca_wifi.cnf
6. Сливаю файл корневого сертификата и файл со списком отозванных сертификатов в один:
TYPE ca_wifi.pem crl_wifi.pem > ca_and_crl_wifi.pem
7. Копируем на сервер c freeRADIUS2 файлы: server_aztpa_radius.pem и ca_and_crl_aztpa_wifi.pem
8. Конфигурирую freeRADIUS2 и в eap.conf прописываю:
	...
	private_key_password = *****
	private_key_file = ${certdir}/server_aztpa_radius.pem
	certificate_file = ${certdir}/server_aztpa_radius.pem
	CA_file = ${cadir}/ca_and_crl_aztpa_wifi.pem
	dh_file = ${certdir}/dh
	check_crl = yes
	...
9. Всё наступает «счастье», что можно проверить командой (если скопировать туда motorola001.pem):
openssl verify -crl_check -CAfile ca_and_crl_aztpa_wifi.pem motorola001.pem
Идея такова, что в случае отзыва клиентского сертификата, сертификат выполняется отзыв на ноутбуке, после чего по новой генерируется CRL и на RADIUS сервер передается обновленный ca_and_crl_wifi.pem, freeRADIUS2 при этом нужно рестартовывать, но это не критично.
Вопрос: как добиться такого же «счастья» если я подписываю сертификат клиента не корневым ключом, а, например, серверным?
Т.е. генерирую ключ и сертификат (подписанный серверным ключом) для второго клиента:
openssl req    -new  -out motorola002.csr -keyout motorola002.key -config motorola002.cnf
openssl ca     -batch -keyfile server_radius.key -cert server_radius.pem -in motorola002.csr -key %PASSWORD_SRV% -out motorola002.crt -extensions xpclient_ext -extfile xpextensions -config server_radius.cnf
openssl pkcs12 -export -in motorola002.crt -inkey motorola002.key -out motorola002.p12 -passin pass:%PASSWORD_CLNT002% -passout pass:%PASSWORD_CLNT002%
openssl pkcs12 -in motorola002.p12 -out motorola002.pem -passin pass:%PASSWORD_CLNT002% -passout pass:%PASSWORD_CLNT002%
Сливаю файл корневого и серверного сертификата в один:
TYPE ca_wifi.pem server_radius.pem > ca_and_server_wifi.pem
Проверка без CRL_check работает:
openssl verify -CAfile ca_and_server_wifi.pem motorola002.pem
А вот CRL подключить не удается:
TYPE ca_wifi.pem server_radius.pem crl_wifi.pem > ca_and_server_and_crl_wifi.pem
openssl verify -crl_check -CAfile ca_and_server_and_crl_wifi.pem motorola002.pem
openssl говорит: 3 X509_V_ERR_UNABLE_TO_GET_CRL: unable to get certificate CRL
:-(
а если сливать так:
TYPE ca_wifi.pem crl_wifi.pem > ca_and_crl_wifi.pem
openssl verify -crl_check -CAfile ca_and_crl_wifi.pem motorola002.pem
openssl говорит: 26 X509_V_ERR_INVALID_PURPOSE: unsupported certificate purpose

Собственно как openssl`у сказать что бы он и chain cerificate проверил и CRL?

Ответ на: комментарий от thesis

А как правильно?

Во freeRADIUS жестко прошит вызов API аля:

openssl verify [-crl_check] [-issuer]
но в принципе есть возможность выполнить произвольную команду для проверки.

PS: OCSP и т.п. не пойдут ибо ноутбук с ЦС обесточен и лежит в сейфе.

moon-duck ()
Ответ на: комментарий от moon-duck

Не, я не портив CRL как явления.
Просто пытаюсь понять, чего ты хочешь достичь, сливая файл сертификата и файл CRL.
Вот наплодил ты сто штук сертификатов, и понадобилось тебе один признать недействительным, потому что его украли.
Как в этом помогут слитые воедино файлы?

thesis ★★★★★ ()
Ответ на: комментарий от thesis

Ну включил я ноутбук и сгенерил сертификаты (по первой работающей схеме в описании вопроса), затем:

  • скопировал на RADIUS сервер ca_and_crl_wifi.pem и server_radius.pem
  • motorola001.pem установил на первый мобильный терминал
  • motorola002.pem установил на второй мобильный терминал
  • положил ноут в сейф

Все работает, все побеждает.

Тут, беда! сперли терминал motorola001
Достаю ноутбук, отзываю сертификата 02.pem (ну я посмотрел и знаю, что это он):

%OPENSSL_CMD% ca -revoke 02.pem -keyfile ca_wifi.key -key %PASSWORD_CA% -cert ca_wifi.pem -config ca_wifi.cnf
Генерация списка отозванных сертификатов
%OPENSSL_CMD% ca -gencrl -keyfile ca_wifi.key -key %PASSWORD_CA% -cert cawifi.pem -out crl_wifi.pem -config ca_wifi.cnf
Слияние файла корневого сертификата и файла со списком отозванных сертификатов в один
TYPE ca_wifi.pem crl_wifi.pem > ca_and_crl_wifi.pem
Сохраняю на флешку ca_and_crl_wifi.pem, выключаю ноут, кладу его в сейф и копирую ca_and_crl_wifi.pem на сервер с freeRADIUS, вот он:
[root@admin certs]# cd
[root@admin ~]# cd /etc/raddb/certs
[root@admin certs]# ls -l
total 32
-rw-r----- 1 root radiusd 2467 May 16 17:38 ca_and_crl_wifi.pem
-rw-r----- 1 root radiusd  245 May 16 17:27 dh
-rw-r--r-- 1 root root    3538 May 16 17:24 motorola001.pem
-rw-r--r-- 1 root root    3538 May 16 17:24 motorola002.pem
-rw-r----- 1 root radiusd 5120 May 16 17:27 random
-rw-r----- 1 root radiusd 3560 May 16 17:24 server_radius.pem

server_radius.pem простой сертификат:

[root@admin certs]# cat server_radius.pem
Bag Attributes
    localKeyID: 3B 32 3F AD 30 4A C1 B1 1B 0A F7 0A B7 F5 05 7A 88 63 F9 2B
subject=/C=RU/ST=***/O=***/CN=RADIUS Server Certificate/***
issuer=/C=RU/ST=***/L=***/O=***/CN=WiFi Certificate Authority
-----BEGIN CERTIFICATE-----
***
-----END CERTIFICATE-----
Bag Attributes
    localKeyID: 3B 32 3F AD 30 4A C1 B1 1B 0A F7 0A B7 F5 05 7A 88 63 F9 2B
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,17BF16EE4175B6E6
***
-----END RSA PRIVATE KEY-----
[root@admin certs]# openssl x509 -noout -text -in server_radius.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RU, ST=***, L=***, O=***, CN=WiFi Certificate Authority
        Validity
            Not Before: May 16 13:24:38 2014 GMT
            Not After : Aug 23 13:24:38 2037 GMT
        Subject: C=RU, ST=***, O=***, CN=RADIUS Server Certificate/emailAddress=***
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
***
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
    Signature Algorithm: sha1WithRSAEncryption
***

Файл ca_and_crl_wifi.pem содержит:

[root@admin certs]# cat ca_and_crl_wifi.pem
-----BEGIN CERTIFICATE-----
---SKIP---
-----END CERTIFICATE-----
-----BEGIN X509 CRL-----
---SKIP---
-----END X509 CRL-----
[root@admin certs]# openssl x509 -noout -text -in ca_and_crl_wifi.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            b7:de:05:65:bf:09:8a:80
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RU, ST=***, L=***, O=***, CN=WiFi Certificate Authority
        Validity
            Not Before: May 16 13:24:37 2014 GMT
            Not After : Aug 23 13:24:37 2037 GMT
        Subject: C=RU, ST=***, L=***, O=***, CN=WiFi Certificate Authority
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
***
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                5B:C9:82:B1:B7:69:9C:A2:35:AE:72:2A:67:15:99:F1:B3:E5:01:B0
            X509v3 Authority Key Identifier:
                keyid:5B:C9:82:B1:B7:69:9C:A2:35:AE:72:2A:67:15:99:F1:B3:E5:01:B0
                DirName:/C=RU/ST=***/L=***/O=***/CN=WiFi Certificate Authority
                serial:B7:DE:05:65:BF:09:8A:80

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
***
[root@admin certs]# openssl crl -in ca_and_crl_wifi.pem -noout -text
Certificate Revocation List (CRL):
        Version 1 (0x0)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=RU/ST=***/L=***/O=***/CN=WiFi Certificate Authority
        Last Update: May 16 13:38:29 2014 GMT
        Next Update: Aug 23 13:38:29 2037 GMT
Revoked Certificates:
    Serial Number: 02
        Revocation Date: May 16 13:38:28 2014 GMT
    Signature Algorithm: sha1WithRSAEncryption
                       ***

motorola001.pem и motorola002.pem - клиентские сертификаты подписанные корневым (они туда попадут через EAP но чтобы не путаться в радиусах я их сам туда скопировал)
Проверяем:

[root@admin certs]# openssl verify -crl_check -CAfile ca_and_crl_wifi.pem motorola001.pem motorola002.pem
motorola001.pem: /C=RU/ST=***/O=***/CN=motorola001/emailAddress=motorola001***
error 23 at 0 depth lookup:certificate revoked
motorola002.pem: OK

RADIUS говорит тоже самое при общении с терминалами.
Счастье?
Ну будет их 100 шт. и что это изменит?

Для тотального счастья я бы хотел все это завести под корпоративный CA сертификат, а для этого нужна проверка chain sertificate и CRL.

moon-duck ()
Ответ на: комментарий от moon-duck

Блин. Много букв, читал по диагонали.

Слияние файла корневого сертификата и файла со списком отозванных сертификатов в один

За-чем? Я именно этого не могу понять. Почему нельзя держать црл отдельным файлом? Я без наезда, просто искренне недоумеваю.

Ну будет их 100 шт. и что это изменит?

Насчет ста штук - это мне приглючилось, что ты клиентские сертификаты с црлами тоже сливаешь. Глюк уже прошел, но было поздно.
И все же - ЗАЧЕМ сливать СА с црлами? В чем удобство того, что вместо «обновить и закинуть на радиус црл» ты делаешь «обновить, слить воедино, закинуть на радиус црл+СА, рестартануть радиус»? Тем более, на венде црл все равно будет валяться отдельно от СА.

Вопрос: как добиться такого же «счастья» если я подписываю сертификат клиента не корневым ключом, а, например, серверным?

CA это CA, а сертификат сервиса - это сертификат сервиса. Не надо давать сертификату сервиса право на подписывание. Не хочешь подписывать клиентов Root'ом - сгенери подчиненный CA.

не уверен, что если спросить кратко, то будет понятна суть вопроса

Все равно непонятна, да еще и читать лень. Давай сокращать уже.

thesis ★★★★★ ()
Последнее исправление: thesis (всего исправлений: 1)

BTW, таки потыкай xca.
Нафиг это консольное вуду, раз уж ты наш человек, вендузятник.

thesis ★★★★★ ()
Ответ на: комментарий от thesis

Нафиг это консольное вуду, раз уж ты наш человек, вендузятник.

Не... это начальника ноут :-)))

moon-duck ()
Ответ на: комментарий от thesis

Почему нельзя держать црл отдельным файлом?

Эээ... (с) Батхед

Ну вот положил я ca_wifi.pem и crl_wifi.pem

[root@admin certs]# ls -l
total 40
-rw-r----- 1 root radiusd 2467 May 16 17:38 ca_and_crl_wifi.pem
-rw-r--r-- 1 root root    1724 May 16 17:24 ca_wifi.pem
-rw-r--r-- 1 root root     743 May 16 17:38 crl_wifi.pem
-rw-r----- 1 root radiusd  245 May 16 17:27 dh
-rwxr-x--- 1 root radiusd  260 May 16 19:11 _Generate.sh
-rw-r--r-- 1 root root    3538 May 16 17:24 motorola001pem
-rw-r--r-- 1 root root    3538 May 16 17:24 motorola002pem
-rw-r----- 1 root radiusd 5120 May 16 17:27 random
-rw-r----- 1 root radiusd 3560 May 16 17:24 server_radius.pem

и...????

moon-duck ()
Ответ на: комментарий от moon-duck
[root@admin certs]# openssl verify -crl_check -CAfile ca_wifi.pem motorola001.pem motorola002.pem
motorola001.pem: /C=RU/ST=***/O=****/CN=motorola001/emailAddress=motorola001
error 3 at 0 depth lookup:unable to get certificate CRL
motorola002.pem: /C=RU/ST=***/O=****/CN=motorola002/emailAddress=motorola002
error 3 at 0 depth lookup:unable to get certificate CRL
[root@admin certs]# openssl verify -crl_check -CRLfile crl_wifi.pem -CAfile ca_wifi.pem motorola001.pem motorola002.pem
usage: verify [-verbose] [-CApath path] [-CAfile file] [-purpose purpose] [-crl_check] [-engine e] cert1 cert2 ...
recognized usages:
        sslclient       SSL client
        sslserver       SSL server
        nssslserver     Netscape SSL server
        smimesign       S/MIME signing
        smimeencrypt    S/MIME encryption
        crlsign         CRL signing
        any             Any Purpose
        ocsphelper      OCSP helper
moon-duck ()
Ответ на: комментарий от thesis

CA это CA, а сертификат сервиса - это сертификат сервиса. Не надо давать сертификату сервиса право на подписывание. Не хочешь подписывать клиентов Root'ом - сгенери подчиненный CA

Санкс, не пробовал, может и прокатит, попробую, ещё раз санкс.

moon-duck ()
Ответ на: комментарий от thesis

Почему нельзя держать црл отдельным файлом?

Кажись дошло. Ты предлагаешь указывать не CAfile а CApath, зарядить там openssl.conf и т.п.?

Вообще - не принципиально, попробую, но если «бонусов» не будет, то глубоко имхо - сливать CA и CRL удобней и практичней...

moon-duck ()
Ответ на: комментарий от moon-duck

Ты предлагаешь указывать не CAfile а CApath, зарядить там openssl.conf и т.п.?

Да я не то чтобы что-то конкретное предлагаю, ибо freeradius'а не держу... Просто он ведь наверняка умеет читать црлы либо из какого-то своего каталога, либо из «системного», какого-нибудь /etc/pki/CA/crl или типа того. Вот и удивляюсь, нафига сливать.
Плюс, думается мне, что при обновлении отдельноголежащего црл-файла радиус не придется рестартить, что есть мелочь, но приятная.
А так - твое дело, конечно.

thesis ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.