Назад | Перейти на главную страницу

Сертификаты клиентов SSL и NginX

Я выполнил инструкции в это сообщение в блоге, но когда я тестирую его с curl, nginx's $ssl_client_verify переменная всегда NONE. По факту, curl даже не дает другого вывода, когда я не указываю --cert и --key варианты вообще. Как будто он игнорирует мои сертификаты. Как я могу это отладить?

Я даже попытался сделать так, чтобы все эти места имели одинаковую ценность:

Если под «Common Name» в сертификатах CA и Server вы имеете в виду полное имя Subject, которое может содержать другие элементы, кроме Common Name, хотя большинство людей, использующих специальные сертификаты SSL, как этот, не беспокоятся о них, это то же самое - не не делай этого. OpenSSL, который используют и nginx, и curl, не может связать дочерний сертификат с родительским сертификатом с таким же именем; это не нормальный случай для X.509 и, по крайней мере, в общем случае может не обрабатываться и в другом программном обеспечении.

  • Сертификат CA должен иметь в качестве Subject (который автоматически также является Issuer, поскольку это корень, см. Ниже) имя, которое является именем CA - это не обязательно должно быть имя домена, но может быть, если вы лайк.
  • Требование и сертификат (SSL) сервера должны иметь в качестве Subject.CommonName доменное имя сервера, которое может быть подстановочным знаком, если сервер имеет несколько, но тесно связанных доменных имен, или IP-адрес, если все клиенты будут обращаться по адресу (что на практике работает, только если все клиенты - ваши очень близкие коллеги или друзья). Имя эмитента в сертификате сервера автоматически устанавливается на имя CA.
  • Точно так же запрос и сертификат каждого клиента должны иметь имя субъекта, отличное от имени CA, а Issuer становится именем CA. Если вы хотите, чтобы клиентские сертификаты надежно идентифицировали клиентов, что предположительно является целью этого упражнения, каждый клиентский сертификат должен иметь имя, отличное от любого другого клиентского сертификата, и предпочтительно отличное от сертификата сервера, чтобы избежать путаницы.

Я считаю, что это должно сработать. Более простой и, вероятно, лучший инструмент тестирования - это командная строка openssl:

openssl s_client -connect $addr:$port -cert $clicert -key $clikey -CAfile $cacert 

который выведет подробную информацию о (предпринятом) подключении SSL / TLS. Если ближе к концу он говорит Acceptable client certificate CA names за которым следует правильное имя вашего CA, сервер правильно настроен для аутентификации клиента (а также для базового SSL). Если у него другое имя или написано No client certificate CA names sent, что-то не так. когда s_client ждет ввода, просто введите EOF (Unix обычно ^ D, Windows ^ Z).

Кроме того: веб-сайт неправильно говорит, что подписание запроса сервера с помощью созданного вами специального ключа CA & cert является «самоподписанием». Самоподпись - это, в частности, подписание сертификата той же парой ключей, публичная половина которой в этом сертификате; на практике это используется только для CA верхнего уровня, называемого «корнем». Вы подписываете сертификат сервера своим собственным ЦС, но не подписываете самостоятельно. Подписывать сертификат сервера с помощью собственного центра сертификации - это плохо, если вы хотите обрабатывать соединения из посторонние люди потому что он не предоставляет им никаких доказательств доверия вашему серверу, как это делает "коммерческий" сертификат сервера от известного центра сертификации, такого как Verisign или GoDaddy. Это обычно относится к производственной среде, а не к тестированию, поскольку тестирование часто используется только разработчиками и / или несколькими бета-тестерами, но некоторые производственные системы также могут быть ограничены несколькими тесно связанными клиентами.

РЕДАКТИРОВАТЬ: получение специального CA (для клиентских сертификатов), подписанного известным CA: это было бы сложно и дорого, и в этом нет необходимости.

Если известный центр сертификации дает вам сертификат «суб-CA» или «промежуточный CA», позволяющий выдавать сертификаты, они делают ставку на будущее их бизнес на ваш безопасность - либо вы должны обеспечить безопасность на том же уровне, что и они (нестандартное оборудование, специализированные здания, круглосуточная охрана, множественный специально обученный и сертифицированный персонал, регулярные внешние аудиты - все дорого) или вам придется выкупать их бизнес (чтобы они больше не подвергались риску). В дополнение к вашему https://security.stackexchange.com/questions/25551/help-understanding-client-certificate-verification видеть:

Но единственные системы, которые должны доверять сертификатам, которые вы выпускаете своим клиентам, - это ваши собственные серверы; пока вы управляете своими собственными серверами, вы просто настраиваете их так, чтобы они доверяли вашему собственному сертификату CA.

Ага, это Маверикс.

Опция -E / - cert также сломалась.

Если я устанавливаю curl с помощью brew и указываю параметр сборки --openssl, он работает.