JAVA代码-数字证书公私钥生成-公钥cer ,私钥jks, pfx格式

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.security.SignatureException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.Enumeration;

import org.bouncycastle.asn1.x509.X509Name;
import org.bouncycastle.jce.X509V3CertificateGenerator;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import sun.misc.BASE64Encoder;

public class DataCertCreate {
    private String path = "D:/";

    /**
     * 公钥方法
     */
    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * 产生数字公钥证书 String[]
     * info长度为9,分别是{cn,ou,o,c,l,st,starttime,endtime,serialnumber}
     *
     * @throws SignatureException
     * @throws SecurityException
     * @throws NoSuchProviderException
     * @throws InvalidKeyException
     */
    public X509Certificate generateCert(String[] info, KeyPair keyPair_root, KeyPair keyPair_user)
            throws InvalidKeyException, NoSuchProviderException, SecurityException, SignatureException {
        X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
        X509Certificate cert = null;
        certGen.setSerialNumber(new BigInteger(info[8]));
        certGen.setIssuerDN(new X509Name("CN=huahua, OU=hnu, O=university , C=china"));
        certGen.setNotBefore(new Date(Long.parseLong(info[6])));
        certGen.setNotAfter(new Date(Long.parseLong(info[7])));
        certGen.setSubjectDN(new X509Name("C=" + info[0] + ",OU=" + info[1] + ",O=" + info[2] + ",C=" + info[3] + ",L="
                + info[4] + ",ST=" + info[3]));
        certGen.setPublicKey(keyPair_user.getPublic());
        certGen.setSignatureAlgorithm("SHA1WithRSA");
        cert = certGen.generateX509Certificate(keyPair_root.getPrivate(), "BC");
        return cert;
    }

    /**
     * 私钥方法
     */

    private String KEYSTORE_PASSWORD = "2078888";

    /**
     * 创建空的jks文件 String[]
     * info长度为9,分别是{cn,ou,o,c,l,st,starttime,endtime,serialnumber}
     */
    public void generateJKS(String[] info) {
        try {
            KeyStore keyStore = KeyStore.getInstance("jks");
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream("D:/" + info[0] + ".jks"), KEYSTORE_PASSWORD.toCharArray());
        } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用空的jks创建自己的jks String[]
     * info长度为9,分别是{cn,ou,o,c,l,st,starttime,endtime,serialnumber}
     */
    public void storeJKS(String[] info, KeyPair keyPair_root, KeyPair keyPair_user) {
        KeyStore keyStore;
        try {
            // use exited jks file
            keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("D:/" + info[0] + ".jks"), KEYSTORE_PASSWORD.toCharArray());
            // generate user‘s keystore by info[8] -----keypair
            X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
            certGen.setSerialNumber(new BigInteger(info[8]));
            certGen.setIssuerDN(new X509Name("CN=huahua, OU=hnu, O=university , C=china"));
            certGen.setNotBefore(new Date(Long.parseLong(info[6])));
            certGen.setNotAfter(new Date(Long.parseLong(info[7])));
            certGen.setSubjectDN(new X509Name("C=" + info[0] + ",OU=" + info[1] + ",O=" + info[2] + ",C=" + info[3]
                    + ",L=" + info[4] + ",ST=" + info[3]));
            certGen.setPublicKey(keyPair_user.getPublic());
            certGen.setSignatureAlgorithm("SHA1WithRSA");
            X509Certificate cert = null;
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            cert = certGen.generateX509Certificate(keyPair_root.getPrivate(), "BC");
            X509Certificate[] chain = new X509Certificate[1];
            chain[0] = cert;
            keyStore.setKeyEntry("mykey", keyPair_user.getPrivate(), KEYSTORE_PASSWORD.toCharArray(), chain);
            keyStore.setCertificateEntry("single_cert", cert);
            keyStore.store(new FileOutputStream("D:/" + info[0] + ".jks"), KEYSTORE_PASSWORD.toCharArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 公私钥公共方法
     */
    /**
     * 根据seed产生密钥对
     *
     * @param seed
     * @return
     * @throws NoSuchAlgorithmException
     */
    public KeyPair generateKeyPair(int seed) throws NoSuchAlgorithmException {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024, new SecureRandom(new byte[seed]));
        KeyPair keyPair = kpg.generateKeyPair();
        return keyPair;
    }

    public static final String PKCS12 = "PKCS12";

    /**
     * 转换成pfx格式
     *
     * @param info
     */
    public Boolean toPFX(String[] info) {
        try {
            String pfx_keystore_file = "D:/" + info[0] + ".pfx";
            String jkx_keystore_file = "D:/" + info[0] + ".jks";
            KeyStore inputKeyStore = KeyStore.getInstance("JKS");
            FileInputStream fis = new FileInputStream(jkx_keystore_file);
            char[] nPassword = null;
            if ((KEYSTORE_PASSWORD == null) || KEYSTORE_PASSWORD.trim().equals("")) {
                nPassword = null;
            } else {
                nPassword = KEYSTORE_PASSWORD.toCharArray();
            }
            inputKeyStore.load(fis, nPassword);
            fis.close();
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");
            outputKeyStore.load(null, KEYSTORE_PASSWORD.toCharArray());
            Enumeration enums = inputKeyStore.aliases();
            while (enums.hasMoreElements()) {
                String keyAlias = (String) enums.nextElement();
                System.out.println("alias=[" + keyAlias + "]");
                if (inputKeyStore.isKeyEntry(keyAlias)) {
                    Key key = inputKeyStore.getKey(keyAlias, nPassword);
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, KEYSTORE_PASSWORD.toCharArray(), certChain);
                }
            }
            FileOutputStream out = new FileOutputStream(pfx_keystore_file);
            outputKeyStore.store(out, nPassword);
            out.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("toPFX :" + e.getMessage());
            return false;
        }
    }

