Подписание клиентских сертификатов от Firefox для аутентификации - PullRequest
2 голосов
/ 17 декабря 2011

Моя организация планирует перейти на использование клиентских сертификатов для аутентификации на наших внутренних веб-сайтах.Это бизнес среднего размера, который использует Firefox во всей организации.

Изначально я рассматривал использование JavaScript-функций Firefox window.crypto.generateCRMFRequest() и window.crypto.importUserCertificates() для генерации и подачи заявок на сертификаты, но их использование, по-видимому, совершенно недокументировано.

Для работы window.crypto.importUserCertificates(), Документация MDN утверждает, что любые сертификаты должны иметь соответствующий идентификатор запроса (предположительно сгенерированный с generateCRMFRequest ()) для успешного импорта.Я смог успешно сгенерировать запрос CRMF с помощью window.crypto.generateCRMFRequest(), но не смог выяснить, как сгенерировать ответ сертификации CMMF.

Кажется, что OpenSSL не поддерживает запросы CRMF, но он может читать ASN.1 запрос:

$ cat example.crmf
 MIIBiDCCAYQwgesCBF7ts6IwgcmAAQKlEDAOMQwwCgYDVQQDEwN2dnamgZ8wDQYJ
 KoZIhvcNAQEBBQADgY0AMIGJAoGBAME59JllBjW38By5ECaTatTd1hHY3Mrmzd+Z
 pm3XrLbS8u0A4kkFozm/Yrrwzzl4w/mdJwNxuOv+5CMr3u9VFDHj5SPOgSBUlR/v
 f9x9kqPVUeD21Rkv6YkS0flg8LpU22PMZgw1PtnbVXDGrkUvXr0ygF2En5ZvaL47
 hhZEZn3DAgMBAAGpEDAOBgNVHQ8BAf8EBAMCBeAwFzAVBgkrBgEFBQcFAQEMCHJl
 Z1Rva2VuoYGTMA0GCSqGSIb3DQEBBQUAA4GBAHx/KinpGg0+kjmF9ThduXDMuv9c
 d2qE4xiCqsrEbLScCtrk+4RNnthRnQ7UXGSSwTYh/gJs0LAr4EFSvWJEnNeKNY2V
 RqUD1LERr1pnTcGzZR5SCbQ6ASKqi99BgvoidAyYtAhrgLbttLIdsgHBldV8vOlL
 MUi5Ya1etnfZHsTt 

$ base64 -d example.crmf > example.der
$ openssl asn1parse -in example.der -inform der
 0:d=0  hl=4 l= 392 cons: SEQUENCE          
 4:d=1  hl=4 l= 388 cons: SEQUENCE          
 8:d=2  hl=3 l= 235 cons: SEQUENCE          
 11:d=3  hl=2 l=   4 prim: INTEGER           :5EEDB3A2
 17:d=3  hl=3 l= 201 cons: SEQUENCE          
 20:d=4  hl=2 l=   1 prim: cont [ 0 ]        
 23:d=4  hl=2 l=  16 cons: cont [ 5 ]        
 25:d=5  hl=2 l=  14 cons: SEQUENCE          
 27:d=6  hl=2 l=  12 cons: SET               
 29:d=7  hl=2 l=  10 cons: SEQUENCE          
 31:d=8  hl=2 l=   3 prim: OBJECT            :commonName
 36:d=8  hl=2 l=   3 prim: PRINTABLESTRING   :vvv
 41:d=4  hl=3 l= 159 cons: cont [ 6 ]        
 44:d=5  hl=2 l=  13 cons: SEQUENCE          
 46:d=6  hl=2 l=   9 prim: OBJECT            :rsaEncryption
 57:d=6  hl=2 l=   0 prim: NULL              
 59:d=5  hl=3 l= 141 prim: BIT STRING        
 203:d=4  hl=2 l=  16 cons: cont [ 9 ]        
 205:d=5  hl=2 l=  14 cons: SEQUENCE          
 207:d=6  hl=2 l=   3 prim: OBJECT            :X509v3 Key Usage
 212:d=6  hl=2 l=   1 prim: BOOLEAN           :255
 215:d=6  hl=2 l=   4 prim: OCTET STRING      [HEX DUMP]:030205E0
 221:d=3  hl=2 l=  23 cons: SEQUENCE          
 223:d=4  hl=2 l=  21 cons: SEQUENCE          
 225:d=5  hl=2 l=   9 prim: OBJECT            :id-regCtrl-regToken
 236:d=5  hl=2 l=   8 prim: UTF8STRING        :regToken
 246:d=2  hl=3 l= 147 cons: cont [ 1 ]        
 249:d=3  hl=2 l=  13 cons: SEQUENCE          
 251:d=4  hl=2 l=   9 prim: OBJECT            :sha1WithRSAEncryption
 262:d=4  hl=2 l=   0 prim: NULL              
 264:d=3  hl=3 l= 129 prim: BIT STRING        

Это разочаровывает, потому что у сайта стартсла нет проблем с ними.

Итак, мой вопрос: Какая магия должна происходить на стороне серверадля обработки запросов CRMF и выдачи сертификатов, которые можно импортировать с помощью window.cypto.importUserCertificates()?

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

1 Ответ

1 голос
/ 18 декабря 2011

Если вы можете использовать Java на стороне сервера, вот Gist, который показывает, как читать содержимое запроса CRMF с помощью BouncyCastle: https://gist.github.com/503932

Затем вы должны рассматривать его более или менее как CSR с точки зрения CA (т. Е. Получить материал с открытым ключом, связать его с идентификацией, которую вы проверили извне, и подписать пакет как сертификат.)

В этом классе MiniCaCertGen есть примеры выдачи сертификатов. Он берет код из этого сценария , который может работать (для IE на XP и Vista / 7, которые имеют разные API), а также использовать <keygen/>. Не должно быть слишком сложно адаптировать этот код для обработки запросов CRMF. Кроме того, насколько я помню, Firefox все равно поддерживает старый <keygen/> (и он вернулся на сцену для HTML 5).

Вас также могут заинтересовать существующие решения, такие как OpenCA .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...