随着信息安全的重要性的日益提高,HTTP/FTP等越来越多的被迁到了 HTTPS/SFTP,SSL/TLS已经是避无可避。了解一些简单的加密算法的基本理论或者常见工具,或者如何生成和使用证书,这些都在工作中应用的愈加广泛。Java自带的Keytool工具就是这样的一种工具,被广泛地用于管理密钥和证书。

前提

keytool工具是JDK自带的工具,所以前提就是安装JDK。具体可以参照Maven的安装脚本,安装Maven的前提是安装JDK,所以下面的脚本执行之后,JDK自然会被安装。已经有JDK的可以跳过此步。

安装参照 http://blog.csdn.net/liumiaocn/article/details/61920553

安装确认

确认keytool可用

[root@liumiaocn ~]# which keytool
/usr/local/java/jdk1.8.0_121/bin/keytool
[root@liumiaocn ~]#

命令说明

keytool命令以及常见的option如下所示:

项目 详细
-certreq 创建证书请求
-changealias 变更证书私钥
-exportcert 导出证书
-genkeypair 创建密钥对
-genseckey 创建加密密钥
-gencert 依据证书请求创建证书
-importcert 导入证书或者证书链
-importpass 导入密码
-importkeystore 从其他keystore中导入一个或者所有条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印CRL文件内容
-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
-alias 产生别名 缺省值"mykey"
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))
-validity 指定创建的证书有效期多少天 缺省值90天
-keysize 指定密钥长度 缺省值1024
-storepass 指定密钥库的密码(获取keystore信息所需的密码)
-keypass 指定别名条目的密码(私钥的密码)
-dname 指定证书拥有者信息 例如: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”
-list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码
-printcert 查看导出的证书信息 keytool -printcert -file 证书名称
-keypasswd 修改密钥库中指定条目口令
-storepasswd 修改keystore口令 keytool -storepasswd -keystore keystore的FULLPATH -storepass 原始密码 -new 新密码
-import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

证书管理

证书的发行有专门的CA机构,但是基本上都是要付费的,CA机构又不是NGO,无利不起早,不然为什么人家要做这个呢。一般来说除非是非常正式的项目,一般的项目很多情况下使用自发行的证书即可。

基础知识

认证方式 证书种类 详细
单向认证 服务器端证书 客户端对服务器端的证书进行认证
双向认证 服务端证书/客户端证书 客户端对服务器端的证书进行认证,同时服务器端对客户端的证书也进行认证

keystore生成

按照如下信息生成keystore

项目 详细
alias名称 kstore
keypass init123
算法 RSA
秘钥长度 2048
有效期限(天) 30
保存路径 /tmp/kstore.keystore
storepass init234

执行命令:

keytool -genkey -alias kstore -keypass init123 -keyalg RSA -keysize 2048 -validity 30 -keystore /tmp/kstore.keystore -storepass init234

执行参照

[root@liumiaocn ~]# keytool -genkey -alias kstore -keypass init123 -keyalg RSA -keysize 2048 -validity 30 -keystore /tmp/kstore.keystore -storepass init234
What is your first and last name?[Unknown]:  michael
What is the name of your organizational unit?[Unknown]:  liumiaocn
What is the name of your organization?[Unknown]:  ngo
What is the name of your City or Locality?[Unknown]:  dalian
What is the name of your State or Province?[Unknown]:  liaoning
What is the two-letter country code for this unit?[Unknown]:  CN
Is CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN correct?[no]:  yes[root@liumiaocn ~]#

生成结果文件确认

[root@liumiaocn ~]# ls -l /tmp/kstore.keystore
-rw-r--r--. 1 root root 2230 Mar 10 17:46 /tmp/kstore.keystore
[root@liumiaocn ~]# file /tmp/kstore.keystore
/tmp/kstore.keystore: Java KeyStore
[root@liumiaocn ~]#

keystore确认

因为生成的/tmp/kstore.keystore非文本类型文件,无法直接确认内容,使用list子命令可以确认keystore的详细信息。
执行命令:

keytool -list  -v -keystore /tmp/kstore.keystore -storepass init234

执行参照