    public boolean createPublicKey(String[] info) {
        try {
            KeyPair keyPair_root = generateKeyPair(10);
            KeyPair keyPair_user = generateKeyPair(100);
            X509Certificate cert = generateCert(info, keyPair_root, keyPair_user);
            String certPath = path + info[0] + ".cer";
            FileOutputStream fos = new FileOutputStream(certPath);
            BASE64Encoder encoder = new BASE64Encoder();
            String string = encoder.encode(cert.getEncoded());
            System.out.println(string);
            fos.write(cert.getEncoded());
            fos.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("public key :" + e.getMessage());
            return false;
        }
    }

    public boolean createPublicKeyBYDecode(String[] info) {
        try {
            KeyPair keyPair_root = generateKeyPair(10);
            KeyPair keyPair_user = generateKeyPair(100);
            X509Certificate cert = generateCert(info, keyPair_root, keyPair_user);
            String certPath = path + info[0] + "_base.cer";

            FileWriter wr = new java.io.FileWriter(new File(certPath));
            String encode = new BASE64Encoder().encode(cert.getEncoded());
            String strCertificate = "-----BEGIN CERTIFICATE-----\r\n" + encode + "\r\n-----END CERTIFICATE-----\r\n";

            wr.write(strCertificate); // 给证书编码
            wr.flush();
            wr.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("public key :" + e.getMessage());
            return false;
        }
    }

    public X509Certificate fromString(String cert) {
        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            String strCertificate = "-----BEGIN CERTIFICATE-----\n" + cert + "\n-----END CERTIFICATE-----\n";
            java.io.ByteArrayInputStream streamCertificate = new java.io.ByteArrayInputStream(
                    strCertificate.getBytes("UTF-8"));
            return (X509Certificate) certificateFactory.generateCertificate(streamCertificate);
        } catch (Exception ex) {

            System.out.println(ex.getMessage());
        }
        return null;
    }

    public boolean createPrivateKey(String[] info) {
        try {
            KeyPair keyPair_root = generateKeyPair(10);
            KeyPair keyPair_user = generateKeyPair(100);
            generateJKS(info);
            storeJKS(info, keyPair_root, keyPair_user);
            return true;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("private key :" + e.getMessage());
            return false;
        }
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException,
            NoSuchProviderException, SecurityException, SignatureException, CertificateEncodingException, IOException {
        DataCertCreate dataCertCreate = new DataCertCreate();
        String[] info = { "huahua_user", "hnu", "university", "china", "hunan", "changsha", "111111", "11111111", "1" };
        // 生成公钥
        boolean createPublicKey = dataCertCreate.createPublicKey(info);
        System.out.println("PUBLIC KEY CREATE OK, result==" + createPublicKey);

        boolean createPublicKeyBYDecode = dataCertCreate.createPublicKeyBYDecode(info);
        System.out.println("PUBLIC KEY BY BASE64Encoder CREATE OK, result==" + createPublicKeyBYDecode);

        boolean createPrivateKey = dataCertCreate.createPrivateKey(info);
        System.out.println("PRIVATE KEY CREATE OK, result==" + createPrivateKey);

        Boolean pfx = dataCertCreate.toPFX(info);
        System.out.println("transToPFX OK, result==" + pfx);
    }
}
时间: 2024-07-28 23:21:04

