posts - 3,  comments - 1,  trackbacks - 0
          /**
          *代碼實例 通過反編譯查看keytool的java code獲得的數(shù)字證書的內(nèi)部生成方法
          *推薦使用jdk1.5
          **/
          1。首先生成selfcert
          CertAndKeyGen cak = new CertAndKeyGen("RSA","MD5WithRSA",null);
          //參數(shù)分別為 公鑰算法 簽名算法 providername(因為不知道確切的 只好使用null 既使用默認(rèn)的provider)
          cak.generate(1024);
          //生成一對key 參數(shù)為key的長度 對于rsa不能小于512
          X500Name subject = new X500Name("CN=simic,o=shanghai");
          //subject name
          X509Certificate certificate = cak.getSelfCertificate(subject,10);
          // 后一個long型參數(shù)代表從現(xiàn)在開始的有效期 單位為秒(如果不想從現(xiàn)在開始算 可以在后面改這個域)

          BASE64Encoder base64 = new BASE64Encoder();
          FileOutputStream fos = new FileOutputStream(new File("d:\\test.crt"));
          base64.encodeBuffer(certificate.getEncoded(), fos);
          //生成cert文件 base64加密 當(dāng)然也可以不加密

          2。生成非自簽的cert
          首先按照1走一遍生成一個自簽證書
          byte certbytes[] = certificate.getEncoded();
          X509CertImpl x509certimpl = new X509CertImpl(certbytes);
          X509CertInfo x509certinfo = (X509CertInfo)x509certimpl.get("x509.info");
          X500Name issuer = new X500Name("CN=fatal,o=shanghai");
          x509certinfo.set("issuer.dname",issuer);
          //設(shè)置issuer域
          Date bdate = new Date();
          Date edate = new Date();
          edate.setTime(bdate.getTime() + validity * 1000L * 24L * 60L * 60L);
          //validity為有效時間長度 單位為秒
          CertificateValidity certificatevalidity = new CertificateValidity(bdate, edate);
          x509certinfo.set("validity", certificatevalidity);
          //設(shè)置有效期域(包含開始時間和到期時間)域名等同與x509certinfo.VALIDITY
          x509certinfo.set("serialNumber", new CertificateSerialNumber((int)(date.getTime() / 1000L)));
          //設(shè)置序列號域
          CertificateVersion cv = new CertificateVersion(CertificateVersion.V3);
          x509certinfo.set(X509CertInfo.VERSION,cv);
          //設(shè)置版本號 只有v1 ,v2,v3這幾個合法值
          /**
          *以上是證書的基本信息 如果要添加用戶擴(kuò)展信息 則比較麻煩 首先要確定version必須是v3否則不行 然后按照以下步驟
          **/
          ObjectIdentifier oid = new ObjectIdentifier(new int[]{1,22});
          //生成擴(kuò)展域的id 是個int數(shù)組 第1位最大2 第2位最大39 最多可以幾位不明....
          byte l = 0x11;//數(shù)據(jù)總長17位
          byte f = 0x04;
          String userData = "hohohohohahahahah";
          byte[] bs = new byte[userData.length()+2];
          bs[0] = f;
          bs[1] = l;
          for(int i=2;i<bs.length;i++)
          {
            bs[i] = (byte)userData.charAt(i-2);
          }
          Extension ext = new Extension(oid,true,bs);
          // 生成一個extension對象 參數(shù)分別為 oid,是否關(guān)鍵擴(kuò)展,byte[]型的內(nèi)容值
          //其中內(nèi)容的格式比較怪異 第一位是flag 這里取4暫時沒出錯 估計用來說明數(shù)據(jù)的用處的 第2位是后面的實際數(shù)據(jù)的長度,然后就是數(shù)據(jù)

          CertificateExtensions exts = new CertificateExtensions();
          exts.set("aa",ext);
          //如果有多個extension則都放入CertificateExtensions 類中,
          x509certinfo.set(X509CertInfo.EXTENSIONS,exts);
          //設(shè)置extensions域

          X509CertImpl x509certimpl1 = new X509CertImpl(x509certinfo);
          x509certimpl1.sign(cak1.getPrivateKey(), "MD5WithRSA");
          //使用另一個證書的私鑰來簽名此證書 這里使用 md5散列 用rsa來加密

          BASE64Encoder base64 = new BASE64Encoder();
          FileOutputStream fos = new FileOutputStream(new File("d:\\test.crt"));
          base64.encodeBuffer(x509certimpl1.getEncoded(), fos);
          //生成文件
          x509certimpl1.verify(cak.getPublicKey(),null);
          //使用某個證書的公鑰驗證證書 如果驗證不通過 則會拋錯

          很多地方?jīng)]仔細(xì)測過 可能有不正確之處還請多包涵

          posted on 2005-10-20 17:03 夜來風(fēng)雨聲 閱讀(585) 評論(0)  編輯  收藏 所屬分類: Java

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


          網(wǎng)站導(dǎo)航:
           

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          技術(shù)

          搜索

          •  

          最新評論

          • 1.?re: Tomcat ssl配置補(bǔ)充
          • 您好:
            我也出現(xiàn)了這樣的問題
            keytool錯誤: java.lang.Exception: 無法從回復(fù)中建立鏈接

            具體是怎么解決的?能解釋一下么?謝謝了
          • --benben

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 玛纳斯县| 将乐县| 无为县| 科尔| 大连市| 呼玛县| 进贤县| 西和县| 兴宁市| 太仓市| 塔河县| 疏勒县| 息烽县| 阳山县| 南溪县| 砀山县| 拜城县| 安图县| 广宗县| 阳新县| 抚松县| 古田县| 司法| 永昌县| 富阳市| 新密市| 抚远县| 麟游县| 阜南县| 昭通市| 延庆县| 淮南市| 博兴县| 张家口市| 南丹县| 门头沟区| 杭州市| 龙口市| 临海市| 公主岭市| 正宁县|