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

          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走一遍生成一個(gè)自簽證書
          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為有效時(shí)間長(zhǎng)度 單位為秒
          CertificateValidity certificatevalidity = new CertificateValidity(bdate, edate);
          x509certinfo.set("validity", certificatevalidity);
          //設(shè)置有效期域(包含開始時(shí)間和到期時(shí)間)域名等同與x509certinfo.VALIDITY
          x509certinfo.set("serialNumber", new CertificateSerialNumber((int)(date.getTime() / 1000L)));
          //設(shè)置序列號(hào)域
          CertificateVersion cv = new CertificateVersion(CertificateVersion.V3);
          x509certinfo.set(X509CertInfo.VERSION,cv);
          //設(shè)置版本號(hào) 只有v1 ,v2,v3這幾個(gè)合法值
          /**
          *以上是證書的基本信息 如果要添加用戶擴(kuò)展信息 則比較麻煩 首先要確定version必須是v3否則不行 然后按照以下步驟
          **/
          ObjectIdentifier oid = new ObjectIdentifier(new int[]{1,22});
          //生成擴(kuò)展域的id 是個(gè)int數(shù)組 第1位最大2 第2位最大39 最多可以幾位不明....
          byte l = 0x11;//數(shù)據(jù)總長(zhǎng)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);
          // 生成一個(gè)extension對(duì)象 參數(shù)分別為 oid,是否關(guān)鍵擴(kuò)展,byte[]型的內(nèi)容值
          //其中內(nèi)容的格式比較怪異 第一位是flag 這里取4暫時(shí)沒出錯(cuò) 估計(jì)用來說明數(shù)據(jù)的用處的 第2位是后面的實(shí)際數(shù)據(jù)的長(zhǎng)度,然后就是數(shù)據(jù)

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

          X509CertImpl x509certimpl1 = new X509CertImpl(x509certinfo);
          x509certimpl1.sign(cak1.getPrivateKey(), "MD5WithRSA");
          //使用另一個(gè)證書的私鑰來簽名此證書 這里使用 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);
          //使用某個(gè)證書的公鑰驗(yàn)證證書 如果驗(yàn)證不通過 則會(huì)拋錯(cuò)

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

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

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


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

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          技術(shù)

          搜索

          •  

          最新評(píng)論

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

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

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 南京市| 柘城县| 措勤县| 长岛县| 穆棱市| 西华县| 新平| 博兴县| 都匀市| 岱山县| 碌曲县| 锡林浩特市| 山西省| 交口县| 四平市| 正镶白旗| 永清县| 朝阳区| 太保市| 浪卡子县| 山丹县| 滨州市| 临西县| 连平县| 莱州市| 新竹县| 海南省| 北票市| 通山县| 五寨县| 大悟县| 册亨县| 额敏县| 惠东县| 峨边| 镇沅| 石嘴山市| 鄂托克前旗| 上饶县| 常宁市| 栾川县|