前面幾篇文章已經把如何用Java實現一個CA基本上講完了.但是他們都有一個特點,就是用戶的信息都是在現場獲取的,不能做申請和簽發相分離.今天我們要講述的是PKCS#10證書請求文件.它的作用就是可以使申請和簽發相分離.
PKCS#10證書請求結構中的主要信息包含了被簽發者(證書申請者)的主體名稱(DN)和他的公鑰.因此一個CA在獲取到一個PKCS#10證書請求后,就可以從中獲取到任何和簽發證書有關的信息,然后用它自己的私鑰簽發證書.
使用BC Provider在Java中構造一個證書請求格式的對象調用其構造函數即可,這個函數如下:
PKCS10CertificationRequest(java.lang.String signatureAlgorithm,
X509Name subject, java.security.PublicKey key, ASN1Set attributes,
java.security.PrivateKey signingKey)
它的參數是自簽名算法,證書申請者的DN,證書申請者的公鑰,額外的屬性集(就是要申請的證書的擴展信息),申請證書者的私鑰.申請證書者的私鑰僅僅是用來進行一下自簽名,并不出現在證書請求中,需要自簽名的目的是保證該公鑰確實為申請者所有.
調用該對象的getEncoded()方法可以將其進行DER編碼,然后儲存起來,該對象還有另一個構造函數:
PKCS10CertificationRequest(byte[] bytes)
這個構造函數的作用就是直接從儲存的DER編碼中把這個對象還原出來.
利用證書請求結構進行證書簽發的代碼如下,這里假設CSR是一個已經獲取出來的PKCS10CertificationRequest結構:
PublicKey SubjectPublicKey = CSR.getPublicKey();
CertificationRequestInfo CSRInfo = CSR.getCertificationRequestInfo();
X509Name SubjectDN = CSRInfo.getSubject();
ASN1Set Attributes = CSRInfo.getAttributes();
這樣,申請者的主體DN,申請者的公鑰,申請者希望在證書擴展信息中填寫的屬性都得到了,剩下的事情就和用戶在現場輸入時一樣了,其它的信息一般是申請者
不能決定的.另外證書請求格式中有一樣信息沒有明確給出來,那就是證書的有效期,這個應該單獨詢問用戶,或者用其它的方法保存起來.