firefox - 从 Firefox 签署客户端证书以进行身份​​验证

标签 firefox ssl openssl authentication

我的组织正在寻求转向使用客户端证书在我们的内部网站上进行身份验证。这是一家在整个组织中使用 Firefox 的中型企业。

我最初考虑使用 Firefox 的 window.crypto.generateCRMFRequest()window.crypto.importUserCertificates() javascript 函数来生成和注册证书请求,但是它们的使用似乎完全没有记录。

要使 window.crypto.importUserCertificates() 正常工作,MDN's documentation声称任何证书都必须具有相应的请求 ID(推测是使用 generateCRMFRequest() 生成的)才能成功导入。我能够使用 window.crypto.generateCRMFRequest() 成功生成 CRMF 请求,但无法弄清楚如何生成 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        

令人沮丧的是,startssl 的站点没有问题。

所以,我的问题是:服务器端必须发生什么魔法才能处理 CRMF 请求并颁发可以使用 window.cypto.importUserCertificates() 导入的证书?

注意:这个问题现在纯粹是出于好奇,我已经通过使用 OpenSSL 自己生成每个证书解决了我的身份验证问题。我这个有安全意识的工程师不太喜欢我完成任务的方式(具体来说,我生成了每个人的私钥),但没有足够的时间来修改这个。 :(

最佳答案

如果您可以在服务器端使用 Java,这里有一个 Gist,展示了如何使用 BouncyCaSTLe 读取 CRMF 请求的内容:https://gist.github.com/503932

从 CA 的角度来看,您应该或多或少地将其视为 CSR(即获取公钥 Material ,将其绑定(bind)到您在带外验证的身份并将 bundle 签名为证书。)

这个MiniCaCertGen里面有例子类颁发证书。它从这个 script 中获取代码, 它可以工作(对于具有不同 API 的 XP 和 Vista/7 上的 IE),以及使用 <keygen/> .调整该代码来处理 CRMF 请求应该不会太困难。另外,据我所知,Firefox 仍然支持旧的 <keygen/>无论如何(它又回到了 HTML 5 的场景中)。

您可能还对现有解决方案感兴趣,例如 OpenCA .

关于firefox - 从 Firefox 签署客户端证书以进行身份​​验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8547503/

相关文章:

linux - 如何通过命令行在 VPS 上安装 Firefox?

html - Firefox:删除表格单元格周围的线

ssl - 拒绝所有带有 nginx 和 ssl 的子域。

windows - 如何在 Windows x64 上使用 openSSL 和 nghttp2 编译 cURL?

ios - 带有 openssl 加密数据的 NSString initWithBytes 使用 NSUTF8StringEncoding 返回 nil

css - 1px margin 差异 FF & Opera vs Chrome (Mac)

javascript - 为什么在 FireFox 中单击按钮时文件打开对话框会打开两次

android - 如何使用 Flash Builder 更新您的自签名证书 p12

Python ssl 服务器报告 TLSV1_ALERT_UNKNOWN_CA

c - 使用 CAPI 时是否有 ENGINE_load_private_key() 的替代品?