<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)  編輯  收藏

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

    網站導航:
     
    主站蜘蛛池模板: 久久精品免费一区二区三区| 婷婷亚洲综合五月天小说| 91青青国产在线观看免费| 男人和女人高潮免费网站| 亚洲资源最新版在线观看| 久久香蕉国产线看观看亚洲片| 男人的天堂亚洲一区二区三区 | 特级无码毛片免费视频| 亚洲国产夜色在线观看| 亚洲av无码一区二区三区不卡 | 亚洲av无码一区二区三区四区| 亚洲的天堂av无码| 亚洲国产精品热久久| 亚洲精品无码国产| 久久精品夜色噜噜亚洲A∨| 国产免费观看黄AV片| 免费观看一级毛片| 无码人妻久久一区二区三区免费丨| 一级特黄aa毛片免费观看| 99视频免费在线观看| 日日摸夜夜添夜夜免费视频| 亚洲AV无码资源在线观看| 亚洲欧洲无码一区二区三区| 在线a亚洲老鸭窝天堂av高清| 亚洲婷婷天堂在线综合| 亚洲永久永久永久永久永久精品| 亚洲av无码国产精品色午夜字幕| 亚洲午夜久久久影院伊人| 亚洲中文字幕无码专区| 久久精品国产精品亚洲艾草网美妙| 亚洲第一福利网站在线观看| 亚洲精品综合久久| 久久精品国产精品亚洲下载| 丁香五月亚洲综合深深爱| 亚洲一区二区女搞男| 亚洲va国产va天堂va久久| 无码久久精品国产亚洲Av影片| 久久亚洲AV无码精品色午夜| 亚洲免费在线观看视频| 亚洲日韩一区二区三区| 国产精品无码亚洲一区二区三区|