eSSL - SSL сертификаты для встраиваемых систем
- X509 v3 |
- subjectAltName |
- ssl |
- security |
- RFC 5280 |
- RFC 3280 |
- openssl |
- eSSL |
- embedded SSL |
- embedded linux |
- commomName |
- Certificate Authority |
- CA
Сертификаты для устройств
Теперь нам нужно создать сертификат конечного пользователя или сервера и подписать его корневым сертификатом, что мы создали в предыдущем разделе. Основная проблема для меня была в том, что мое устройство имеет несколько сетевых интерфейсов, которые подключаются в разные сети и, соответственно, имеют разные IP адреса.
-
Отредактируем наш файл конфигурации openssl.cnf и добавим в конец секции [ usr_cert ] и перед секцией [ v3_req ] следующие, пожалуй, самые важные строки, которые будут решать наши проблемы.
subjectAltName=@alt_names [alt_names] # Имена. Можно указать хоть сколько, главное чтобы цифры после точки были разными. IP.0 = 192.168.10.1 IP.1 = 192.168.1.1 DNS.0 = 192.168.10.1 DNS.1 = 192.168.1.1
Здесь добавляются альтернативные имена которые появились в расширениях версии v3 стандарта x509 и могут быть DNS именем, IP адресом или URI адресом. Их может быть несколько, главное, чтобы отличалась цифра после точки. Опытным путем я установил что FireFox проглатывает имена IP, а IE8 - имена DNS. По этому, нужные нам IP адреса нужно продублировать как IP для FireFox и как DNS для IE8, если, конечно, мы хотим работать и в IE, и в FireFox-е. -
Теперь можно создавать сертификаты. Тут нужно выполнять последовательность вызовов openssl с разными параметрами, чтобы упростить себе жизнь, я написал следующий простой скрипт:
#!/bin/bash echo "*** Create request for sign ***" openssl req -config conf/openssl.cnf -new -keyout certs/$1.pem -out tmp.pem let ret=$? if let "$ret!=0" then rm tmp.pem echo $ret exit 1 fi echo "*** Create RSA key without password ***" openssl rsa -in certs/$1.pem -out certs/$1.key let ret=$? if let "$ret!=0" then rm tmp.pem echo $ret exit 1 fi echo "*** Sign certificate by our own trusted key ***" openssl ca -config conf/openssl.cnf -policy policy_anything -out certs/$1.pem -infiles tmp.pem let ret=$? if let "$ret!=0" then rm tmp.pem echo $ret exit 1 fi rm tmp.pem echo "*** Create certificate ***" openssl x509 -in certs/$1.pem -out certs/$1.crt let ret=$? if let "$ret!=0" then echo $ret exit 1 fi
При запуске ему нужно передавать как параметр имя нового сертификата, например
newcert.sh device
Такой вызов создаст 2 файла device.crt и device.key, т.е. сертификат и ключ к нему. Во время выполнения скрипта будут заданы вопросы о пароле для нового сертификата, а также стране, городе, фирме для кого выпускается сертификат. В поле commonName можно указать любую строку, например My cool device, в обычной практике сюда записывается домен для которого выпускается сертификат, но мы записываем IP адреса (и домены) в раздере альтернативных имен, так что браузеры не ругаются страшными словами, а при просмотре сертификата показывают красивый путь проверки.
Как всё это применять?
Итак, мы создали 2 вида сертификатов, корневой сертификат и сертификат пользователя. Корневой сертификат, как правило, создается один раз и в дальнейшем используется для подписи пользовательских сертификатов, которые мы раздаем пользователям, т.е. помещаем на наши девайсы. Разберемся, как их применять.
Сертификат пользователя и ключ к нему нужно поместить на целевое устройство, у меня это некая плата с ARM контроллером и Linux-ом на борту. Не буду описывать этот процесс, т.к. он зависит от WEBсервера, что у нас там установлен.
А вот корневой сертификат нужно импортировать как корневой сертификат доверенного центра сертификации в каждый браузер пользователя. Только в этом случае браузер не будет показывать предупреждения при заходе на страничку Вашего embedded WEB-сервера.
Импорт корневого сертификата в FireFox 6(Linux)
В FireFox 6 это делается черех меню Preferences -> Encryption -> View Certificates, выбираем вкладку Authorities.
Далее нажимаем Import и открываем файл нашего корневого сертификата ca.crt, на вопрос об использовании, ставим галочку на идентификацию WEB-серверов.
И мы можем лицезреть наш сертификат в списке доверенных центров
Импорт корневого сертификата в IE8 (Windows 7 64bit)
В меню Пуск в строке поиска наберите certmgr и нажмите комбинацию клавиш Ctrl+Shift+Enter, ответьте утвердительно на запрос прав администратора. У Вас запустится менеджер сертификатов.
Дважды кликните на разделе Trusted Root Certification Authorities
Кликните правой кнопкой мыши на Certificates -> All Tasks -> Import...
Запустится мастер импорта сертификатов, следуйте его инструкциям и в качестве сертификата укажите ca.crt. Если в результате получите ошибку
То поправьте ключ в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\SystemCertificates\Root\ProtectedRoots\Flags установите его в 0 и перезапустите менеджер сертификатов.
Заключение
Мы рассмотрели некоторые возможности SSL сертификатов позволяющие идентифицировать систему имеющую несколько IP адресов и/или Доменных имен, а так же рассмотрели простейший сценарий применения сертификатов во встраиваемых системах. Можно ли улучшить этот сценарий? Конечно можно. Например можно сделать так чтобы корневой сертификат генерировался прямо на устройстве и отдавался пользователю по запросу, например на USB Stick. В этом случае кража корневого сертификата не повлечет за собой опастность для подобных устройств у других покупателей. Применение самоподписанных сертификатов, безусловно, не является наилучшей практикой, но иногда для производителей встраиваемых систем это бывает единственный способ обеспечить минимальную безопастность своих устройств.
Часть информации относящуюся к сертификатам пользователей можно использовать и при покупке сертификатов подписываемых доверенными центрами сертификации. В этом случае обеспечивается наивысший уровень безопастности который может обеспечить технология SSL.
Использованные матриалы:
- Создание самоподписанного SSL-сертификата на несколько доменных имён с помощью openssl
- Быстрое поднятие SSL для Apache под FreeBSD
- http://www.openssl.org/docs/
- блог пользователя GDI
- 26920 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Комментарии
Спасибо! Интересно и про
Спасибо! Интересно и про особенности встраиваемых систем, и про сертификаты вообще.
Отправить комментарий