[root@liumiaocn ~]# keytool -list  -v -keystore /tmp/kstore.keystore -storepass init234Keystore type: JKS
Keystore provider: SUNYour keystore contains 1 entryAlias name: kstore
Creation date: Mar 10, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Issuer: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Serial number: 58700a1
Valid from: Fri Mar 10 17:46:00 EST 2017 until: Sun Apr 09 18:46:00 EDT 2017
Certificate fingerprints:MD5:  C9:88:B5:3E:62:F1:31:4D:8B:81:9C:45:90:F1:0F:CFSHA1: 59:C9:D3:3F:07:80:73:7C:7E:43:94:3B:E5:43:61:FF:14:F1:1A:CCSHA256: 32:71:6C:1E:1F:F6:23:01:66:81:92:36:C8:6F:E3:8D:5B:32:C4:F2:10:94:D0:3D:8C:07:5B:91:7A:59:B2:56Signature algorithm name: SHA256withRSAVersion: 3Extensions:#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 06 91 44 93 93 46 D0 EE   A9 B3 9C A6 6C 1A BD D4  ..D..F......l...
0010: E3 EA 74 74                                        ..tt
]
]*******************************************
*******************************************[root@liumiaocn ~]#

证书导出

单向认证和双向认证时不可避免的用到证书,使用如下命令则可以生成证书。

keytool -export -alias kstore -keystore /tmp/kstore.keystore -file /tmp/kstore.crt -rfc -storepass init234

注意: storepass的密码是/tmp/kstore.keystore生成时创建的密码,此处是作确认用,输入错误会提示:Keystore was tampered with, or password was incorrect

执行参照

[root@liumiaocn ~]# keytool -export -alias kstore -keystore /tmp/kstore.keystore -file /tmp/kstore.crt -rfc -storepass init234
Certificate stored in file </tmp/kstore.crt>
[root@liumiaocn ~]# file /tmp/kstore.crt
/tmp/kstore.crt: PEM certificate
[root@liumiaocn ~]#
[root@liumiaocn ~]#
[root@liumiaocn ~]# cat /tmp/kstore.crt
-----BEGIN CERTIFICATE-----
MIIDaTCCAlGgAwIBAgIEBYcAoTANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJD
TjERMA8GA1UECBMIbGlhb25pbmcxDzANBgNVBAcTBmRhbGlhbjEMMAoGA1UEChMD
bmdvMRIwEAYDVQQLEwlsaXVtaWFvY24xEDAOBgNVBAMTB21pY2hhZWwwHhcNMTcw
MzEwMjI0NjAwWhcNMTcwNDA5MjI0NjAwWjBlMQswCQYDVQQGEwJDTjERMA8GA1UE
CBMIbGlhb25pbmcxDzANBgNVBAcTBmRhbGlhbjEMMAoGA1UEChMDbmdvMRIwEAYD
VQQLEwlsaXVtaWFvY24xEDAOBgNVBAMTB21pY2hhZWwwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDL/LZP2FH8jybQD7KvKaqo0TS17xr8isWIkYcjVkvP
T8ZoijWxSLckLI8r83g1Az+obfBuqDlbP/C2qGqf64MGw4mh6/CXnYNgvTOzgLOq
xFgCSQebBhGx0u6gDCpgkoOdTzljDs6YR7Jv3rhIUodsPxc+Bzf8NXbDi1i6rvi5
UW7ijLYFH1jAozTOlLtVWK1cw97BlXXcYhUEBsO682UzYvOeqCuPGcXKX7v1CsND
j+OWf+kfAZ1RF7e3/8IC/FBuAVKHbMD9jWknwAMI7NqGx4Ej6K0LFL6C4XmZMHla
sznT7Eyri0YS5jdWYI+duOEmcbh7MR1FzsZzcw8mmSKPAgMBAAGjITAfMB0GA1Ud
DgQWBBQGkUSTk0bQ7qmznKZsGr3U4+p0dDANBgkqhkiG9w0BAQsFAAOCAQEAdRpS
qAtxZ5JEzN/upzlT6Cp2kK6k7ZQ8ezKYDdUgBtqvMC/TaHwJCMHnvr0aSs24o8SI
v0vmX01RXf5qzMmelMiJCA2EyRFIsKwKE6fWvyRaK1L5NiKbbivqiOHlvcw5pZfK
iC/Cy6W0Y7KY4AtfNreAX7lmxQ611sc6F/Dz5rFv8s5gSaBg6oxc3HnXWYkR9iGu
lYJUhV4tanXsgyhS1/N6PiLbwZ+8ryactI9XgCmao+WQ1M0uhEITZFr8TuRkrG9K
fmvZUD+STRGDh4Us447vezeCw3s/r2rNsvxSpPhRd9PlPJShLe8lVM+bpkdilGwk
yOAewyPCWGtaaWXwIQ==
-----END CERTIFICATE-----
[root@liumiaocn ~]#

