2011-12-17 204 views
2

我的組織正在尋求在我們的內部網站上使用客戶端證書進行身份驗證。這是一個在整個組織中使用Firefox的中型企業。從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自己生成每個證書來解決我的身份驗證問題。我身上的安全意識型工程師並不是我完成任務的方式(特別是,我產生了每個人的私鑰),但沒有足夠的時間去鼓搗這個。 :(

回答

1

如果你能在服務器端使用Java,這裏是一個要點,演示如何使用BouncyCastle的讀取CRMF請求的內容:https://gist.github.com/503932

然後,您應該或多或少像對待它從CA的角度來看CSR(即獲取公鑰材料,將其綁定到您已驗證出帶外的身份並將其作爲證書籤名。)

MiniCaCertGen類中有一些示例可頒發證書。它需要從這個script的代碼,它可以工作(對於XP和Vista/7上的IE,它們具有不同的API),以及使用<keygen/>。使用該代碼來處理CRMF請求也不是太困難。另外,據我所知,Firefox仍然支持舊的<keygen/>(並且它現在回到了HTML 5的現場)。

您可能還對現有解決方案感興趣,例如OpenCA

相關問題