jjzjj

Java Keytool 介绍

且行且码 2023-04-16 原文

keytool 是 Java 自带的一个安全相关的工具,用于管理密钥和证书;本文主要介绍其基本使用;文中所使用到的软件版本:Java 1.8.0_321。

1、简介

keytool 命令是一个密钥和证书管理的工具。它允许用户使用数字签名管理自己的公钥/私钥对和相关证书,用于自我身份验证(向其他用户和服务验证自己)或数据完整性和身份验证服务。keytool 命令还允许用户缓存通信对等体的公钥(以证书的形式)。

证书是来自一个实体(个人、公司等)的数字签名声明,它表示实体的公钥(和一些其他信息)具有特定的值。对数据进行数字签名时,可以对签名进行验证,以验证数据的完整性和真实性。完整性意味着数据没有被修改或篡改,真实性意味着数据来自声称创建并签名它的人。

keytool 命令还允许用户管理对称加密和解密中使用的秘密密钥和口令。

keytool 命令将密钥和证书存储在keystore中。

2、用法

keytool [commands]

命令如下:

-certreq            生成证书请求
-changealias        更改条目的别名
-delete             删除条目
-exportcert         导出证书
-genkeypair         生成密钥对
-genseckey          生成密钥
-gencert            根据证书请求生成证书
-importcert         导入证书或证书链
-importpass         导入口令
-importkeystore     从其他密钥库导入一个或所有条目
-keypasswd          更改条目的密钥口令
-list               列出密钥库中的条目
-printcert          打印证书内容
-printcertreq       打印证书请求的内容
-printcrl           打印 CRL 文件的内容
-storepasswd        更改密钥库的存储口令

可以使用如下命令查看每个命令的用法:

keytool -command_name -help

命令的参数有些是有默认值的,使用命令时可以不指定:

-alias "mykey"
 
-keyalg
    "DSA" (when using -genkeypair)
    "DES" (when using -genseckey)
 
-keysize
    2048 (when using -genkeypair and -keyalg is "RSA")
    1024 (when using -genkeypair and -keyalg is "DSA")
    256 (when using -genkeypair and -keyalg is "EC")
    56 (when using -genseckey and -keyalg is "DES")
    168 (when using -genseckey and -keyalg is "DESede")
 
-validity 90
 
-keystore <the file named .keystore in the user's home directory>
 
-storetype <the value of the "keystore.type" property in the
    security properties file, which is returned by the static
    getDefaultType method in java.security.KeyStore>
 
-file
    stdin (if reading)
    stdout (if writing)
 
-protected false

-sigalg
    "SHA256withDSA" (when the underlying private key is of type DSA)
    "SHA256withRSA" (when the underlying private key is of type RSA)
    "SHA256withECDSA" (when the underlying private key is of type EC)

3、具体使用

3.1、创建密钥对

使用“keytool -genkeypair"命令会生成一个密钥对(公钥和私钥)并将公钥包装到X.509 v3自签名证书中,密钥对存储在以别名标识的条目中,条目类型为 PrivateKeyEntry。

使用命令 keytool -genkeypair -help 查看用法:

keytool -genkeypair [OPTION]...

生成密钥对

选项:

 -alias <alias>                  要处理的条目的别名
 -keyalg <keyalg>                密钥算法名称
 -keysize <keysize>              密钥位大小
 -groupname <name>               Group name. For example, an Elliptic Curve name.
 -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                      通过受保护的机制的口令

下面创建一个别名为 test1 的条目:

keytool -genkeypair -alias test1 -keyalg RSA -keystore /home/mongo/test.keystore -storetype pkcs12

首先提示设置密钥库的密码,然后输入 CN(公用名)、OU(组织单位)、O(组织)、L(城市)、ST(省份)、 C(国家) ,最后回车。

注意:

1、如果指定的密钥库不存在,则会自动创建,需要设置密钥库口令;如果密钥库存在需要输入密钥口令。
2、如果创建默认类型(JKS)的密钥库,则可使用"-keypass"参数指定条目的密钥口令,如果没有指定则会在最后一步提示"输入该条目的密钥口令,(如果与密钥库口令相同按回车)",一般设为与密钥库口令相同。如果创建 PKCS12 类型的密钥库,则会忽略条目的密钥口令参数,因为 PKCS12 不支持设置密钥库条目密钥口令,默认它与密钥库密码一致。

