<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    前幾次我已經基本上把如何做CA所需要的基礎知識講得差不多了,今天直接講如何用Java程序來實現一個CA應該就不是什么太困難的事情了.

        要做CA,第一步要準備好自己的證書和私鑰.私鑰如何從文件里面讀取出來前面已經講過了.從文件系統中讀出證書的代碼如下:

        CertificateFactory certCF = CertificateFactory.getInstance("X.509");
        X509Certificate caCert = certCF.generateCertificate(certBIS);

        這里cerBIS是一個InputStream類型的對象.例如一個標準的X509v3格式的證書文件所形成的輸入流.

        第二步就是從用戶那里獲取輸入,然后構造主體名稱結構DN,如何構造DN上次已經說過了,如何從用戶那里獲取輸入,這個不在本文討論范圍之內.

        下一步就是獲取用戶的公鑰,好和他所需要的證書對應起來.也有不少CA的做法就是在這里替用戶現場生成一對密鑰對,然后把公鑰放到證書中簽發給用戶.這個應該看實際需要選擇合適的方式.

        現在一切信息都已經準備好了,可以簽發證書了,下面的代碼說明了這個過程:

        //構造一個證書生成器對象

        X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();

        // 從CA的證書中獲取簽發者的主體名稱(DN)
        // 這里有一點小技巧,我們要把JCE中定義的
        // 用來表示DN的對象X500Principal轉化成在
        // BC Provider中的相應的對象X509Name
        // 先從CA的證書中讀取出CA的DN進行DER編碼
        DERInputStream dnStream =
                     new DERInputStream(
          new ByteArrayInputStream(
           caCert.getSubjectX500Principal().
            getEncoded()));
        // 馬上又從編碼后的字節流中讀取DER編碼對象
        DERConstructedSequence  dnSequence =
         (DERConstructedSequence)dnStream.readObject();
        // 利用讀取出來的DER編碼對象創建X509Name
        // 對象,并設置為證書生成器中的"簽發者DN"
        certGen.setIssuerDN(new X509Name(dnSequence));
        // 設置好證書生成器中的"接收方DN"
        certGen.setSubjectDN(subjectDN);
        // 設置好一些擴展字段,包括簽發者和
        // 接收者的公鑰標識
        certGen.addExtension(X509Extensions.SubjectKeyIdentifier, false,
        createSubjectKeyId(keyToCertify));
        certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false,
        createAuthorityKeyId(caCert.getPublicKey()));
        // 設置證書的有效期和序列號
        certGen.setNotBefore(startDate);
        certGen.setNotAfter(endDate);
        certGen.setSerialNumber(serialNumber);
        // 設置簽名算法,本例中使用MD5hash后RSA
        // 簽名,并且設置好主體的公鑰
        certGen.setSignatureAlgorithm("MD5withRSA");
        certGen.setPublicKey(keyToCertify);

        // 如果以上一切都正常地話,就可以生成證書了
        X509Certificate cert = null;
        cert = certGen.generateX509Certificate(caPrivateKey);

        這里是上面用到的生成簽發者公鑰標識的函數: 

        protected AuthorityKeyIdentifier createAuthorityKeyId(PublicKey pubKey)
        {
        AuthorityKeyIdentifier authKeyId = null;

        try
        {
        ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded());
        SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(
            (DERConstructedSequence)new DERInputStream(bIn).readObject());
        authKeyId = new AuthorityKeyIdentifier(info);
        }
        catch (IOException e)
        {
        System.err.println("Error generating SubjectKeyIdentifier:  " +
            e.toString());
        System.exit(1);
        }

        return authKeyId;
        }

        生成主體公鑰標識的函數和上面的類似,把AuthorityKeyIdentifier替換成SubjectKeyIdentifier就可以了.

        這里要注意的是,CA的公鑰也是在一份證書里,這種證書的特點是簽發者DN和接收者DN一樣,也就是說,這種證書是CA自己給自己頒發的證書,也就是"自 簽名證書",它上面的公鑰是CA自身的公鑰,用來簽名的私鑰就是該公鑰對應的私鑰.一般每個CA都要有這么一份證書,除非該CA不是根CA,即它的權威性 不是由它自己證明,而是由它的上級CA證明.但是,最后總歸要有一個根CA,它為各個安全應用程序的用戶所信賴.

        到這里我們已經把CA最基本的功能如何用Java實現講完了,下一次講如何從PKCS#10格式證書請求文件中讀取出用戶信息,然后直接簽發公鑰.
    posted on 2008-02-13 22:13 禮物 閱讀(560) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。

    網站導航:
     
    主站蜘蛛池模板: 成年女人免费视频播放77777 | 亚洲а∨天堂久久精品| 亚洲国产高清在线精品一区| 久久久国产精品福利免费| 亚洲尤码不卡AV麻豆| 18禁在线无遮挡免费观看网站| 国产成人综合亚洲亚洲国产第一页 | 亚洲av无码不卡久久| 成人影片麻豆国产影片免费观看| 亚洲第一二三四区| 大学生一级毛片免费看| 亚洲人成色99999在线观看| 永久免费av无码网站大全| 亚洲AV无码专区在线观看成人| 国产成人无码免费视频97 | 日韩亚洲Av人人夜夜澡人人爽 | 国产成人综合亚洲一区| 免费一级毛片女人图片| 四虎永久在线精品免费一区二区| 国产乱辈通伦影片在线播放亚洲| 最近的2019免费中文字幕| 1区1区3区4区产品亚洲 | 午夜国产大片免费观看| 亚洲一区二区三区免费| 亚洲国产人成网站在线电影动漫 | 曰皮全部过程视频免费国产30分钟 | 亚洲a∨无码一区二区| 亚洲精品乱码久久久久久蜜桃 | 亚洲精品无码久久久久牙蜜区| 免费观看国产精品| 久久久久免费看黄a级试看| 在线亚洲高清揄拍自拍一品区| 免费中文字幕一级毛片| 久久久久久AV无码免费网站| 久久久久精品国产亚洲AV无码| 免费A级毛片无码A∨男男| 久久综合国产乱子伦精品免费| 亚洲欧美日韩自偷自拍| 亚洲AV中文无码乱人伦下载| 大地资源在线观看免费高清| 最近免费中文字幕MV在线视频3|