JAVA代码-数字证书公私钥生成-公钥cer ,私钥jks, pfx格式的相关文章

【Java】Java与数字证书

Java与数字证书 Java与数字证书 证书的签发和应用 证书的内容和意义 其它 证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的.可以用来当成信任关系中介的数字凭证.证书发行机构通过发行证书告知证书使用者或实体其公钥(public-key)以及其它一些辅助信息.证书在电子商务安全交易中有着广泛的应用,证书发行机构也称CA(Certificate Authority). 证书的签发和应用 证书在公钥加密应用

Git简单生成生成公钥和私钥方法

Git配置 Git安装完之后,需做最后一步配置.打开git bash,分别执行以下两句命令 git config --global user.name "用户名" git config --global user.email "邮箱" 这二步必须执行 SSH配置 1.打开git bash 2.执行生成公钥和私钥的命令:ssh-keygen -t rsa 并按回车3下(为什么按三下,是因为有提示你是否需要设置密码,如果设置了每次使用Git都会用到密码,一般都是直接不写

RSA公钥加密—私钥解密&私钥加密—公钥解密&私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

使用keytool生成公钥、私钥、证书并且读取出来,使用私钥签名jar并验证(转)

参考链接:http://happyqing.iteye.com/blog/2139504 :https://blog.csdn.net/arjelarxfc/article/details/52461828 :https://blog.csdn.net/yangxt/article/details/1796965 在看书的时候涉及到了Java的安全加密技术,然后发现生成私钥公钥证书用的是keytool这个jdk自带插件 keytool的主要用法: keytool的几个常用的命令. 1.创建证书

Java RSA加密算法生成公钥和私钥

原文:http://jingyan.baidu.com/article/6dad5075f33466a123e36ecb.html?qq-pf-to=pcqq.c2c 目前为止,RSA是应用最多的公钥加密算法,能够抵抗已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. RSA算法中,每个通信主体都有两个钥匙,一个公钥(Public Key)用来对数据进行加密: 一个私钥(Private Key)用来对数据进行解密. 下面来看下Java中是如何使用KeyPairGenerator生成key

sourceTree 生成公钥和私钥 然后拉项目代码

第一步 用sourceTree生成公钥pub和私钥文件ppk 打开sourceTree -> 工具 -> 创建或导入ssh密钥 -> 点击generate -> 上面会显示乱码 -> 在下面输入名字 和两遍密码 -> 保存公钥和私钥 到个人工作文件夹. 第二步 在代码管理库,存入公钥 在代码库保存登录信息:  登录http://gitlab.17zuoye.net -> 点击左下角自己头像 -> 点击Profile Settings -> 点击SSH密

JAVA中数字证书的维护及生成方

Java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息.证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥.  每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码.  在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码.这些信息包括 CN=xx,OU=xx,O=xx,L=xx,

Java代码签名证书申请和使用指南

第1步 下载签名工具 Step 1: Download Signing Tools 如果您还没有签名工具,请到SUN公司网站免费下载:http://java.sun.com/j2se/,推荐下载JDK1.4.2或以上版本,支持Solaris SPARC/x86, Linux86 和 Windows 操作系统. If you have not already done so, download the Java 2 Software Development Kit (SDK). The lates

【Java】数字证书原理

公钥机制面临的问题-假冒身份发布公钥采用公钥机制进行加密传输面临的一个问题是公钥的发布.任何一个用户都可以通过网络向所有人发布伪造的公钥,如果某个用户假冒真正用户的名义发布一个公钥,在该假冒者被揭穿以前,他可以解读所有发向真正用户的加密消息,还可以通过签名冒充真正用户的身份. 用户A假冒用户B的身份发布一个公钥  其他用户使用假冒的公钥与用户B通信,信息内容被用户A窃取 数字证书-验证公钥所属的用户身份在日常生活中,如果我们要验证一个人的身份,通常的做法是查看他的身份证.我们信任身份证颁发机构即