3.2、创建密钥

keytool -genseckey -alias test1 -keystore /home/mongo/test2.keystore -storetype jceks

创建密钥时,-storetype 需指定为 jceks,否则会报错。

3.3、查看密钥库信息

keytool -list -v -keystore /home/mongo/test.keystore

指定密钥库的位置,查看该密钥库的条目信息。

3.4、导出证书

keytool -exportcert -keystore /home/mongo/test.keystore -alias test1 -file test1.cer

指定密钥库及需导出证书的条目,导出证书到指定的文件;执行命令后当前目录下生成了 test1.cer 的证书文件。

3.5、打印证书内容

keytool -printcert -file test1.cer

也可以使用 -sslserver <server[:port]> 参数,直接从网络上打印某个 ssl server 的证书内容 。

3.6、导入证书

keytool -importcert -keystore /home/mongo/test.keystore -file test1.cer -alias test2

执行命令后会在密钥库中增加一个条目类型为 trustedCertEntry,别名为 test2 的条目。

3.7、删除条目

keytool -delete -keystore /home/mongo/test.keystore -alias test2

执行命令后别名为 test2 的条目将被删除。

3.8、签发证书

先使用一个条目生成证书请求,再使用另外一个条目根据证书请求生成证书。

A、生成证书请求

keytool -certreq -keystore /home/mongo/test.keystore -alias test1 -file test1.csr

使用别名为 test1 的条目生成证书请求文件 test1.csr。

B、创建另一个密钥对用于签发证书

keytool -genkeypair -alias ca -keyalg RSA -keystore /home/mongo/test.keystore -storetype pkcs12

C、使用别名为 ca 的条目签发证书

keytool -gencert -alias ca -keystore /home/mongo/test.keystore -infile test1.csr -outfile test2.cer

4、Java API 操作密钥库

可以通过 Java 代码来访问密钥库,读取所需要的信息。

package com.abc.demo.general.keystore;

import java.io.FileInputStream;
import java.security.*;
import java.security.cert.X509Certificate;

public class KeystoreCase {
    public static void main(String[] args) throws Exception {
        KeyStore keyStore = loadKeyStore("pkcs12", "d:/test.keystore", "123456");
        //读取私钥
        PrivateKey privateKey = (PrivateKey) keyStore.getKey("test1", "123456".toCharArray());
        System.out.println("privateKey:" + privateKey);
        //读取证书
        X509Certificate certificate = (X509Certificate)keyStore.getCertificate("test1");
        System.out.println("certificate:" + certificate);
        //读取公钥
        PublicKey publicKey = certificate.getPublicKey();
        System.out.println("publicKey:" + publicKey);

        //获得公钥及私钥后,就可以通过公钥及私钥进行加解密操作、签名及验签操作。
    }

