Java jks

2024-05-13 13:32
文章标签 java jks

本文主要是介绍Java jks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Java代码生成cer证书文件:
public class GetCertFile {


    //证书颁发者
    static String CertificateIssuer = "C=中国,ST=广东,L=广州,O=人民组织,OU=人民单位,CN=人民颁发";
    //证书使用者
    static String CertificateUser = "C=中国,ST=广东,L=广州,O=人民组织,OU=人民单位,CN=";
    
    public static void main(String[] args) {
        try {
            X509Certificate cert = getCert();
            System.out.println(cert.toString());


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
    * CN(Common Name名字与姓氏)
    * OU(Organization Unit组织单位名称)
    * O(Organization组织名称)
    * ST(State州或省份名称)
    * C(Country国家名称)
    * L(Locality城市或区域名称)
    * */
    public static X509Certificate getCert() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        X509V3CertificateGenerator x509V3CertificateGenerator = new X509V3CertificateGenerator();
        //设置证书序列号
        x509V3CertificateGenerator.setSerialNumber(BigInteger.TEN);
        //设置证书颁发者
        x509V3CertificateGenerator.setIssuerDN(new X500Principal(CertificateIssuer));
        //设置证书使用者
        x509V3CertificateGenerator.setSubjectDN(new X500Principal(CertificateUser + "sun"));
        //设置证书有效期
        x509V3CertificateGenerator.setNotAfter(new Date(System.currentTimeMillis() + 1000 * 365 * 24 * 3600));
        x509V3CertificateGenerator.setNotBefore(new Date(System.currentTimeMillis()));
        //设置证书签名算法
        x509V3CertificateGenerator.setSignatureAlgorithm("SHA1withRSA");


        x509V3CertificateGenerator.setPublicKey(publicKey);


        //临时bc方法添加都环境变量
        Security.addProvider(new BouncyCastleProvider());
        X509Certificate x509Certificate = x509V3CertificateGenerator.generateX509Certificate(keyPair.getPrivate(), "BC");
        //写入文件
        FileOutputStream fos = new FileOutputStream("F:\\cer.cer");
        fos.write(x509Certificate.getEncoded());
        fos.flush();
        fos.close();
        return x509Certificate;
    }
}


二、Java代码生成jks文件和cer证书文件,以及jks文件和cer文件的读取:
public class GetJksAndCerFile {


