eSSL - SSL сертификаты для встраиваемых систем

Сертификаты для устройств

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

  1. Отредактируем наш файл конфигурации 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-е.
  2. Теперь можно создавать сертификаты. Тут нужно выполнять последовательность вызовов 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.

Использованные матриалы:

ПредпросмотрAttachmentSize
openssl-dev.cnf10.95 КБ

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Спасибо! Интересно и про

Спасибо! Интересно и про особенности встраиваемых систем, и про сертификаты вообще.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <p> <span> <s> <strike> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <caption> <tbody> <tr> <td> <em> <b> <u> <i> <strong> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike>
  • Использовать как разделитель страниц.

Подробнее о форматировании