    private static KeyStore loadKeyStore(String type, String filePath, String password) {
        KeyStore keySotre = null;
        try (FileInputStream in = new FileInputStream(filePath)) {
            keySotre = KeyStore.getInstance(type);
            keySotre.load(in, password.toCharArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return keySotre;
    }
}

 

 

参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#CHDFFCBG

有关Java Keytool 介绍的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  3. Spring Cloud Gateway 服务网关的部署与使用详细介绍 - 2

    为什么需要服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。有了网关之后,网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务。使用网关的好处1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发

  4. ruby - Vim 详细介绍了 Rails 的自动完成功能 - 2

    我发现python的细节自动完成很好RubyonRails有类似的方法描述吗? 最佳答案 有篇不错的文章"UsingVIMasacompleteRubyonRailsIDE"其中引用rails.vim.这似乎是RailsforVIM的实际标准。(不过,我还没有使用过它,但很快就会尝试。)这允许你做很多与Rails相关的任务,但对自动完成没有帮助。还有一篇"RubyAutocompleteinVim"(遗憾的是不再可用)这就是您要搜索的内容。我不知道,理解Rails的所有插件魔法和元编程的东西是否足够聪明。它至少在vim的配置中提到了

  5. 华为防火墙简单介绍 - 2

    防火墙防火墙分类第一代防火墙:包过滤防火墙包过滤防火墙的缺点第二代防火墙:代理防火墙第三代防火墙:状态防火墙第四代防火墙:UTM防火墙第五代防火墙:下一代防火墙华为防火墙介绍安全策略防火墙的会话表防火墙分类第一代防火墙:包过滤防火墙属于第一代防火墙技术,在没有专用防火墙设备时,一般由路由器实现该功能。将网络上传送数据包的IP首部以及TCP/UDP首部,获取发送源的IP地址和端口号,以及目的地的IP地址和端口号,并将这些信息作为过滤条件,决定是否将该分组转发至目的地网络分组过滤的执行需要设置访问控制列表。访问控制列表也可以称为安全策略(简称策略)或安全规则(简称规则)。类似于进站检票的做法,符合

  6. Qt样式表之 QSS 语法介绍;QLineEdit、 - 2

     内容来自Qt样式表之QSS语法介绍-3YL的博客Qt样式表是一个可以自定义部件外观的十分强大的机制,可以用来美化部件。Qt样式表的概念、术语和语法都受到了HTML的层叠样式表(CascadingStyleSheets, CSS教程)的启发,不过与CSS不同的是,Qt样式表应用于部件的世界。类型选择器QPushButton匹配QPushButton及其子类的实例ID选择器QPushButton#okButton匹配所有objectName为okButton的QPushButton实例。 CSS常用样式1CSS文字属性注:px:相对长度单位,像素(Pixel)。pt:绝对长度单位,点(Point

  7. Android对话框的详细介绍(提示对话框,自定义对话框) - 2

    简介:我们都知道在Android开发中,当我们的程序在与用户交互时,用户会得到一定的反馈,其中以对话框的形式的反馈还是比较常见的,接下来我们来介绍几种常见的对话框的基本使用。前置准备:(文章最后附有所有代码)我们首先先写一个简单的页面用于测试这几种Dialog(对话框)代码如下,比较简单,就不做解释了一、提示对话框(即最普通的对话框)首先我们给普通对话框的按钮设置一个点击事件,然后通过AlertDialog.Builder来构造一个对象,为什么不直接Dialog一个对象,是因为Dialog是一个基类,我们尽量要使用它的子类来进行实例化对象,在实例化对象的时候,需要将当前的上下文传过去,因为我这

  8. 技术分享 | observer 资源水位介绍 - 2

    作者:郭斌斌爱可生DBA团队成员,负责项目日常问题处理及公司平台问题排查。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。OceanBase集群界面会展示Observer的资源水位,今天简单了解一下资源水位的数值代表的含义以及关联参数现有test_1集群,只有一个sys租户Sys租户的资源配置:Cpu:2.5-5Memory:3G-3GUnit:1集群的资源水位信息以10.186.63.198为例,浅看一下cpu、内存、磁盘的含义以及相关联参数cpu:2.5/17核2.5代表observer上已经分配给租户的cpu核数,该数值是租户的MinCPU

  9. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  10. 涡旋光束基本概念介绍 - 2

    涡旋光束及其MATLAB实现前言涡旋光束的基本概念常见的涡旋涡旋光束涡旋光束的产生方法前言笔者新开一块专栏,专门用于讨论整理总结涡旋光束的相关内容,从基本的概念出发,推导相关的公式,并结合MATLAB进行相关的仿真,不清楚这个专栏会更新多少期,我会分享部分的代码,全部的代码有需要的话可以私聊我。当然大家对这个专栏感兴趣的话,欢迎积极交流。涡旋光束的基本概念​涡旋光束(vortexbeam)是指携带光学涡旋,具有exp(imϕ)exp(im\phi)exp(imϕ)相位分布的光束,其中mmm表示相位拓扑电荷数,ϕ\phiϕ是柱坐标下的方位角。之前的分享中笔者已经说明了部分的激光光束的表达式,想要

随机推荐