证书确认

生成的证书的格式是PEM certificate,确认其内容则可以通过如下命令:

keytool -printcert -file /tmp/kstore.crt

执行参照

[root@liumiaocn ~]# keytool -printcert -file /tmp/kstore.crt
Owner: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Issuer: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Serial number: 58700a1
Valid from: Fri Mar 10 17:46:00 EST 2017 until: Sun Apr 09 18:46:00 EDT 2017
Certificate fingerprints:MD5:  C9:88:B5:3E:62:F1:31:4D:8B:81:9C:45:90:F1:0F:CFSHA1: 59:C9:D3:3F:07:80:73:7C:7E:43:94:3B:E5:43:61:FF:14:F1:1A:CCSHA256: 32:71:6C:1E:1F:F6:23:01:66:81:92:36:C8:6F:E3:8D:5B:32:C4:F2:10:94:D0:3D:8C:07:5B:91:7A:59:B2:56Signature algorithm name: SHA256withRSAVersion: 3Extensions:#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 06 91 44 93 93 46 D0 EE   A9 B3 9C A6 6C 1A BD D4  ..D..F......l...
0010: E3 EA 74 74                                        ..tt
]
][root@liumiaocn ~]#

证书导入

将生成的证书倒入到keystore中,使用如下命令:

keytool -import -alias aliascrt -file /tmp/kstore.crt -keystore /tmp/kstore.keystore -storepass init234 -keypass init123

事前确认

文件信息

[root@liumiaocn tmp]# ll kstore.keystore kstore.crt
-rw-r--r--. 1 root root 1263 Mar 10 17:57 kstore.crt
-rw-r--r--. 1 root root 2230 Mar 10 17:46 kstore.keystore
[root@liumiaocn tmp]#

keystore详细

[root@liumiaocn tmp]# keytool -list  -v -keystore /tmp/kstore.keystore -storepass init234Keystore type: JKS
Keystore provider: SUNYour keystore contains 1 entryAlias name: kstore
Creation date: Mar 10, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Issuer: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Serial number: 58700a1
Valid from: Fri Mar 10 17:46:00 EST 2017 until: Sun Apr 09 18:46:00 EDT 2017
Certificate fingerprints:MD5:  C9:88:B5:3E:62:F1:31:4D:8B:81:9C:45:90:F1:0F:CFSHA1: 59:C9:D3:3F:07:80:73:7C:7E:43:94:3B:E5:43:61:FF:14:F1:1A:CCSHA256: 32:71:6C:1E:1F:F6:23:01:66:81:92:36:C8:6F:E3:8D:5B:32:C4:F2:10:94:D0:3D:8C:07:5B:91:7A:59:B2:56Signature algorithm name: SHA256withRSAVersion: 3Extensions:#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 06 91 44 93 93 46 D0 EE   A9 B3 9C A6 6C 1A BD D4  ..D..F......l...
0010: E3 EA 74 74                                        ..tt
]
]*******************************************
*******************************************[root@liumiaocn tmp]#

导入

[root@liumiaocn tmp]# keytool -import -alias aliascrt -file /tmp/kstore.crt -keystore /tmp/kstore.keystore -storepass init234 -keypass init123
Certificate already exists in keystore under alias <kstore>
Do you still want to add it? [no]:  yes
Certificate was added to keystore
[root@liumiaocn tmp]#

事后确认

通过文件确认,keystore文件发生了变化

[root@liumiaocn tmp]# ll kstore.keystore kstore.crt
-rw-r--r--. 1 root root 1263 Mar 10 17:57 kstore.crt
-rw-r--r--. 1 root root 3140 Mar 10 18:11 kstore.keystore
[root@liumiaocn tmp]#

keystore详细确认后发现,证书已经加入: Alias name: aliascrt

