пакет com.ylsoft.cert; import java.io.file; import java.io.fileinputstream; импорт java.io.fileoutputstream; импорт java.io.ioexception; импорт java.security.invalidkeyexception; импорт java.security.keypair; import java.security.keypairtor; java.security.keystore; импорт java.security.keystoreexception; импорт java.security.nosuchalgorithmexception; импорт java.security.nosuchproviderexception; импорт java.security.sprivatekey; импорт java.security.securerandom; импорт. java.security.signature Exception; импорт java.security.unrecoverablekeexception; импорт java.security.cert.certificate; импорт java.security.cert.certificateexception; импорт java.security.cert.x509certificate; импорт java.ut.date; sun.misc.base64encoder; import sun.security.util.objectidentifier; import sun.security.x509.algorithmid; import sun.security.x509.certandkeygen; импорт Sun.security.x509.certificatealealgorithmid; импорт sun.security.x509.certificateextensions; sun.security.x509.certificateserialnumber; Import Sun.security.x509.certificateVality; импорт Sun.security.x509.certificateversion; импорт Sun.security.x509.certificatex509key; импорт. sun.security.x509.KeyIdentifier; Import Sun.security.x509.KeyUsageExtension; Import Sun.Security.x509.SubjectKeyIdentifieRextension; импорт Sun.Security.x509.x500Name; импорт sun.security.x509.x500signer; import Sun.security.s509.x509certimpl; sun.security.x509.x509certinfo;/** * 首先生成 Ca 的根证书 , 然后有 Ca 的根证书签署生成 Scriptx 的证书 * * @@author Administrator * */public class genx509cert {/** 提供强加密随机数生成器 (rng) * */private securorandom sr; public genx509cert () trows nosuchrithexcepcemexecemexecemexemexexexecepemexexexcept (RNG) 算法的 SecureRandom 对象。sr = SecureRandom.getInstance("SHA1PRNG", "SUN");}public void createCert(X509Certificate certificate, PrivateKey rootPrivKey,KeyPair kp) throws CertificateException, IOException,InvalidKeyException, NoSuchAlgorithmException,NoSuchProviderException, SignatureException {// x.509 v1 证书的抽象类。此类提供了一种访问 x.509 v1 证书所有属性的标准方式。byte certbytes [] = сертификат. Information.x509certinfo x509certinfo = (x509certinfo) x509certimpl.get ("x509.info"); // Этот класс определяет атрибут x509key для сертификата. x509certinfo.set ("Key", новый сертификат. CertieCertificateExtensions SertiveSextensions = new SertiTexTextensions (); SetteraTextensions.Set ("SupticleKeyIdentifier", New SubjectKeyDiveIfeErextension ((New KeyIdentifier (kp.getPublic ()). GetIdateifier ()); x509certinfo.set ("extensions"设置 Эмитент 域 x500name essuer = new x500name ("cn = rootca, ou = chackwp, o = wp, l = bj, s = bj, c = cn"); x509certinfo.set ("issuer.dname", issuer); // конструирует название с форматированной конвенционной строки, так как////// //ебесное, так, как////// contruction ou, ou, так же, как////// /ваварее O = солнцезащитные микросистемы, c = Us ". (RFC 1779 or RFC// 2253 style).X500Name subject = new X500Name("CN=scriptx, OU=wps, O=wps, L=BJ, ST=BJ, C=CN");x509certinfo.set("subject.dname", subject);// 此 Signature 类用来为应用程序提供数字签名算法功能。返回实现指定签名算法的 Signature 对象。Signature signature = Signature.getInstance ("md5withrsa"); // 初始化这个用于签名的对象。如果使用其他参数再次调用此方法 , 此调用的结果将无效。signature.initsign (kp.getprivate ()); // Этот класс обеспечивает связующую связь между объектом подписи и // аутентифицированным x.500 name (от x.509 -nervicate inceperse, который необходим во многих приложениях для сообщений. Эмитент); // Этот класс идентифицирует алгоритмы, такие как криптографические преобразования, // каждый из которых может быть связан с параметрами. Алгоритмид algorithmid = signer.getalgorithmid (); // Этот класс определяет алгоритмид для сертификата. x509certinfo.set ("algorithmid". SertieAtealGorithMid (алгоритмид)); // 开始时间 дата bdate = new Date (); // 结束时间 дата eDate = new Date (); // 天 小时 分 秒 毫秒 edate.settime (bdate.gettime () + 3650 * 24L * 60L * 60L * 1000L); ///////// /вакое значения. Действителен. SetterteSerialNumber ((int) (new Date (). GetTime ()/ 1000L))); // 设置序列号域, этот класс определяет версию x509 сертификат. CertificateVersion cv = Новая сертификация (сертификация. V3); x509certinfo.set (x509certinfo.version, cv);以上是证书的基本信息 如果要添加用户扩展信息 则比较麻烦 首先要确定 версия 必须是 v3 否则不行 然后按照以下步骤 */objectIdentifier oid = new ObjectIdentifier (new int [] {2, 5, 29, 15}); // 生成扩展域的 ID 是个 int 数组 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(i - 2);}Extension ext = new Extension(oid, true, bs);// 生成一个extension对象 参数分别为 oid,是否关键扩展,byte[]型的内容值// 其中内容的格式比较怪异 第一位是flag 这里取4暂时没出错 估计用来说明数据的用处的 第2位是后面的实际数据的长度,然后就是数据// 密钥用法KeyUsageExtension keyUsage = new KeyUsageExtension (); keyUsage.set (keyUsageExtension.digital_signature, true); keyusage.set.sest (keyusageextension.non_repudiation, true); keyusage.set (keyusageextension.key_encipherment, true); keyUsage.setIdene (keyUseExtension.dataIse. ObjectIdentifier (new int [] {1, 3, 6, 1,5, 5, 7, 3, 3}); vector <Bocoomidietifier> vkeyoid = new Vector <Bionitidifier> (); vkeyoid.add (ekeyoid); extendedKeyUsextension ExkeyUsage = new ExtendendEdExtension (vkeyOid); SertiateExtensions (); exts.set ("keyUsage", keyUsage); exts.set ("extendekKeyUsage", exkeyUsage); // 如果有多个 расширение 则都放入 сертификация 类中 类中 , x509certinfo.set (x509certinfo.extensions, exts);// 设置 extensions 域 x509certmermert.certmermertmestions, exts); X509certimpl (x509certinfo); x509certimpl1.sign (rootprivkey, "md5withrsa"); // 使用另一个证书的私钥来签名此证书 这里使用 这里使用 md5 散列 用 rsa 来加密 base64encoder base64 = base64encoder (); fileOutputeM File ("f: //scriptx.crt")); base64.encodebuffer (x509certimpl1.getencoded (), fos); try {serticate [] certchain = {x509certimpl1}; savepfx ("scriptx", kp.getprivate (), "123456", "," certchain, "f: //scriptx.pfx"); fileInputStream in = new FileInputStream ("f: //scriptx.pfx"); keystore inputekeStore = keystore.getInstance ("pkcs12"); inputKeyStore.Load (in, "123456". inputKeyStore.getCertificate ("scriptx"); System.out.print (cert.getPublickey ()); privatekey private = (privateKey) inputKeyStore.getKey ("scriptx", "123456". File ("f: //scriptx.pvk")); privkfos.write (privk.getencoded ()); System.out.print (privk); // base64.encode (key.getencoded (), privkfos); in.close ();} catch Exception e) {// todo-auto-gate-ceart chate.print.print/} {/// todo-генерированное catch.print/patchtrace.生成文件 x509CertImpl1.Verify (sertiate.getPublickey (), null);}/** * 保存此根证书信息 Обмен личной информацией KeyStor FilePath) бросает исключение {// 此类表示密钥和证书的存储设施。// 返回指定类型的 Store Store 对象。此方法从首选 Provider 开始遍历已注册安全提供者列表。返回一个封装 Keystorespi // 实现的新 Store 对象 对象 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 Provider。kestore outputKeyStore = KeyStore.getInstance ("pkcs12"); System.out.println ("KeyStore 类型 : woptulty.Gettype ();") Слайт ключей (例如 , 驻留在硬件标记设备上的 Store Store) 或检验 // Store Store 数据的完整性。如果没有指定用于完整性检验的密码 , 则不会执行完整性检验。如果要创建空 则不会执行完整性检验。如果要创建空 // Store , 或者不能从流中初始化 或者不能从流中初始化 , , 则传递 null 作为 Stream 的参数。注意 , 如果此 Store // 已经被加载 , 那么它将被重新初始化. java.security.privatekey , 则它必须附带证明相应公钥的证书链。如果底层 Store Store 实现的类型为 // jks , 则必须根据 Pkcs #8 标准中的定义将 Ключ 编码为 // EncryptedPrivateKeyInfo 。如果给定别名已经存在 则与别名关联的 则与别名关联的 KeyStore // 信息将被给定密钥 (还可能包括证书链 还可能包括证书链) pke = new // keystore.privateKeyEntry (kp.getPrivate (), certchain); // keystore.passwordprotection пароль = new // keystore.passwordprotection ("123456" .tochararray ()); // outputKeyStore.SetEntry ("ScrepPtX", pke, пароль);将此 KeyStore 存储到给定输出流 , 并用给定密码保护其完整性。OutputKeyStore.store (out, pwd.toChararray ()); out.close ();} public void saidejks (string alias, privatekey private, String pwd, сертификат [] certchain, string filepath). KeyStore.getInstance ("jks"); System.out.println (outputKeyStore.getType ()); outputKeyStore.load (null, pwd.tochararray ()); outputKeyStore.setKeyEntry (псевдоним, прививаемость, pwd.tochararray (), certchain); KeyStore.PrivateKeyEntry (kp.getPrivate (), certChain); // KeyStore.PassWordProtection Password = new // KeyStore.PasswordProtection ("123456" .tochararray ()); // outputKeyStore.setEntry ("scriptx", pke, passwort); FileOutputStream (filePath); outputKeyStore.store (out, pwd.tochararray ()); out.close ();}/** * 颁布根证书 , 自己作为 Ca * * @Throws noShalgoritHmexception * @Throws nosuchproviderexcept UncoverableKeyException */public void createRootca () бросает NosuchalgorithMexception, nosuchproviderexception, InvalidKeyException, ioException, сертификат, SignatureException, UncoverableKeyExcept New CertandKeyGen («RSA», «md5withrsa», Null); // Устанавливает источник случайных чисел, используемых при генерации keys.cak.setrandom (sr); // генерирует случайную пару общедоступных/частных ключей, с заданным размером ключа. O = солнцезащитные микросистемы, c = Us ". (RFC 1779 или RFC // 2253 Style) x500name subject = new x500name ("cn = rootca, ou = chackwp, o = wp, l = bj, s = bj, c = cn"); // Возвращает самоознакованный сертификат X.509V3 для общедоступного ключа. // Сертификат немедленно действителен. Нет расширений .// Такие сертификаты обычно используются для определения «сертификата // авторитета» (CA). Соответственно, они не всегда будут приняты // другими сторонами. Тем не менее, такие сертификаты также полезны, когда вы // начали свою инфраструктуру безопасности или систему развертывания // прототипы. cak.getPrivateKey (), "123456", certs, "f: //rootca.pfx");} catch (exception e) {e.printstacktrace ();} // 后一个 long 型参数代表从现在开始的有效期 单位为秒 (如果不想从现在开始算 可以在后面改这个域 可以在后面改这个域) base64encoder base64 = new Base64encoder (); fileOutputeReam = foS -stifeam = newsemautemoutseam -stileoutseam = newsstream = newauteam = fos -fos -vosteam = fos -fos -vosteam = fos -fos -vosteam = fos -fos -vostream = fos -fos -vostream = fos -fos -sizeut File ("f: //rootca.crt")); // fos.write (sertiate.getencoded ()); // 生成 ((保存 保存 文件 cert 文件 base64 加密 当然也可以不加密 base64.encodebuffer (сертификат.getencoded (), fos); fos.close (); IoException, UncoverableKeyException, InvalidKeyException, nosuchProviderexception, SignatureException {try {keyStore ks = keyStore.getInstance ("pkcs12"); fileInputStream ksfis = storeInputStream ("f: //rootca.pfx"); "123456" .tchararray (); char [] keypwd = "123456" .tchararray (); // 从给定输入流中加载此 keystore。ks.load (ksfis, storepwd); ksfis.close (); // 返回与给定别名关联的密钥 (私钥) , 并用给定密码来恢复它。必须已经通过调用 并用给定密码来恢复它。必须已经通过调用 并用给定密码来恢复它。必须已经通过调用 或者以 或者以// private seteentry -leceentry -kenceentry 为参数的// private keverteeentry 关联密钥与别名。 或者以// privatementry 关联密钥与别名。 或者以// privatementry) = (PrivateKey) ks.getKey("RootCA", keyPwd);// 返回与给定别名关联的证书。如果给定的别名标识通过调用 setCertificateEntry 创建的条目,或者通过调用以// TrustedCertificateEntry 为参数的 setEntry// 创建的条目,则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 setKeyEntry 创建的条目,或者通过调用以// PrivateKeyEntry 为参数的 setEntry 创建的条目,则返回该条目中证书链的第一个元素。X509Certificate certificate = (X509Certificate) ks.getCertificate ("rootca"); createCert (сертификат, privk, genkey ());} catch (keystoreexception e) {// todo с генерируемым Auto сгенерированным blocke.printstacktrace ();}} public keypair genkey () Trips Nosuchalgorithexcept Keypairgenerator.getInstance ("rsa"); kpg.initialize (1024, sr); system.out.print (kpg.getalgorithm ()); Keypair kp = kpg.generatekeypair (); return kp;} public static void main (string args). Genx509cert (); gcert.createrootca (); gcert.signcert ();} catch (Exception e) {// todo Auto Generated Catch Blocke.printStackTrace ();}}}以上这篇纯 java 实现数字证书生成签名的简单实例就是小编分享给大家的全部内容了 希望能给大家一个参考 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。