paquete com.ylsoft.cert; import java.io.file; import java.io.fileInputStream; import java.io.fileOutputStream; import java.io.ioexception; import java.security.invalidkeyException; import java.security.keypair; import java.security.keyPairGenerator; importar; import java.security.keystore; import java.security.keystoreException; import java.security.nosuchalgorithmexexception; import java.security.nosuchprovidereReXception; importación.security.privatekey; import java.security.seguerandom; importar java.security.signature; java.security.signatureException; import java.security.unrecoverablekeyException; import java.security.cert.certificate; import java.security.cert.certificateException; import java.security.cert.x509Certificate; import java.util.date; import java.security.cert.x509certificate; import java.util.date; importar java.security.cert.x509Certificate; import java.util.date; importar java.security.cert.x509Certificate; import java.util.date; importar java.security.cert.x509Certificate; import java.util.date; importar java.security.cert.x509Certificate; import java.util.date; importar java.vector.cert.vector sun.misc.base64Encoder; import sun.security.util.objectIdidentifier; import sun.security.x509.algorithmid; import sun.security.x509.certandkeygen; import sun.security.x509.certificatealgorithmid; import.security.x509.certificatexensions; Sun.security.x509.CertificateSerialNumber; import sun.security.x509.certificateValidity; import sun.security.x509.certificateVeversion; import sun.security.x509.certificex509key; import.ssecurity.x509.extendedKeyusageExtension; Sun.security de importación; Sun.security.x509.KeyIdidifier; import sun.security.x509.KeyUsageExtension; import sun.security.x509.SubjectKeyIdentierExtension; import sun.security.x509.x500name; import.security.x509.x500signer; import sun.security.x509.x509certimla Sun.security.x509.x509Certinfo;/** * 首先生成 ca 的根证书 的根证书 , 然后有 ca 的根证书签署生成 scriptx 的证书 * * @author administrador * */public class genX509CERT {/** 提供强加密随机数生成器 (rng) * */private Securerandom sr; public GenX509Cert () lanza Nosuchalgorithmception, nosuchpeced (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 [] = certate.getEncoded (); // La clase X509CERTIMPL representa un certificado X.509.x509CertImPL X509CERTIMPL = nuevo X509CERTIMPL (certbytes); información.x509CertInfo x509CertInfo = (x509CertInfo) x509CerTImpl.get ("x509.info"); // Esta clase define el atributo x509key para el certificado.x509Certinfo.set ("clave", nuevo certificadox509key (kp.getpublic ())); // CertificateCertificateExtensions certateExtensions = new CertateExtensions (); certateExtensions.set ("SujetkeyIdentifier", new SematterkeyIdentifiExtension ((new KeyIdentifier (kp.getPublic ())). GetIdentifier ())); x509Certerfo.set ("Extensions", CertificateExtensions); // 设置 域 设置 设置 设置 设置 设置 设置 设置 设置 设置 设置 设置 设置 设置 设置 设置 x500 = nuevo x500name ("cn = rootca, ou = hackwp, o = wp, l = bj, s = bj, c = cn"); x509Certinfo.set ("issuer.dname", issuer); // Construye un nombre de una cadena formada convencionalmente, como // "cn = dave, ou = javasoft, o = suneSysysysysysysysysysy". (RFC 1779 o RFC // 2253 estilo) .x500Name Sujeto = nuevo x500Name ("cn = scriptx, ou = wps, o = wps, l = bj, st = bj, c = cn"); x509Certinfo.set ("SUST.DNAME", Asunto); // 此 Firma 类用来为应用程序提供数字签名算法功能。返回实现指定签名算法的 Signature 对象。signature Signature CARMATURATURA Firma.getInstance ("md5withrsa"); // 初始化这个用于签名的对象。如果使用其他参数再次调用此方法 , 此调用的结果将无效。signature.initsign (kp.getPrivate ()); // Esta clase proporciona un enlace entre un objeto de firma y un nombre X.500 autenticado (de una cadena de certificado X.509), que es // necesaria en muchas aplicaciones de firma de clave pública. emisor); // Esta clase identifica algoritmos, como las transformaciones criptográficas, // cada uno de los cuales puede estar asociado con parámetros.algorithmid algoritmid = firmer.getalgorithmid (); // Esta clase define el algoritmid para el certificado.x509certinfo.set ("algorithmid", Newarithmid ", Newin CertateAlGorithmid (algorithmid)); // 开始时间 date bdate = new Date (); // 结束时间 Date edate = new Date (); // 天 小时 分 秒 毫秒 edate.setTime (bdate.gettime () + 3650 * 24l * 60l * 60l * 1000l); // Validez 为有效时间长度 为有效时间长度 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 为有效时间长度 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 单位为秒 为有效时间长度 为有效时间长度 单位为秒 为有效时间长度 单位为秒 为有效时间长度 单位为秒 为有效时间长度 单位为秒 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 eléctrica eléctrica eléctrica eléctrica electrónico eléctrica eléctrica eléctrica) 为有效时间长度 为有效时间长度 为有效时间长度 为有效时间长度 单位为秒 单位为秒 单位为秒 为有效时间长度 单位为秒 单位为秒 为有效时间长度 为有效时间长度 单位为秒 为有效时间长度 为有效时间长度 为有效时间长度 th eléctricas eléctricas electrónico eléctricas) sabe Válido. 证书的有效时间 CertCeValidez CertCeValidity = new CertateValidity (bdate, edate); x509Certinfo.set ("validez", certificateValidity); // Esta clase define el atributo de number para el certificado.// 设置有效期域(包含开始时间和到期时间)域名等同与 x509certinfo.validity x509certinfo.set ("night nighteratatates", (night night (newcertatatates (newerialerererererererererer Date (). GetTime ()/ 1000l)))); // 设置序列号域, esta clase define la versión del certificado x509.CertificateVersion cv = new CertateVersion (certificateVersion.v3); x509Certinfo.set (x509Certinfo.version, cv); // 设置版本号 设置版本号 设置版本号 设置版本号 只有 设置版本号 设置版本号 设置版本号 只有 只有 只有 设置版本号 设置版本号 设置版本号 只有 只有 设置版本号 设置版本号 设置版本号 设置版本号 设置版本号 这几个合法值 这几个合法值 这几个合法值 这几个合法值 这几个合法值 这几个合法值 以上是证书的基本信息 以上是证书的基本信息 以上是证书的基本信息 以上是证书的基本信息 以上是证书的基本信息 以上是证书的基本信息 以上是证书的基本信息 以上是证书的基本信息首先要确定 Versión 必须是 V3 否则不行 然后按照以下步骤 */ObjectIdentifier oid = new ObjectIdentifier (new int [] {2, 5, 29, 15}); // 生成扩展域的 ID 是个 int 数组 第 1 位最大 2 第 2 位最大 39 最多可以几位不明 .... String UserData = "Signature digital, no repudio, encopilamiento clave, ciencia de datos (f0)"; userData.length (); // 数据总长 17 位 Byte f = 0x04; byte [] bs = new byte [userData.length () + 2]; bs [0] = f; bs [1] = l; para (int i = 2; i <bs.length; i ++) {bs [i] = (byte) userData.charat (i - 2);} extensión ext = nueva extensión (OID, true, bs); // 生成一个 extensión 对象 参数分别为 oid , , , byte [] 型的内容值 // 其中内容的格式比较怪异 第一位是 这里取 4 暂时没出错 估计用来说明数据的用处的 2 位是后面的实际数据的长度 位是后面的实际数据的长度 然后就是数据 // 密钥用法 密钥用法 其中内容的格式比较怪异 其中内容的格式比较怪异 其中内容的格式比较怪异 其中内容的格式比较怪异 4 暂时没出错 估计用来说明数据的用处的 2 位是后面的实际数据的长度 , 然后就是数据 然后就是数据 // KeyUsageExtension (); keyUsage.set (keyUsageExtension.digital_signature, true); keyUsage.set (keyUsageExtension.non_repudiation, true); keyUsage.set (keyUsageExtension.key_encipherment, true); keyUSage.set (keyUSageExtension.data_encipherment, true); int [] {1, 3, 6, 1,5, 5, 7, 3, 3}); vector <ObjectIdentifier> vkeyoid = new Vector <ObjectIdidentifier> (); vkeyoid.add (ekeyoid); extendedKeyUsageExtension exkeyUsage = newkeyUsageEtextension (vkeyoid); certateExtensions exts = new certificatexensions (); exts.set (",", ",", ",", ",", ",", ",", ""). keyUsage); exts.set ("ExtendedKeyUsage", ExkeyUsage); // 如果有多个 Extensión 则都放入 CertificateExtensions 类中 , X509Certinfo.Set (x509Certinfo.Extensions, EXTS); // 设置 Extensiones 域 X509CertImpl x509CertImpl1 = new New X509CertImpl (x509Certinfo); x509CertImpl1.sign (rootPrivkey, "Md5Withrsa"); // 使用另一个证书的私钥来签名此证书 这里使用 这里使用 Md5 散列 用 用 rsa 来加密 base64Encoder base64 = nuevo base64Encoder (); FileOutPutStream Fos = nuevo FileOutputStream (nuevo nuevo Archivo ("f: //scriptx.crt")); base64.encodeBuffer (x509CertImpl1.getEncoded (), fos); intente {certificado [] certChain = {x509CerTimpl1}; SavePFX ("scriptx", kp.getPrivate (), "123456",,, ",,,", ",", ",", "123456". certChain, "f: //scriptx.pfx"); fileInputStream in = new FileInputStream ("f: //scriptx.pfx"); keystore inputKeyStore = keyStore.getInstance ("PKCS12"); inputKeyStore.load (en "123456" .tocharray (); inputKeyStore.getCertificate ("scriptx"); system.out.print (cert.getPublicKey ()); privateKey privk = (privateKey) inputKeyStore.getKey ("scriptx", "123456" .toCarArray ()); fileOutputStream privkfos = new FileOutStEAM (nuevo Archivo ("f: //scriptx.pvk")); privkfos.write (privk.getEncoded ()); system.out.print (privk); // base64.encode (key.getEncoded (), privkfos); in.close ();} excepción e) {// todo au生成文件 x509CertImpl1.verify (certificado.getPublicKey (), null);}/** * 保存此根证书信息 Exchange de información personal de la tienda de claves * * @param alias * @param privkey * @param pwd * @param certChain * @param filepath * @throws excepción */public void savePfx (string alias, private keykey, string pwd, certificate, certificado, certificado, certificado, certificado, certificado, excepción */public void SavePfx (string alias, string strike, string pwd, certificate [] certificado, certificado, certificado, certificado, certificado, certificado, certificado, certificado, certificado, certificado. lanza la excepción {// 此类表示密钥和证书的存储设施。// 返回指定类型的 Store de claves 对象。此方法从首选 Provider 开始遍历已注册安全提供者列表。返回一个封装 KeyStorespi // 实现的新 Tecla de claves 对象 , 该实现取自第一个支持指定类型的 Provider。KeyStore outputkeyStore = KeyStore.getInstance ("PKCS12"); System.Println ("KeyStoreStore : :" + outkeyStore.gettype (); // 从给定输入流中加载此 Keystore 。可以给定一个密码来解锁 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此 从给定输入流中加载此almacén de claves (例如 , 驻留在硬件标记设备上的 驻留在硬件标记设备上的 驻留在硬件标记设备上的 )或检验 // almacena de claves 数据的完整性。如果没有指定用于完整性检验的密码 , 则不会执行完整性检验。如果要创建空 则不会执行完整性检验。如果要创建空 // Keystore , 或者不能从流中初始化 Tecla de claves , 则传递 作为 作为 作为 的参数。注意 的参数。注意 如果此 如果此 如果此 如果此 如果此 如果此 已经被加载 已经被加载 , , , 并再次从给定输入流中加载。outputkeyStore.load (null, pwd.tocharray (); // 将给定密钥(已经被保护)分配给给定别名。如果受保护密钥的类型为 // java.sEcurity.PriMeTe. 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层 则它必须附带证明相应公钥的证书链。如果底层实现的类型为 // jks , 则必须根据 pkcs #8 标准中的定义将 clave 编码为 // cifradoprivatekeyinfo 。如果给定别名已经存在 , 则与别名关联的 则与别名关联的 则与别名关联的 则与别名关联的 信息将被给定密钥(还可能包括证书链)重写。 信息将被给定密钥(还可能包括证书链)重写。outputkeyStore.setKeyEntry (alias, privkey, pwd.tocarray (), certChain); // keyStore.privatekeyentry pke = new /// KeyStore.PrivateKeyEntry (kp.getPrivate (), certChain); // keystore.passwordprotection contraseña = nuevo // keyStore.passpasswordProtection ("123456" .ToCarArray ()); // ÚtilkeyStore.setTry ("scriptX", PKE, contraseña); fileOutStream out = new FileStPut (FilePath);存储到给定输出流 , 并用给定密码保护其完整性。OutputKeyStore.store (out, pwd.toCarArray ()); out.close ();} public void savejks (alias de cadena, privatekey privkey, string pwd, certificado [] certChain, string filepath) lanza excepción {keystore outputkeyStore = KeyStore.getInstance ("JKS"); System.out.println (OutputKeyStore.GetType ()); outputKeyStore.Load (null, pwd.toCarArray ()); outputKeyStore.setKeyEntry (alias, privkey, pwd.toCarArray (), certChain); // keyStore.privateKeyStry pKe = niew /// KeyStore.PrivateKeyEntry (kp.getPrivate (), certChain); // keystore.passwordprotection contraseña = new // keystore.passwordprotection ("123456" .ToCarArray ()); // outputeykeyStore.setEntry ("scriptX", PKE, contraseña); fileOutputStream Out = new New FileOutputStream (filePath); outputKeyStore.store (out, pwd.toCarArray ()); out.close ();}/** * 颁布根证书 , 自己作为 ca * * @throws nosuchalgorithMexception * @throws nosuchproviderexception * @throws invalidKeyException * @throws iOexception * @throws certificateException * @throws UnrecoverableKeyException */public void createrootca () lanza NosuchalgorithMexception, NosuchProviderException, InvalidKeyException, IOException, CertificateException, SignatureException, UnrecoverableKeyException {// 参数分别为公钥算法、签名算法 ProvidEnleame '(因为不知道确切的 只好使用 既使用默认的 既使用默认的 既使用默认的 Provider 既使用默认的 // Generate un par de neyas, y proporcione acceso a things. = new CertandKeyGen ("RSA", "Md5Withrsa", NULL); // Establece la fuente de números aleatorios utilizados al generar Keys.cak.setRandom (sr); // genera una pareja pública/privada aleatoria, con un tamaño de tecla dado.cak.generate (1024); // OU = Javasoft, O = Sun Microsystems, C = US ". (RFC 1779 o RFC // 2253 Style) X500Name Sujeto = nuevo x500Name ("CN = Rootca, OU = Hackwp, O = Wp, L = Bj, S = Bj, C = Cn"); // Devuelve un certificado X.509V3 autofirmado para la clave pública. El certificado // es inmediatamente válido. No hay extensiones .// dichos certificados normalmente se utilizan para identificar un "Certificado // Autoridad" (CA). En consecuencia, no siempre serán aceptados por // otras partes. Sin embargo, dichos certificados también son útiles cuando // está arrancando su infraestructura de seguridad, o implementando el sistema // prototipos. cak.getPrivateKey (), "123456", certs, "f: //rootca.pfx");} capt (excepción e) {e.printstacktrace ();} // 后一个 long 型参数代表从现在开始的有效期 单位为秒(如果不想从现在开始算 可以在后面改这个域) base64Encoder base64 = nueva base64Coder (); fileOutStream Fos = nuevo archivo de archivo (newOutputStream (nuevo es (nuevo es el nuevoam (nuevo mar (nuevo mar (nuevo mar (nuevo mar (nuevo mar (nuevo mar (nuevo es nuevo (nuevo (nuevo (nuevo (nuevo (nuevo (nuevo nuevo (nuevo (nuevo (nuevo (nuevo (nuevo nuevo (nuevo NEW 4444 File("f://RootCa.crt"));// fos.write(certificate.getEncoded());// 生成(保存)cert文件 base64加密 当然也可以不加密base64.encodeBuffer(certificate.getEncoded(), fos);fos.close();}public void signCert() throws NoSuchAlgorithmException,CertificateException, IOException, UnracoverableKeyException, InvalidKeyException, NosuchProvidereRexception, SignatureException {try {KeyStore ks = KeyStore.getInstance ("PKCS12"); FileInputStream KSFIS = New FileInputStream ("f: //rootca.pfx"); char [] storePWD = "123456". keyPwd = "123456".toCharArray();// 从给定输入流中加载此 KeyStore。ks.load(ksfis, storePwd);ksfis.close();// 返回与给定别名关联的密钥(私钥),并用给定密码来恢复它。必须已经通过调用 setKeyEntry,或者以// PrivateKeyEntry// 或 SecretKeyEntry 为参数的 setEntry 关联密钥与别名。PrivateKey privK = (PrivateKey) ks.getKey("RootCA", keypwd); // 返回与给定别名关联的证书。如果给定的别名标识通过调用 setCertificateEntry 创建的条目 , 或者通过调用以 或者通过调用以 // TrustedCertificateEntry 为参数的 setEntry // 创建的条目 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 setKeyEntry 创建的条目 , 或者通过调用以 // privatekeyEntry 为参数的 setEntry 创建的条目 , 则返回该条目中证书链的第一个元素。X509Certificate certificate = (x509Certificate) ks.getCertificate ("" RootCert (certificador, certificado, certificado de create, certificado, certificado, certificado, certificado, stiveT. genkey ());} catch (KeyStoreException e) {// TODO Generado automático BLOCKE.PRINTSTACKTRACE ();}} public KeyPeir genkey () lanza NosuchalgorithMexception { sr); system.out.print (kpg.getalgorithm ()); keypair kp = kpg.generatekypair (); return kp;} public static void void main (string [] args) {try {genx509cert gcert = new GenX509Cert (); gcert.createrOtca (); gcert.sign (); {// TODO Generado automático BLOCKE.PRINTSTACKTRACE ();}}}以上这篇纯 java 实现数字证书生成签名的简单实例就是小编分享给大家的全部内容了 , 希望能给大家一个参考 也希望大家多多支持武林网。