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





Их обычно называют сертификатами на стороне клиента.
Я на самом деле не использовал его, но здесь можно найти модифицированную версию restful-аутентификации здесь, которая выглядит так, как вы после.
Я нашел это через Сообщение доктора Ника
Зависит от сервера, но самое простое решение, которое я знаю, с использованием Apache:
"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.
Я работаю над решением этой проблемы. Я хотел сделать то же самое, и я знаю, что эта функция нужна многим другим владельцам веб-сайтов, независимо от того, со сторонним поставщиком или без него.
Я создал необходимую настройку сервера и плагин firefox для обработки аутентификации на основе сертификатов. Перейдите на mypassfree.com, чтобы скачать бесплатный плагин для Firefox. Напишите мне (ссылка на этой странице) для настройки сервера, так как я еще не упаковал его с хорошим установщиком.
Настройка сервера - Apache2 + OpenSSL + Perl (но вы можете переписать сценарии Perl на любом языке)
Джонатан
Вы можете сгенерировать сертификат в браузере клиента, используя код конкретного браузера. См. этот вопрос
Вы также можете генерировать сертификаты клиентов SSL на стороне сервера, используя OpenSSL в Ruby (увидеть это q). (Это будет работать в любом браузере без кода, специфичного для браузера, но ваш сервер сгенерирует закрытый ключ клиента, что не идеально для крипто-пуристов.)
Какой бы метод вы ни использовали для их создания, вам нужно будет настроить свой веб-сервер так, чтобы он требовал сертификатов клиентов. См. Пример документы Apache.
Генерация CSR (или эквивалент) работает в большинстве популярных браузеров (IE, FF, Chrome, ...), но код, как правило, зависит от браузера. См. Этот ответ: stackoverflow.com/a/9198400/372643
Отличный ответ, Бруно - я думаю, что это лучший ответ на этот вопрос, чем любой из существующих здесь :-)
Вместо этого вы можете просто использовать элемент keygen, whatwg.org/specs/web-apps/current-work/multipage/…