Моя организация планирует перейти на использование клиентских сертификатов для аутентификации на наших внутренних веб-сайтах.Это бизнес среднего размера, который использует 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.Инженер, заботящийся о безопасности, не является большим поклонником того, как я выполнил свою задачу (в частности, я генерировал личные ключи каждого), но у меня не было достаточно времени, чтобы возиться с этим.(