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