[root@liumiaocn tmp]# keytool -list  -v -keystore /tmp/kstore.keystore -storepass init234Keystore type: JKS
Keystore provider: SUNYour keystore contains 2 entriesAlias name: kstore
Creation date: Mar 10, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Issuer: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Serial number: 58700a1
Valid from: Fri Mar 10 17:46:00 EST 2017 until: Sun Apr 09 18:46:00 EDT 2017
Certificate fingerprints:MD5:  C9:88:B5:3E:62:F1:31:4D:8B:81:9C:45:90:F1:0F:CFSHA1: 59:C9:D3:3F:07:80:73:7C:7E:43:94:3B:E5:43:61:FF:14:F1:1A:CCSHA256: 32:71:6C:1E:1F:F6:23:01:66:81:92:36:C8:6F:E3:8D:5B:32:C4:F2:10:94:D0:3D:8C:07:5B:91:7A:59:B2:56Signature algorithm name: SHA256withRSAVersion: 3Extensions:\#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 06 91 44 93 93 46 D0 EE   A9 B3 9C A6 6C 1A BD D4  ..D..F......l...
0010: E3 EA 74 74                                        ..tt
]
]*******************************************
*******************************************Alias name: aliascrt
Creation date: Mar 10, 2017
Entry type: trustedCertEntryOwner: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Issuer: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Serial number: 58700a1
Valid from: Fri Mar 10 17:46:00 EST 2017 until: Sun Apr 09 18:46:00 EDT 2017
Certificate fingerprints:MD5:  C9:88:B5:3E:62:F1:31:4D:8B:81:9C:45:90:F1:0F:CFSHA1: 59:C9:D3:3F:07:80:73:7C:7E:43:94:3B:E5:43:61:FF:14:F1:1A:CCSHA256: 32:71:6C:1E:1F:F6:23:01:66:81:92:36:C8:6F:E3:8D:5B:32:C4:F2:10:94:D0:3D:8C:07:5B:91:7A:59:B2:56Signature algorithm name: SHA256withRSAVersion: 3Extensions:\#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 06 91 44 93 93 46 D0 EE   A9 B3 9C A6 6C 1A BD D4  ..D..F......l...
0010: E3 EA 74 74                                        ..tt
]
]*******************************************
*******************************************

[root@liumiaocn tmp]#

证书删除

从keystore中删除证书,使用如下命令即可

keytool -delete -alias aliascrt -keystore /tmp/kstore.keystore -storepass init234

执行参照

[root@liumiaocn tmp]# keytool -delete -alias aliascrt -keystore /tmp/kstore.keystore -storepass init234
[root@liumiaocn tmp]#

事后确认

[root@liumiaocn tmp]# keytool -list  -v -keystore /tmp/kstore.keystore -storepass init234Keystore type: JKS
Keystore provider: SUNYour keystore contains 1 entryAlias name: kstore
Creation date: Mar 10, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Issuer: CN=michael, OU=liumiaocn, O=ngo, L=dalian, ST=liaoning, C=CN
Serial number: 58700a1
Valid from: Fri Mar 10 17:46:00 EST 2017 until: Sun Apr 09 18:46:00 EDT 2017
Certificate fingerprints:MD5:  C9:88:B5:3E:62:F1:31:4D:8B:81:9C:45:90:F1:0F:CFSHA1: 59:C9:D3:3F:07:80:73:7C:7E:43:94:3B:E5:43:61:FF:14:F1:1A:CCSHA256: 32:71:6C:1E:1F:F6:23:01:66:81:92:36:C8:6F:E3:8D:5B:32:C4:F2:10:94:D0:3D:8C:07:5B:91:7A:59:B2:56Signature algorithm name: SHA256withRSAVersion: 3Extensions:#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 06 91 44 93 93 46 D0 EE   A9 B3 9C A6 6C 1A BD D4  ..D..F......l...
0010: E3 EA 74 74                                        ..tt
]
]*******************************************
*******************************************[root@liumiaocn tmp]#

可以看到,刚刚加入的证书已经被删除。

总结

keytool作为JDK提供的证书管理工具,使用它可以很方便的管理DSA/RSA等流行加密方式的证书,而这些在Web服务器认证以及容器私库管理方面都有着很多应用。

