Как мне поддерживать проверку подлинности сертификата клиента SSL?

Я хочу делать то, что делает myopenid - после входа в систему вы можете нажать кнопку, которая генерирует сертификат SSL; затем браузер загружает этот сертификат и сохраняет его. Когда вы позже вернетесь на yourid.myopenid.com, ваш браузер сможет использовать сохраненный сертификат для аутентификации, поэтому вам никогда не понадобится пароль.

Итак, мои вопросы: что требуется, чтобы это работало? Как мне сгенерировать сертификаты? Как мне подтвердить их, когда они мне вернут?

Мой стек - это Rails on Apache с использованием Passenger, но я не слишком разборчив.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
14 589
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Их обычно называют сертификатами на стороне клиента.

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

Я нашел это через Сообщение доктора Ника

Зависит от сервера, но самое простое решение, которое я знаю, с использованием Apache:

FakeBasicAuth

"When this option is enabled, the Subject Distinguished Name (DN) of the Client X509 Certificate is translated into a HTTP Basic Authorization username. This means that the standard Apache authentication methods can be used for access control. The user name is just the Subject of the Client's X509 Certificate (can be determined by running OpenSSL's openssl x509 command: openssl x509 -noout -subject -in certificate.crt). Note that no password is obtained from the user... "

Не уверен насчет рельсов, но обычная переменная среды REMOTE_USER должна быть каким-то образом доступна.

Если вы хотите сгенерировать сертификаты, вам нужно заставить клиент сгенерировать пару ключей и отправить вам хотя бы открытый ключ. Вы можете сделать это в Firefox через вызов Javascript, это crypto.generateCRMFRequest. Я предполагаю, что есть методы, специфичные для браузера, доступные и в других браузерах. Но сначала вам нужно выяснить, как выдать сертификат после получения открытого ключа.

Вы можете написать что-нибудь на сервере с помощью OpenSSL, но он имеет встроенную поддержку CSR, а не формата CRMF, который вам отправит Firefox. Так что вам нужно написать код для преобразования CRMF в CSR, что потребует какой-то способности обработки DER ... Я здесь лишь коснулся поверхности - управление CA, даже для игрушечного приложения, нетривиально.

Решения SSO, такие как решения OpenId и PKI, частично совпадают, и в PKI есть элегантность. Но дьявол кроется в деталях, и есть веские причины, по которым этот подход существует уже давно, но только в правительственных и военных приложениях.

Если вы заинтересованы в этом, ответьте на некоторые вопросы, относящиеся к платформе, на которой вы хотели бы развивать свою службу CA.

Вместо этого вы можете просто использовать элемент keygen, whatwg.org/specs/web-apps/current-work/multipage/…

hendry 26.05.2009 11:55

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

Я создал необходимую настройку сервера и плагин firefox для обработки аутентификации на основе сертификатов. Перейдите на mypassfree.com, чтобы скачать бесплатный плагин для Firefox. Напишите мне (ссылка на этой странице) для настройки сервера, так как я еще не упаковал его с хорошим установщиком.

Настройка сервера - Apache2 + OpenSSL + Perl (но вы можете переписать сценарии Perl на любом языке)

Джонатан

Вы можете сгенерировать сертификат в браузере клиента, используя код конкретного браузера. См. этот вопрос

Вы также можете генерировать сертификаты клиентов SSL на стороне сервера, используя OpenSSL в Ruby (увидеть это q). (Это будет работать в любом браузере без кода, специфичного для браузера, но ваш сервер сгенерирует закрытый ключ клиента, что не идеально для крипто-пуристов.)

Какой бы метод вы ни использовали для их создания, вам нужно будет настроить свой веб-сервер так, чтобы он требовал сертификатов клиентов. См. Пример документы Apache.

Генерация CSR (или эквивалент) работает в большинстве популярных браузеров (IE, FF, Chrome, ...), но код, как правило, зависит от браузера. См. Этот ответ: stackoverflow.com/a/9198400/372643

Bruno 29.10.2012 19:12

Отличный ответ, Бруно - я думаю, что это лучший ответ на этот вопрос, чем любой из существующих здесь :-)

Rich 30.10.2012 21:16

Другие вопросы по теме