• Java Security:keytool工具使用说明


    Keytool用法说明

    Keytool是一个key与cert的管理工具。使用keytool可以管理public key、private key,以及与key之相关的certificate。

    1、command和option说明

    1.1 command

    使用keytool工具时,可以使用15种命令:

     

    1.2 option

    Option是命令的参数,要了解某个命令的参数可以使用keytool –command_name –help来获取。例如:使用keytool –genkeypair –help可以查看genkeypair命令的参数说明:

     

    这个命令中,有许多命令使用的参数是有默认值的,使用命令时可以不指定的,看看下表:

    Option

    默认值

    -alias

    “mykey”

    -keyalg

    “DSA” 使用-genkeypair命令时

    “DES” 使用-genseckey命令时

    -keysize

    2048  使用 –genkeypair命令,并且-keyalg选项是”RSA”时

    1024  使用 –genkeypair命令,并且-keyalg选项是”DSA”时

    256   使用 –genkeypair命令,并且-keyalg选项是”EC”时

    56    使用 –genseckey 命令,并且-keyalg选项是”DES”时

    168   使用 –genseckey 命令,并且-keyalg选项是”DESede”时

    -validity

    90

    -keystore

    默认的的文件名是 .keystore ,是一个隐藏文件。

    -storetype

    默认值java.security中配置的,SUN指定的是JKS,可以人为修改

    -file

    如果是写,值为stout,如果是读,值为stdin

    -protected

    false

    -sigalg

    SHA1withDSA   如果生成KeyPair使用的时DSA算法

    SHA256withRSA 如果生成KeyPair使用的时RSA算法

    SHA256withECDSA 如果生成KeyPair使用的时EC算法

    2、Commands

    2.1 生成keypair并查看

    genkeypair

    -genkeypair
    {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-startdate value} {-ext ext}* {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

    生成KeyPair,并且生成使用X.509 v3 自签名的证书。  

    看下面的例子:

     

    查看命令详情,可以使用list命令(参见下面list命令),也可以使用JAVA程序来查看。

    下面是一个Java程序查看的例子:

    package com.fjn.other.security;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.security.Key;
    import java.security.KeyStore;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.cert.Certificate;
    import java.security.interfaces.DSAPrivateKey;
    import java.util.Enumeration;
    
    import org.junit.Test;
    
    public class KeyPaireReader {
        public void read(String file, String password) throws Exception {
            FileInputStream fis = null;
            fis = new FileInputStream(new File(file));
    
            KeyStore keystore = KeyStore.getInstance("JKS");
            keystore.load(fis, password.toCharArray());
    
            System.out.println(keystore.containsAlias("mykey"));
    
            Enumeration<String> aliases=keystore.aliases();
            while(aliases.hasMoreElements()){
                String alias = aliases.nextElement();
                String createDate = keystore.getCreationDate(alias)
                        .toLocaleString();
                System.out.println("createDate: " + createDate);
                Key key = keystore.getKey(alias, password.toCharArray());
                if (key != null && key instanceof PrivateKey) {
                    if ("DSA".equals(key.getAlgorithm().toUpperCase())) {
                        DSAPrivateKey pik = (DSAPrivateKey) key;
                        System.out.println(pik.getX());
                    }
                }
                Certificate[] certs= keystore.getCertificateChain(alias);
                for (Certificate cert : certs) {
                    PublicKey puk = cert.getPublicKey();
                    System.out.println(puk);
                }
            }
            
        }
    
    
        @Test
        public void test() throws Exception {
            read("D:\keytooltest\ca1.jks", "111111");
        }
    }
    View Code

    上面程序执行结果: 

     

    list

    -list
    {-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v | -rfc} {-protected} {-Jjavaoption}

    打印出指定alias的信息,如果没有指定alias,则显示所有的。 

    下面的例子,就是打出了上面使用genkeypair生成的alias为mykey的key详情:

     

      

    2.2 证书签名处理

    这个过程涉及到3个命令:

    certreq、gencert、importcert

    1)机构A使用certreq生成一个证书签名请求文件(CSR certificate sign request),生成的文件就代表一个请求。

    2)CA(证书认证中心)接收到这个请求后,经过处理(使用gencert),会生成一个证书或者证书链。

    3)机构A接收到响应,将证书导入(importcert)到keystore中。

    在说明这个处理之前,先使用genkeypair生成2个keystore文件:

    keytool -genkeypair -alias ca1 -keystore D:keytooltestca1.jks
    keytool -genkeypair -alias ca2 -keystore D:keytooltestca2.jks

     

    certreq

    把请求放到文件中:

    keytool -certreq -alias ca1 -keystore D:keytooltestca1.jks -file D:keytooltestca1_to_ca2.req

    gencert

    -gencert
    {-rfc} {-infile infile} {-outfile outfile} {-alias alias} {-sigalg sigalg} {-dname dname} {-startdate startdate {-ext ext}* {-validity valDays} [-keypass keypass] {-keystore keystore} [-storepass storepass] {-storetype storetype} {-providername provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
    keytool -gencert -alias ca2 -infile D:keytooltestca1_to_ca2.req -outfile D:keytooltestca2_to_ca1.cert -keystore D:keytooltestca2.jks

    importcert

     

    官方学习资料:

    http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html

    http://docs.oracle.com/javase/7/docs/technotes/tools/windows/keytool.html

    http://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html

    深入了解:

    http://www.ibm.com/developerworks/cn/java/j-lo-socketkeytool/index.html?ca=drs 

  • 相关阅读:
    重写/覆盖基类的事件
    关于“日志”的输出控制
    WPF中DataGrid垂直滚动条滚动后导致每行CheckBox选择错乱
    WPF窗体应用程序开发
    C# 操作自定义config文件
    WPF绑定数据源之RelativeSource
    C# http请求 设置代理(标题可以作为搜索关键字)
    前端加载特效
    实现不同的项目,用不同的git 账号提交
    Casbin 使用记录
  • 原文地址:https://www.cnblogs.com/f1194361820/p/4266511.html
Copyright © 2020-2023  润新知