แพ็คเกจ com.ylsoft.cert; นำเข้า 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.privatekey; java.security.signatureexception; นำเข้า Java.security.unrecoverable KeyException; นำเข้า Java.security.cert.certificate; นำเข้า Java.security.cert.certificatexception; นำเข้า Java.security.cert.x509certificate; sun.misc.base64encoder; นำเข้า Sun.security.util.objectidentifier; นำเข้า Sun.security.x509.algorithmid; นำเข้า Sun.security.x509. sun.security.x509.CertificateSerialNumber; นำเข้า Sun.Security.x509.Certificatevalidity; นำเข้า Sun.Security.x509.Certificateversion; นำเข้า Sun.security.x509.Certificatex509Key; Sun.security.x509.KeyIdentifier; นำเข้า Sun.Security.x509.KeyUsageExtension; นำเข้า Sun.Security.x509.SubjectKeyIdentifierextension; นำเข้า Sun.Security.x509.x500Name; นำเข้า Sun.Security.x509.x500Signer; sun.security.x509.x509certinfo;/** * 首先生成 ca 的根证书, 然后有 ca 的根证书签署生成 scriptx 的证书 * * @author adminstrator * */คลาสสาธารณะ Genx509cert {/** 提供强加密随机数生成器 (rng) */ส่วนตัว返回实现指定随机数生成器 (rng) 算法的 securerandom 对象。sr = securerandom.getInstance ("sha1prng", "sun");} โมฆะสาธารณะ createcert (x509certificate ใบรับรอง, private Key Rootprivkey, keypair kp) Signatureexception {// X.509 V1 证书的抽象类。此类提供了一种访问 X.509 V1 证书所有属性的标准方式。BYTE CERTBYTES [] = CERTIVETE.GETENCODED (); // คลาส X509CERTIMPL แสดงถึงใบรับรอง X.509 X509CERTIMPL X509CERTIMPL = ใหม่ X509CERTIMPL (CERTBYTES); Information.x509CertInfo x509CertInfo = (x509CertInfo) x509certimpl.get ("x509.info"); // คลาสนี้กำหนดแอตทริบิวต์ x509key สำหรับ certificate.x509certinfo.set ("key" CertificateCertificateTensions CertificateExtensions = ใหม่ CertificateExtensions (); CertificateExtensions.set ("ProjectionKeyIdentifier", ใหม่ KeyIdentifierextension ((keyidentifier ใหม่ (kp.getPublic ()). GetIdentifier ());设置ผู้ออก域 x500Name issuer = ใหม่ x500Name ("cn = rootca, ou = hackwp, o = wp, l = bj, s = bj, c = cn"); O = Sun Microsystems, C = US " (RFC 1779 หรือ RFC // 2253 สไตล์) .x500Name subject = ใหม่ x500Name ("cn = scriptx, ou = wps, o = wps, l = bj, st = bj, c = cn"); x509CertInfo.set ("หัวเรื่อง Signature.getInstance ("MD5WithRSA"); // 初始化这个用于签名的对象。如果使用其他参数再次调用此方法, 此调用的结果将无效。signature.initsign (kp.getPrivate ()); // คลาสนี้ให้การเชื่อมโยงระหว่างวัตถุลายเซ็นและการลงชื่อเข้าใช้ X.500 ผู้ออก); // คลาสนี้ระบุอัลกอริทึมเช่นการแปลงเข้ารหัส, // ซึ่งแต่ละอันอาจเกี่ยวข้องกับพารามิเตอร์อัลกอริทึมอัลกอริทึมอัลกอริทึม = signer.getAlgorithmid (); // คลาสนี้กำหนดอัลกอริธึมมิดสำหรับใบรับรอง CertificateAlgorithMid (อัลกอริทึม)); // 开始时间วันที่ bdate = วันที่ใหม่ (); // 结束时间วันที่ edate = วันที่ใหม่ (); // 天毫秒毫秒毫秒毫秒 ed 毫秒毫秒毫秒ถูกต้อง证书的有效时间 CertificateValidity CertificateValidity = CertificateValidity ใหม่ (BDate, Edate); x509CertInfo.set ("ความถูกต้อง", CertificateValidity); // คลาสนี้กำหนดแอตทริบิวต์ serialnumber -humptial.// 设置有效期域(包含开始时间和到期时间 设置有效期域(包含开始时间和到期时间) CertificateserIalNumber ((int) (วันที่ใหม่ (). getTime ()/ 1000L))); // 设置序列号域คลาสนี้กำหนดเวอร์ชันของใบรับรอง x509.certificateVersion CV = ใบรับรองใหม่ (CertificateVersion.v3); , v2, v3 这几个合法值/** * 以上是证书的基本信息如果要添加用户扩展信息首先要确定首先要确定首先要确定首先要确定首先要确定首先要确定首先要确定必须是 v3 否则不行 */objectidentifier oid = objectIdier ใหม่ (ใหม่ int [] {2, 5, 29, 15}); // 生成扩展域的 id 是个 int 数组 1 位最大 2 第 2 位最大39最多可以几位不明(f0) "; byte l = (byte) userdata.length (); // 数据总长 17 位 byte f = 0x04; byte [] bs = ไบต์ใหม่ [userdata.length () + 2]; bs [0] = f; bs [1] = l; สำหรับ (int i = 2; ฉัน <bs.length; i ++) {bs [i] = (byte) userdata.charat (i - 2);} extension ext = ส่วนขยายใหม่ (oid, true, bs); // 生成一个ส่วนขยาย对象,,,,,,,,,, keyusageextension (); keyusage.set (keyusageextension.digital_signature, true); keyusage.set (keyusageextension.non_repudiation, true); keyusage.set (keyusageextension.key_encipherment ObjectIdentifier (ใหม่ int [] {1, 3, 6, 1,5, 5, 7, 3, 3}); เวกเตอร์ <ObjectIdentifier> VKEYOID = เวกเตอร์ใหม่ <ObjectIdentifier> (); vkeyoid.add (ekeyoid); CertificateExtensions (); exts.set ("keyusage", keyusage); exts.set ("extendedkeyusage", exkeyusage); // 如果有多个ส่วนขยาย则都放入 CertificateExtensions 类中 x509CertInfo.set (x509CertInfo.extensions x509Certimpl (x509CertInfo); x509certimpl1.sign (rootprivkey, "md5withrsa"); // 使用另一个证书的私钥来签名此证书 md5 散列 rsa 来加密 base64enencoder base64 = new base64encoder () ไฟล์ ("f: //scriptx.crt")); base64.encodeBuffer (x509certimpl1.getencoded (), fos); ลอง {ใบรับรอง [] certchain = {x509certimpl1}; savepfx ("scriptx", kp.getprivate () certchain, "f: //scriptx.pfx"); fileInputStream ใน = ใหม่ fileInputStream ("f: //scriptx.pfx"); keystore inputkeystore = keystore.getInstance ("PKCS12"); inputkeystore.getCertificate ("scriptx"); system.out.print (cert.getPublickey ()); PrivateKey Privk = (PrivateKey) inputkeystore.getKey ("scriptx", "123456" ไฟล์ ("f: //scriptx.pvk")); privkfos.write (privk.getencoded ()); system.out.print (privk); // base64.encode (key.getencoded (), privkfos); in.close ()}}}生成文件 x509certimpl1.verify (certificate.getPublickey (), null);}/** * 保存此根证书信息การแลกเปลี่ยนข้อมูลส่วนบุคคลที่คีย์ * * @param alias * @param privkey * @param pwd * @param certchain * @param filepath * @throws ยกเว้น filepath) โยนข้อยกเว้น {// 此类表示密钥和证书的存储设施。///返回指定类型的 Keystore 对象。此方法从首选ผู้ให้บริการ开始遍历已注册安全提供者列表。返回一个封装 Keystorespi // 实现的新 Keystore 对象, 该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的该实现取自第一个支持指定类型的。可以给定一个密码来解锁 out uttore) 类型类型类型类型类型类型类型类型Keystore (例如, 驻留在硬件标记设备上的驻留在硬件标记设备上的驻留在硬件标记设备上的驻留在硬件标记设备上的或者不能从流中初始化或检验或检验 // keystore 数据的完整性。如果没有指定用于完整性检验的密码, // ที่คีย์, 或者不能从流中初始化或者不能从流中初始化, 则传递 null 作为作为作为, 如果此.,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 将给定密钥(已经被保护 将给定密钥(已经被保护,,,, 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护 将给定密钥(已经被保护Keystore 实现的类型为 // jks, 则必须根据 pkcs #8 标准中的定义将 key 编码为 // encryptedprivatekeyinfo 。如果给定别名已经存在则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的则与别名关联的keystore.privateKeyEntry (kp.getPrivate (), certchain); // keystore.passwordprotection รหัสผ่าน = new // keystore.passwordprotection ("123456" .tochararray ()); // outputKeyStore.SetEntry ("scriptx"存储到给定输出流, 并用给定密码保护其完整性。OutputKeystore.store (out, pwd.tochararray ()); out.close ();} โมฆะสาธารณะ savejks (สตริงนามแฝง, private Key Privey, String pwd, ใบรับรอง [] certchain, String filepath) โยนข้อยกเว้น KeyStore.getInstance ("JKS"); System.out.println (outputKeyStore.getType ()); outputKeystore.load.load (null, pwd.toChararray ()); outputKeyStore.SetKeyEntry (นามแฝง keystore.privatekeyentry (kp.getPrivate (), certchain); // keystore.passwordprotection รหัสผ่าน = new // keystore.passwordprotection ("123456" .tochararray ()); fileOutputStream (filePath); outputKeystore.store (ออก, pwd.toChararray ()); out.close ();}/** * 颁布根证书,, 自己作为 ca * * @throws nosuchalgorithmexception * @throws nosuchproviderexception * @throws Signatureexception * @throws unrecoverablekeyexception */โมฆะสาธารณะ createrootca () พ่น nosuchalgorithmexception, nosuchproviderexception, invalidkeyexception, ioexception, certificateException, signatureexception ให้การเข้าถึงพวกเขา certandkeygen cak = new certandKeyGen ("rsa", "md5withrsa", null); // ตั้งค่าแหล่งที่มาของตัวเลขสุ่มที่ใช้เมื่อสร้างคีย์. cak.setrandom (sr); "CN = Dave, OU = Javasoft, O = Sun Microsystems, C = US" (RFC 1779 หรือ RFC // 2253 สไตล์) x500Name subject = ใหม่ x500Name ("CN = rootca, ou = hackwp, o = wp, l = bj, s = bj, c = cn"); // ส่งคืนใบรับรอง X.509V3 ที่ลงนามเอง // ใบรับรองจะถูกต้องทันที ไม่มีส่วนขยาย// ใบรับรองดังกล่าวโดยปกติจะใช้เพื่อระบุ "ใบรับรอง // ผู้มีอำนาจ" (CA) ดังนั้นพวกเขาจะไม่ได้รับการยอมรับจาก // ฝ่ายอื่น ๆ อย่างไรก็ตามใบรับรองดังกล่าวยังมีประโยชน์เช่นกันเมื่อคุณ // กำลัง bootstrapping โครงสร้างพื้นฐานด้านความปลอดภัยของคุณหรือการปรับใช้ระบบ // ต้นแบบ自签名的根证书 x509certificate ใบรับรอง = cak.getselfcertificate (หัวเรื่อง, วันที่ใหม่ (), 3650 * 24l * 60L * 60L); cak.getprivatekey (), "123456", ใบรับรอง, "f: //rootca.pfx");} catch (ข้อยกเว้น e) {e.printstacktrace ();} // 后一个ยาว型参数代表从现在开始的有效期 单位为秒(如果不想从现在开始算 可以在后面改这个域可以在后面改这个域可以在后面改这个域ไฟล์ ("f: //rootca.crt")); // fos.write (certificate.getEncoded ()); // 生成(保存) ใบรับรอง文件 base64 加密 base64.encodeBuffer (certificate.getencoded (), fos); fos.close () Ioexception, unrecoverableKeyException, InvalidKeyException, nosuchproviderexception, signatureexception {ลอง {keystore ks = keystore.getInstance ("pkcs12"); fileinputstream ksfis = new fileinputstream "123456" .toChararray (); char [] keypwd = "123456" .tochararray (); // 从给定输入流中加载此keystore。ks.load (ksfis, storepwd); ksfis.close (); // 返回与给定别名关联的密钥 (私钥) = (PrivateKey) ks.getKey ("rootca", keypwd); // 返回与给定别名关联的证书。如果给定的别名标识通过调用 setCertificateentry 创建的条目, 或者通过调用以或者通过调用以 // trustedCertificateentry 为参数的 setentry // 创建的条目则返回包含在该条目中的可信证书。如果给定的别名标识通过调用则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 setKeyEntry 创建的条目, 或者通过调用以 // privateKeyEntry ks.getCertificate ("rootca"); createCert (ใบรับรอง, privk, genkey ());} catch (keystoreexception e) {// todo catch ที่สร้างอัตโนมัติโดยอัตโนมัติ Keypairgenerator.getInstance ("RSA"); kpg.initialize (1024, SR); System.out.print (kpg.getalgorithm ()); Kypair kp = kpg.generatekeypair (); return kp; genx509cert (); gcert.createrootca (); gcert.signcert ();} catch (ข้อยกเว้น e) {// todo catch blocke.printstacktrace ();}}}}}}}}}}}}}以上这篇纯 Java 实现数字证书生成签名的简单实例就是小编分享给大家的全部内容了, 希望能给大家一个参考, 也希望大家多多支持武林网。