    public static void main(String[] args) {
        buildKeyAndSaveToJksFile();
        exportCerFile();
        try {
            readJks();
            readCer();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void executeCommand(String[] arstringCommand) {
        try {
            Runtime.getRuntime().exec(arstringCommand);


        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }


    //生成密钥并保存到jks文件
    public static void buildKeyAndSaveToJksFile() {
        String[] command = new String[]{


                "cmd ",
                "/k",
                "start", // cmd Shell命令


                "keytool",
                "-genkeypair", //表示生成密钥
                "-alias", //要处理的条目的别名(jks文件别名)
                "sun",
                "-keyalg", //密钥算法名称(如 RSA DSA(默认是DSA))
                "RSA",
                "-keysize",//密钥位大小(长度)
                "1024",
                "-sigalg", //签名算法名称
                "SHA1withRSA",
                "-dname",// 唯一判别名,CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称),
                // ST=(州或省份名称), C=(单位的两字母国家代码)"
                "CN=(张三), OU=(人民单位), O=(人民组织), L=(广州), ST=(广东), C=(中国)",
                "-validity", // 有效天数
                "36500",
                "-keypass",// 密钥口令(私钥的密码)
                "123456",
                "-keystore", //密钥库名称(jks文件路径)
                "f:/demo.jks",
                "-storepass", // 密钥库口令(jks文件的密码)
                "123456",
                "-v"// 详细输出(秘钥库中证书的详细信息)
        };
        executeCommand(command);
    }


    //从jks文件中导出证书文件
    public static void exportCerFile() {
        String[] command = new String[]{
                "cmd ", "/k",
                "start", // cmd Shell命令


                "keytool",
                "-exportcert", // - export指定为导出操作
                "-alias", // -alias指定别名,这里是ss
                "sun",
                "-keystore", // -keystore指定keystore文件,这里是d:/demo.keystore
                "f:/demo.jks",
                "-rfc",
                "-file",//-file指向导出路径
                "f:/demo.cer",
                "-storepass",// 指定密钥库的密码
                "123456"
        };
        executeCommand(command);


    }


    //读取jks文件获取公、私钥
    public static void readJks() throws Exception {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(new FileInputStream("f:\\demo.jks"), "123456".toCharArray());
        Enumeration<String> aliases = keyStore.aliases();
        String alias = null;
        while (aliases.hasMoreElements()) {
            alias = aliases.nextElement();
        }
        System.out.println("jks文件别名是:" + alias);
        PrivateKey key = (PrivateKey) keyStore.getKey(alias, "123456".toCharArray());
        System.out.println("jks文件中的私钥是:" + new String(Base64.encode(key.getEncoded())));
        Certificate certificate = keyStore.getCertificate(alias);
        PublicKey publicKey = certificate.getPublicKey();
        System.out.println("jks文件中的公钥:" + new String(Base64.encode(publicKey.getEncoded())));
    }


    //读取证书文件获取公钥
    public static void readCer() throws Exception {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        Certificate certificate =
                certificateFactory.generateCertificate(new FileInputStream("f:\\demo.cer"));
        PublicKey publicKey = certificate.getPublicKey();
        System.out.println("证书中的公钥:" + new String(Base64.encode(publicKey.getEncoded())));
    }
}


需导入的jar包:
<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk16</artifactId>
            <version>1.46</version>
        </dependency>


三、使用keytool命令生成jks文件和cer证书文件:
   先进入jdk的bin目录,然后执行keytool命令。
1、生成jks文件命令:keytool -genkey -validity 36500 -keysize 1024 -alias sun -sigalg SHA1withRSA -keyalg RSA -keystore f:/demo.jks -dname CN=(SS)OU=(SS)O=(SS)L=(BJ)ST=(BJ)C=(CN) -storepass 123456 -keypass 123456 -v
2、生成cer证书文件命令:keytool -exportcert -alias sun -keystore f:/demo.jks -rfc -file f:/demo.cer -storepass 123456


3、生成jks文件的keytool命令参数:
-alias <alias>                  要处理的条目的别名
-keyalg <keyalg>                密钥算法名称
-keysize <keysize>              密钥位大小
-sigalg <sigalg>                签名算法名称
-destalias <destalias>          目标别名
-dname <dname>                  唯一判别名
-startdate <startdate>          证书有效期开始日期/时间
-ext <value>                    X.509 扩展
-validity <valDays>             有效天数
-keypass <arg>                  密钥口令
-keystore <keystore>            密钥库名称
-storepass <arg>                密钥库口令
-storetype <storetype>          密钥库类型
-providername <providername>    提供方名称
-providerclass <providerclass>  提供方类名
-providerarg <arg>              提供方参数
-providerpath <pathlist>        提供方类路径
-v                              详细输出
-protected                      通过受保护的机制的口令


4、生成cer证书文件keytool命令参数:
-certreq            生成证书请求
-changealias        更改条目的别名
-delete             删除条目
-exportcert         导出证书
-genkeypair         生成密钥对
-genseckey          生成密钥
-gencert            根据证书请求生成证书
-importcert         导入证书或证书链
-importpass         导入口令
-importkeystore     从其他密钥库导入一个或所有条目
-keypasswd          更改条目的密钥口令
-list               列出密钥库中的条目
-printcert          打印证书内容
-printcertreq       打印证书请求的内容
-printcrl           打印 CRL 文件的内容
-storepasswd        更改密钥库的存储口令
--------------------- 
作者:S_First 
来源:CSDN 
原文:https://blog.csdn.net/S_First/article/details/78701156 
版权声明:本文为博主原创文章,转载请附上博文链接!

这篇关于Java jks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985843

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、