Java Keytool工具简介相关推荐

  1. JAVA Keytool工具生成Keystore和Truststore文件

    JAVA Keytool工具生成Keystore和Truststore文件 文章目录 JAVA Keytool工具生成Keystore和Truststore文件 生成含有一个私钥的keystore文件 ...

  2. java开源工具简介(2)

    java开源工具简介(2) OpenCms [Java开源 CMS系统] OpenCms是一个J2EE的产品,它是用Java写成的.它和Tomcat捆绑在一起.但是也能够使用ATG Dynamo.We ...

  3. Java开发工具简介

    Java语言是一种解释性的语言,即读一句程序执行一句,这样就需要一 个解释器完成源程序到机器语言的翻译过程.同时Java是跨平台的语 言,跨平台是指Java程序可以在安装任何操作系统的计算机上运行,起 ...

  4. 【SSL】java keytool工具创建自己的(localhost)(JKS)证书库

    前言 java : jdk1.8 证书库:用于在本地测试的证书库,域名为:locahost. 证书库密码:密码为"localhost". 证书库位置:当前路径 证书库文件名:loc ...

  5. 【SSL】java keytool工具操作java带的(JKS)证书库

    前言 java : jdk1.8 证书库:java自带证书库. 证书库密码:java自带证书库的默认密码为"changeit". jdk安装位置:C:\Program Files\ ...

  6. 【SSL】java keytool工具操作PCKS12证书库

    前言 java : jdk1.8 linux 命令的换行符为 \. window 命令的换行符为 ^. 证书 PKCS 全称是 Public-Key Cryptography Standards ,是 ...

  7. java开源工具简介

    来源:http://baike.baidu.com/view/629119.htm 通俗点说, 就是你写了一个软件, 然后把这个软件的源代码发布到网上, 让大家都可以学习,改进. 就是开源! 专业点说 ...

  8. java 证书查看工具_程序员必备工具 Java证书工具Keytool的使用

    一.简介 Keytool是JDK自带的证书管理工具,在jdk/bin目录下,可以用来生成自签名证书.导入导出证书.打印证书信息等. 回顾下前一章的一些概念:PKI:公钥基础设施 X.509 : PKI ...

  9. Java Security:keytool工具使用说明

    Keytool用法说明 Keytool是一个key与cert的管理工具.使用keytool可以管理public key.private key,以及与key之相关的certificate. 1.com ...

  10. Java Keytool 命令行工具

    Java Keytool 是什么? Keytool 是Java提供的密钥(Key)和证书(Certificate)管理工具,用于管理公钥/私钥对以及相关证书. Keytool是Java自带的工具,安装 ...

最新文章

  1. linux将mysql的错误连接数_Mysql学习笔记(十二) 并发参数调节
  2. 和 Gmail 先生面对面
  3. (转载)微信公众平台 - 实例(未验证)
  4. spring 源码分析之BeanPostProcessor
  5. socket编程之gethostbyname获取IP列表和Host别名列表
  6. 【Python】学习笔记总结(第一阶段(1-6)——汇总篇)
  7. 量子计算机到底多强大?从量子运算看清楚它们的能力
  8. c语言中vector函数大全,vector :: empty()函数,以及C ++ STL中的示例
  9. smtplib python教程_Python使用poplib模块和smtplib模块收发电子邮件的教程
  10. python比特币挖矿_比特币如何挖矿(挖矿原理)-工作量证明
  11. pyenv管理虚拟环境
  12. HTML heading
  13. arduino 嗡鸣器 音乐_arduino笔记一:用arduino实现蜂鸣器播放音乐
  14. 阿里云不重启修改或添加密钥
  15. 程序员真的是吃青春饭的吗?有哪些建议可以给刚入职的程序员?(全是干货)...
  16. 关于程序员入职一家公司需要问咨询的一些的问题(面试总结)
  17. websocket 服务器外网访问
  18. 微信公众号菜单栏设置直接打电话拨号一键拨号
  19. OpenCV-趣味小游戏-手掌击球
  20. 彻底了解 suid, sgid ,sticky权限

热门文章

  1. Matlab资料汇总暨MATLAB中文论坛帖子整理(一)
  2. 射频识别(RFID)技术与ETC技术简介
  3. 计算机基础知识office软件,计算机基础知识和office办公系列软件的使用(完整版)...
  4. 无法启动WORKSTATION服务解决方案
  5. html 默认ie设置,如何设置ie为默认浏览器,教您如何设置ie为默认浏览器
  6. Hadoop 3.1.0 单机版伪分布式的搭建
  7. 全面剖析雅虎助手以及网络实名的流氓行径(4)
  8. ActivityManager Displayed 源码位置
  9. KindEditor 基本的使用
  10. Pandas数据库数据抽取