package com.ylsoft.cert ؛ import java.io.file ؛ استيراد java.io.fileinputstream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.security.invalidkeyexception java.security.keystore ؛ استيراد java.security.keystoreException ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.security.nosuchproviderexception ؛ استيراد java.security.privinkey java.security.signatureexception ؛ استيراد java.security.unreCoverableKeyexception ؛ استيراد java.security.cert.certificate ؛ استيراد java.security.cert.certificateException ؛ استيراد java.security.cert.x509certificate ؛ sun.misc.base64encoder ؛ import sun.security.util.objectidentifier ؛ import sun.security.x509.algorithmid ؛ import sun.security.x509 sun.security.x509 Sun.Security.x509.KeyusageStense ؛ استيراد Sun.Security.x509首先生成 ca 的根证书 , 然后有 ca 的根证书签署生成 scriptx 的证书 * * Author Administrator * */public class genx509cert {/** 提供强加密随机数生成器 (rng) * */private securerandom sr ؛ public genx509cert () rewrows nosuchalgorithmexception ، nosuchproviderexception {// 返回实现指定随机数生成器 (rng) Securerandom.getInstance ("Sha1prng" ، "Sun") ؛} public void createCert (X509Certificate Certificate ، privatekey rootprivkey ، keypair kp) shrowsexception ، cignatureexception ، invalidKeyexception ، nosuchalgorithmexception ، nosuchprovidexception ، certbyte certbytes [] = certificate.getencoded () ؛ // تمثل فئة X509CertImpl شهادة X.509 (x509certinfo) x509certimpl.get ("x509 DEFIRESTESTENTENSINES () ؛ certificateExtensions.set ("thisionKeyIndifier" ، new thispeyideideIrefiErextension ((new keyidentifier (kp.getpublic ())). X500NAME ("cn = rootca ، ou = hackwp ، o = wp ، l = bj ، s = bj ، c = cn") ؛ x509certinfo.set ("issuer.dname" ، issuer) ؛ // يبني اسمًا من سلسلة من التنسيق تقليديًا ، مثل "cn = dave ، ou = javastists". (RFC 1779 أو RFC // 2253 نمط) .x500NAME موضوع = جديد X500NAME ("CN = ScriptX ، OU = WPS ، O = WPS ، L = BJ ، ST = BJ ، C = CN") signature.getInstance ("md5withrsa") ؛ // 初始化这个用于签名的对象。如果使用其他参数再次调用此方法 , 此调用的结果将无效。signature.initsign (kp.getPrivin ()) ؛ المصدر) ؛ // تحدد هذه الفئة الخوارزميات ، مثل تحويلات التشفير ، // قد يرتبط كل منها بالمعلمات. CertificAtealGorithMid (خوارزميد)) ؛ // 开始时间 التاريخ bdate = تاريخ جديد () ؛ // 结束时间 التاريخ edate = new date () ؛ // 天 天 小时 秒 毫秒 edate.Settime صالحة. 证书的有效时间 شهادة الشهادة cergencevalidity = شهادة جديدة (bdate ، edate) ؛ x509certinfo.set ("الصلاحية" ، الشهادة) ؛ شهادات iserialNumber ((int) (تاريخ جديد ()则比较麻烦 首先要确定 首先要确定 الإصدار 必须是 v3 否则不行 否则不行 */objectIndyfier oid = new ObjectIdenFier (new int [] {2 ، 5 ، 29 ، 15}) ؛ // 生成扩展域的 生成扩展域的 是个 是个 是个 数组 第 1 位最大 2 第 2 位最大 39 最多可以几位不明 .... string userdata = userData.length () ؛ // 数据总长 17 位 byte f = 0x04 ؛ byte [] bs = new byte [userData.Length () + 2] ؛ bs [0] = f ؛ bs [1] = l ؛ for (int i = 2 ؛ أنا <bs.length ؛ i ++) {bs [i] = (byte) userData.charat ( keyusagextension () ؛ keyusage.set (keyusagextense.digital_signature ، true) ؛ keyusage.set (keyusagextension.non_repudiation ، true) ؛ keyusage.set (keyusageextension.key_encipherment ، true) ؛ keyusage.set (keyusagextense.data_encipherment ، ObjectIdenceIder (new int [] {1 ، 3 ، 6 ، 1،5 ، 5 ، 7 ، 3 ، 3}) ؛ متجه <ObjectIdenFier> vkeyoid = new vector <ObjectIdenFier> () CertificateStextensions () ؛ exts.set ("keyusage" ، keyusage) ؛ exts.set ("ExtendedKeyusage" ، exkeyusage) ؛ // 如果有多个 则都放入 则都放入 certificateExtensions 类中 , x509certinfo.set (x509certinfo.extensions ، exts) ؛ x509certimpl (x509certinfo) ؛ x509certimpl1.sign (rootprivkey ، "md5withrsa") ؛ // 使用另一个证书的私钥来签名此证书 这里使用 md5 散列 用 用 rsa 来加密 base64encoder base64 = new base64encoder () ملف ("f: //scriptx.crt")) ؛ base64.encodeBuffer (x509Certimpl1.getenCoded () ، fos) ؛ حاول {certicate [] certchain = {x509certimpl1} ؛ certchain ، "f: //scriptx.pfx") ؛ fileInputStream in = new FileInputStream ("f: //scriptx.pfx") ؛ keystore inputKeyStore = keystore.getInstance ("pkcs12") ؛ inputkeystore.load (في ، "123456". inputKeystore.getCertificate ("scriptx") ؛ system.out.print (cert.getPublicKey ()) ؛ privatekey privk = (privatekey) inputKeyStore.getKey ("scriptx" ، "123456" .THARARARRAY () ؛ ملف ("f: //scriptx.pvk")) ؛ privkfos.write (privk.getencoded ()) ؛ system.out.print (privk) ؛ // base64.encode (key.getencoded () ، privkfos) ؛ in.close () ؛生成文件 x509certimpl1.Verify (Certificate.getPublicKey () ، null) ؛}/** * 保存此根证书信息 keystore تبادل المعلومات الشخصية * * param alias * param privEkey * param pwd * plaram certchain * param filepath * throws iscarter */public void savepfx (string alias ، يلقي الاستثناء {// 此类表示密钥和证书的存储设施。// 返回指定类型的 keystore 对象。此方法从首选 Provider 开始遍历已注册安全提供者列表。返回一个封装 keystorespi // 实现的新 keystore 对象 , 该实现取自第一个支持指定类型的 provider。keystore outportkeystore = keystore.getInstance ("pkcs12") ؛ system.out.println ("keystore : : :" + outputekestore.gettype () ؛ keystore (例如 , 驻留在硬件标记设备上的 驻留在硬件标记设备上的 keystore) 或检验 // keystore 数据的完整性。如果没有指定用于完整性检验的密码 , 则不会执行完整性检验。如果要创建空 则不会执行完整性检验。如果要创建空 // keystore , 或者不能从流中初始化 keystore , 则传递 null 作为 dream 的参数。注意 的参数。注意 如果此 keystore // 已经被加载 已经被加载 那么它将被重新初始化 并再次从给定输入流中加载。 java.security.privatekey , 则它必须附带证明相应公钥的证书链。如果底层 keystore 实现的类型为 // jks , 则必须根据 则必须根据 pkcs #8 标准中的定义将 المفتاح 编码为 // encryptedPrivateKeyinfo 。如果给定别名已经存在 则与别名关联的 则与别名关联的 keystore // 信息将被给定密钥 信息将被给定密钥 还可能包括证书链) 重写。 outputeputekestore.setkeentry (alias ، privkey PKE = new // keystore.privatekeyentry (kp.getPrivate () ، certchain) ؛ // keystore.passwordprotection password = new // keystore.passwordprotection ("123456". keystore 存储到给定输出流 , 并用给定密码保护其完整性。outputkeystore.store (Out ، pwd.tochararray ()) ؛ out.close () ؛ keystore.getInstance ("jks") ؛ system.out.println (outputKeyStore.getType ()) ؛ outputkeystore.load (null ، pwd.tochararray ()) ؛ keystore.privatekeyentry (kp.getPrivate () ، certchain) ؛ // keystore.passwordprotection password = new // keystore.passwordprotection ("123456" .tochararray () pwd.tochararray ()) ؛ out.close () ؛}/** * 颁布根证书 颁布根证书 自己作为 ca * * throws nosuchalgorithMexception * throws nosuchproviderexception * thernexpiceException * @throws craterekeexpection nosuchalgorithmexception ، nosuchproviderexception ، invalidKeyException ، ioException ، certaTeException ، SignatureException ، unretableKeyException {// 参数分别为公钥算法、签名算法 providername (因为不知道确切的 因为不知道确切的 只好使用 null 既使用默认的 provider) // إنشاء زوج من المفاتيح ، وتوفير الوصول إلىها. "md5withrsa" ، null) ؛ // يضع مصدر الأرقام العشوائية المستخدمة عند إنشاء مفاتيح. ج = لنا ". (RFC 1779 أو RFC // 2253 نمط) X500NAME موضوع = جديد X500NAME ("CN = ROUTCA ، OU = HACKWP ، O = WP ، L = BJ ، S = BJ ، C = CN") ؛ الشهادة // صالحة على الفور. لا توجد ملحقات. وفقًا لذلك ، لن يتم قبولهم دائمًا من قبل // أطراف أخرى. ومع ذلك ، فإن مثل هذه الشهادات مفيدة أيضًا عندما تكون // تمهيد البنية التحتية للأمان ، أو نظام نشر/// نماذج أولية. 自签名的根证书 x509Certificate Certificate = cak.get.getselfificate (seffice ، date () ، 3650 * 24L * 60L * 60L) ؛ X509Certificate []] cak.getPrivateKey () ، "123456" ، certs ، "f: //rootca.pfx") ؛} catch (استثناء e) {e.printstacktrace () ؛} // 后一个 long 型参数代表从现在开始的有效期 单位为秒 (如果不想从现在开始算 可以在后面改这个域) base64encoder base64 = new base64encoder () ملف ("f: //rootca.crt")) ؛ // fos.write (certificate.getencoded ()) ؛ // 生成 ()) cert 文件 base64 加密 当然也可以不加密 base64.encodebuffer (certificate.getencoded () ، fos) ؛ fos.close () ؛ IoException ، intrecableKeyException ، invalidKeyException ، nosuchproviderexception ، signatureException {try {keystore ks = keystore.getInstance ("pkcs12") ؛ fileInputStream ksfis = new FileInputStream ("f: //rotca.pfx") ؛ "123456". tochararray () ؛ char [] keypwd = "123456". tochararray () ؛ // 从给定输入流中加载此 keystore。ks.load (ksfis ، storepwd) ؛ ksfis.close () ؛ // 返回与给定别名关联的密钥 (私钥) , , setkeyentry , 或者以 或者以 或者以 或者以 或者以 , , , 或者以 , , , , 为参数的 为参数的 为参数的 为参数的 为参数的 为参数的 为参数的 为参数的 , setkeenkeentry (privatekey) ks.getkey ("rootca" ، keypwd) ؛ // 返回与给定别名关联的证书。如果给定的别名标识通过调用 setCertificateEntry 创建的条目 , 或者通过调用以 // trustedCertificateEntry 为参数的 setentry // 创建的条目 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 setKeyentry 创建的条目 , 或者通过调用以 或者通过调用以 // privatekeyentry 为参数的 getentry 创建的条目 则返回该条目中证书链的第一个元素。 则返回该条目中证书链的第一个元素。 则返回该条目中证书链的第一个元素。x509certificate = KS.GetCertificate ("ROOTCA") ؛ CreateCert (الشهادة ، privk ، genkey ()) ؛} catch (keystoreException e) {// todo catch catch blocke.printstacktrace () ؛}} المفاتيح العامة () keypairgenate kpg kpg = keypairgenerator.getInstance ("rsa") ؛ kpg.initialize (1024 ، sr) ؛ system.out.print (kpg.getalgorithm ()) ؛ keypair kp = kpg.generatekeypair () ؛ return kp ؛} main static main (string [] {try {try {genx50 genx509cert () ؛ gcert.createRootca () ؛ gcert.signcert () ؛} catch (استثناء e) {// todo catch blocke.printstacktrace () ؛}}}以上这篇纯 Java 实现数字证书生成签名的简单实例就是小编分享给大家的全部内容了 , 希望能给大家一个参考 , 也希望大家多多支持武林网。