Paket com.ylsoft.cert; import java.io.file; import Java.io.fileinputstream; Import Java.io.FileOutputStream; java.security.keystore; import Java.security.KeyStoreException; Import Java.Security.NoSuchalgorithmException; Import Java.Security java.security.Signaturexception; import Java.security.unRecoverableKeyException; Import Java.security.Cert.Certificate; Import Java.Security.Cert.CertificateException; Import Java.Security.Cert.x509certificate; sun.misc.base64Coder; Import sun.security sun.security.x509.certificateserialNumber; import sun.security.x509.certificatevalidy; import sun.security.x509.certificateversion; sun.security.x509.certificatex509key; sun.security.x509.Keyidentifier; import sun.security.x509.KeyUSageExtension; Import sun.security.x509.SubjectyidentiFiereTensionen; sun.security.x509.X509CertInfo;/** * 首先生成CA的根证书,然后有CA的根证书签署生成ScriptX的证书 * * @author Administrator * */public class GenX509Cert {/** 提供强加密随机数生成器 (RNG)* */private SecureRandom sr;public GenX509Cert() throws NoSuchAlgorithmException,NoSuchProviderException {// 返回实现指定随机数生成器 (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 [] = Certificate.getEcoded (); // Die X509CertImPL -Klasse repräsentiert ein X.509 -Zertifikat.x509CertImpl x509CertImpl = new X509CertImpl (certbytes); // Die X509CERTInfo -Klasse repräsentiert X509CertinFo -Klasse. x509CertInfo = (x509CertInfo) x509CertImpl.get ("x509.info"); // Diese Klasse definiert das X509Key -Attribut für das Zertifikat.x509CertInfo.set ("Key", neue Zertifikatex509Key (kp.getPublic ()). Neue Zertifikatsextensionen (); CertificateExtensions.set ("SubjektKeyidentifier", New SubjectKeyIdentifierextsion ((neuer KeyIdentifier (kp.getPublic ()). X500Name ("cn = rootca, ou = hackwp, o = wp, l = bj, s = bj, c = cn"); x509certInfo.set ("Emittenten (RFC 1779 oder RFC // 2253 Stil) .x500Name Betreff = neuer x500Name ("cn = scriptx, ou = wps, o = wps, l = bj, st = bj, c = cn"); x509certinfo.set ("Subjekt.dname", Subjekt); Signature.getInstance ("md5withrsa"); // 初始化这个用于签名的对象。如果使用其他参数再次调用此方法 , 此调用的结果将无效。Signature.initsign (kp.getPrivate (); // Diese Klasse bietet eine Bindung zwischen einem Signature -Objekt und einem authentifizierten X.500 -Namen (von einer x.509 -Zertifikatkette), die in vielen öffentlichen Schlüsselanwendungen erforderlich ist. Issuer); // Diese Klasse identifiziert Algorithmen wie kryptografische Transformationen. CertificateAlgorithmid (Algorithmid)); // 开始时间 Datum bdate = new Date (); // 结束时间 Datum edate = new Date (); // 天 小时 分 毫秒 edate gültig. 证书的有效时间 CertificateValidy CertificalValidy = New CertificateValidy (BDATE, EDATE); x509CertInfo.set ("Validität", Zertifikatvalidität); // Diese Klasse definiert das SerialNumber -Attribut für das Zertifikat Date (). GetTime ()/ 1000L))); // 设置序列号域 definiert diese Klasse die Version des x509 -Zertifikats.然后按照以下步骤 */Objectidentifier oid = new Objectidentifier (neu int [] {2, 5, 29, 15}); // 生成扩展域的 id 是个 int 数组 第 1 位最大 2 第 2 位最大 39 最多可以几位不明 .... String userData = "Digital Signature, Nicht-Repudiation, Schlüsselverkleidungen, Datenverkippungen (f0).数据总长 17 位 Byte F = 0x04; Byte [] bs = new Byte [userData.length () + 2]; BS [0] = f; bs [1] = l; für (int i = 2; Ich <bs.länge; 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 (KeyUSageExtension.non_repudiation, true); keyusage.set (keyusageExtension.key_encipherment, true); keyusage.set (keyusageSension. Objectidentifier (New int [] {1, 3, 6, 1,5, 5, 7, 3, 3}); CertificateExtensionen (); ext.set ("keyUsage", keyusage); ext.set ("extendedKeyUsage", exKeyusage); // 如果有多个 Erweiterung 则都放入 ZertifikatExtensionen 类中 , x509CertInfo.set (x509Certinfo.Ertoursions, extssions). X509CertImpl (x509CertInfo); x509CertImpl1.Sign (RootPrivkey, "md5withrsa"); // 使用另一个证书的私钥来签名此证书 Md5 散列 用 rsa 来加密 Base64Encoder Base64 = New Base64Coder; File("f://ScriptX.crt"));base64.encodeBuffer(x509certimpl1.getEncoded(), fos);try {Certificate[] certChain = { x509certimpl1 };savePfx("scriptx", kp.getPrivate(), "123456", certchain, "f: //scriptx.pfx"); fileInputStream in = new FileInputStream ("f: //scriptx.pfx"); Keystore InputKeyStore = Keystore.getInstance ("PKCS12"); InputKeystore.load (in "123456". inputKeyStore.getCertificate ("scriptx"); System.out.print (cert.getPublickey ()); privateKey privk = (privatKey) inputKeyStore.getKey ("scriptx", "123456" .toCharArray (); FileOutputStreams = new FileOutputStream (new (new (new (new (new (new) Datei ("f: //scriptx.pvk")); 生成文件x509certimpl1.verify(certificate.getPublicKey(), null);}/** * 保存此根证书信息KeyStore Personal Information Exchange * * @param alias * @param privKey * @param pwd * @param certChain * @param filepath * @throws Exception */public void savePfx(String alias, PrivateKey privKey, String pwd,Certificate[] certChain, String filepath) löst Ausnahme aus {// 此类表示密钥和证书的存储设施。// 返回指定类型的 Keystore 对象。此方法从首选 Anbieter 开始遍历已注册安全提供者列表。返回一个封装 Keystorespi // 实现的新 Keystore 对象 , 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的 该实现取自第一个支持指定类型的KeyStore outputkeystore = keystore.getInstance ("pkcs12"); Keystore (例如 , 驻留在硬件标记设备上的 Keystore )或检验 // Keystore 数据的完整性。如果没有指定用于完整性检验的密码 , 则不会执行完整性检验。如果要创建空 // Keystore , 或者不能从流中初始化 Keystore , 则传递 null 作为 Stream 的参数。注意 , 如果此 keystore // 已经被加载 , 那么它将被重新初始化 并再次从给定输入流中加载。 并再次从给定输入流中加载。outputKeystore实现的类型为 // jks , 则必须根据 PKCS #8 标准中的定义将 KEY 编码为 // EncryptedPrivateKeyInfo 。如果给定别名已经存在 , 则与别名关联的 Keystore // 信息将被给定密钥(还可能包括证书链)重写。outputKeyStore.setKeyEntry (alias, private, pwd.tocharArray (), CertChain); // Keystore.PrivateKey pke = new // Keystore.privateKeyEntry (kp.getPrivate (), certChain); // keystore.passwordProtection password = new // keystore.passwordProtection ("123456" .toCharArray (); // outputKeystore.setEntry ("scriptx", pke, putstream;存储到给定输出流 , 并用给定密码保护其完整性。outputKeyStore.Store (out, pwd.toararray ()); out.close ();} public void Savejks (String alias, privatekey privkey, String pwd, Zertifikat [] certChain, String Filepath) löst Ausnahme aus {Keystore OutputKeyStore = Keystore.getInstance ("jks"); Keystore.privateKeyEntry (kp.getPrivate (), certchain); // keystore.passwordProtection password = new // keystore.passwordProtection ("123456" .toCharArray (); // outputKeystore.setEntry ("scriptx", pke, kassig, passputstream; FileOutputStream(filepath);outputKeyStore.store(out, pwd.toCharArray());out.close();}/** * 颁布根证书,自己作为CA * * @throws NoSuchAlgorithmException * @throws NoSuchProviderException * @throws InvalidKeyException * @throws IOException * @throws CertificateException * @throws SignatureException * @throws UnrecoverableKeyException */public void createrootca () löst NoSuchalgorithmException, NoSuchproviderexception, InvalidKeyException, IoException, CertificateException, Signaturexception, nicht erfundene Keexception {// 参数分别为公钥算法、签名算法 Providername (因为不知道确切的 既使用默认的 null 既使用默认的 null 既使用默认的 provider) // generieren Sie ein Paar Key und King zu. CertandKeygen ("rsa", "md5withrsa", null); // legt die Quelle von zufälligen Zahlen fest, die beim Generieren von Schlüssel verwendet werden. O = Sun Microsystems, C = US ". (RFC 1779 oder RFC // 2253 Stil) x500Name Betreff = neuer x500Name ("cn = rootca, ou = hackwp, o = wp, l = bj, s = bj, c = cn"); // Gibt ein selbstverständliches X.509v3-Zertifikat für das öffentliche Schlüssel zurück. Das // Zertifikat ist sofort gültig. Keine Erweiterungen.// Diese Zertifikate werden normalerweise verwendet, um ein "Zertifikat // Autorität" (CA) zu identifizieren. Dementsprechend werden sie nicht immer von // von anderen Parteien akzeptiert. Solche Zertifikate sind jedoch auch nützlich, wenn Sie // Ihre Sicherheitsinfrastruktur oder das Bereitstellen von Systemen // Prototypen starten. cak.getPrivateKey (), "123456", certs, "f: //rootca.pfx");} catch (Exception E) {E.printstacktrace ();} // 后一个 Long 型参数代表从现在开始的有效期 单位为秒(如果不想从现在开始算 可以在后面改这个域) Base64Enencoder Base64 = new Base64Coder (); FileOutputStream = New FileputStream (newnecoder (); DateioutputStream = New FileputStream (newnecoder (); FileOutputStream = New FileputStream (newnecoder (); File ("f: //rootca.crt")); // fos.write (Certificate.getEcoded ()); // 生成(保存) cert 文件 base64 加密 当然也可以不加密 Base64.EncodoDebuffer (Certificate.getEncoded (), fos); fos.close (); UnrewerabableKeyException, InvalidKeyException, NoSuchproviderexception, Signaturexception {try {keystore ks = keystore.getInstance ("pkcs12"); FileInputStream ksfis = new FileInputStream ("f: //rootca.pfx") storepwd = "123456" .TOCARAGE "); CHAR [] storepwd =" 123456 ". keypwd = "123456" .toCharArray (); // 从给定输入流中加载此 keystore。ks.load (ksfis, storepwd); Tastaturen); // 返回与给定别名关联的证书。如果给定的别名标识通过调用 setCertificateEntry 创建的条目 , 或者通过调用以 // vertrauenswürdige CertificateEntry 为参数的 setEntry // 创建的条目 , 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 则返回包含在该条目中的可信证书。如果给定的别名标识通过调用 setKeyEntry 创建的条目 或者通过调用以 // privatekeyEntry 为参数的 setEntry 创建的条目 , 则返回该条目中证书链的第一个元素。x509Certificate Zertifikat = (x509certificate) kscertificate) kscertificate (ks. kscertificate) ks. genekey ());} catch (keystoreException e) {// todo automatisch erzeugte catch blocke.printstacktrace ();}} öffentlicher Keypair genekey () löst NoSuchalgoritHMexception {Keypairgenerator KPGG = KeypairGenerator.GetMexception ("rsa"); sr); system.out.print (kpg.getalgorithmus ()); keypair kp = kpg.generateKeypair (); return kp;} public static void main (String [] args) {try {genx509cert gcert = new Genx509Cert (); {// Todo automatisch generiert blocke.printstacktrace ();}}}以上这篇纯 Java 实现数字证书生成签名的简单实例就是小编分享给大家的全部内容了 , 希望能给大家一个参考 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。