使用keytool 生成证书
keytool 简介
keytool 是java 用于管理密钥和证书的工具,官方文档
其功能包括:
- 创建并管理密钥
- 创建并管理证书
- 作为CA 为证书授权
- 导入导出证书
主要格式
keytool 采用 keystore 文件来存储密钥及证书,其中可包括私钥、信任证书;
keystore 文件主要使用 JKS格式(也可支持其他格式),带密钥存储;其中私钥的存储也有独立的密码;
其他格式
一、生成私钥和证书
keytool -genkeypair -alias serverkey -keystore server.keystore
按提示 输入keystore 存储密码、私钥密码、个人信息,之后会生成 server.keystore文件
若不想输入参数,可提供参数:
keytool -genkeypair -alias serverkey -keypass -storepass \
-dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" \
-keyalg RSA -keysize -validity -keystore server.keystore
参数说明
- storepass keystore 文件存储密码
- keypass 私钥加解密密码
- alias 实体别名(包括证书私钥)
- dname 证书个人信息
- keyalt 采用公钥算法,默认是DSA
- keysize 密钥长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA)
- validity 有效期
- keystore 指定keystore文件
二、查看keystore详情
查看详情命令
keytool -list -keystore -storepass server.keystore
输出结果
Keystore type: JKS
Keystore provider: SUN
Your keystore contains entry
serverkey, Sep , , PrivateKeyEntry,
Certificate fingerprint (SHA1): ::C9::A0:::A1:D7:8D:DA:CD:3D:FB:C2:E0::::
加上-v选项可查看更详细信息
Keystore type: JKS
Keystore provider: SUN
Your keystore contains entry
Alias name: serverkey
Creation date: Jul ,
Entry type: PrivateKeyEntry
Certificate chain length:
Certificate[]:
Owner: C=CN, ST=GD, L=SZ, O=vihoo, OU=dev, CN=vihoo.com
Issuer: C=CN, ST=GD, L=SZ, O=vihoo, OU=dev, CN=vihoo.com
Serial number: 5c5eb42
Valid from: Sat Jul :: CST until: Tue Jul :: CST
Certificate fingerprints:
MD5: :ED::EF:4C:E3:7F:ED:6A::::6D:::
SHA1: :::6E::EE:0F:E6:::::9C:9D:A4::EF:CC::0C
SHA256: 3B:AC::8E::C2:C8::::C7:4A:D3:AF:1F:::::7C::6E:C8:E7:::E4:7A::0A:CD:8F
Signature algorithm name: SHA256withRSA
Version:
Extensions:
#: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
: B4 A9 5D 6C 4C B4 ED 2B D1 F4 ...&]lLF.i.+ ..
: 3C 8F X<..
]
]
三、证书导入导出
导出证书
keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass
参数说明
- exportcert 表示导出证书
- alias 指示别名
- file 指示导出文件
- storepass 指示keystore密钥
此时导出的证书为DER编码格式,使用openssl 可以输出
openssl x509 -in server.cer -inform der -noout -text
加上 -rfc选项,可输出PEM编码格式的证书
keytool -exportcert -keystore server.keystore -rfc -file server.cer -alias serverkey -storepass
输出格式如:
-----BEGIN CERTIFICATE-----
MIIDUTCCAjmgAwIBAgIEBcXrQjANBgkqhkiG9w0BAQsFADBZMRIwEAYDVQQDEwl2
...
-----END CERTIFICATE-----
导入证书
一般为导入信任证书(SSL客户端使用)
keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server -storepass -noprompt
参数说明
- importcert 表示导入信任证书
- file 指示导入证书,支持pem/der格式
- keystore 指示目标keystore文件
- storepass 指示新的keystore密钥
- alias 指示trust证书在keystore中的别名
- noprompt 指示不弹出提示
导入后的证书为 trustedCertEntry 实体类型,而私钥证书为 PrivateKeyEntry
四、查看证书
打印证书
keytool -printcert -file server.cer
输出
Owner: CN=ZZ, OU=DEV, O=pp.com, L=GZ, ST=GD, C=CN
Issuer: CN=ZZ, OU=DEV, O=pp.com, L=GZ, ST=GD, C=CN
Serial number: 797f3140
Valid from: Sun Sep :: CST until: Sat Dec :: CST
Certificate fingerprints:
MD5: FB:7D::4C:A9:F3::0E:CC::0D:9B:D4:D6:4D:
SHA1: ::C9::A0:::A1:D7:8D:DA:CD:3D:FB:C2:E0::::
SHA256: E9:8B:A5::5F::FA:C5::3B:0A::1D:BE:D1::3C:A1:E2::::A7:5C:EC::::1B:AA:B6:EB
Signature algorithm name: SHA1withDSA
Version:
Extensions:
#: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
: 0E C3 D3 3A 3C B7 D9 C4 BD 8E E7 6C EC ..b.u:<.....c.l.
: AF 8A ..)r
]
]
五、转换格式
jks格式 转 pkcs12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \
-srcstoretype jks -deststoretype pkcs12 -srcstorepass -deststorepass -noprompt
参数说明
- importkeystore 指示导入导出keystore文件,可用于同类型或不同类型的导入导出
- srckeystore 指示源keystore文件
- srcalias 指示源实体别名
- srcstoretype 指示源store类型(jks/pkcs12..)
- srcstorepass 指示源store密码
- noprompt 不弹出提示
pkcs12 转jks格式与此同理
六、场景示例
1. 制作Java SSL 双向证书
storepass=
keypass=
server_dname="C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com"
client_dname="C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihooc.com"
echo "generate server keystore"
keytool -genkeypair -alias serverkey -keypass $keypass -storepass $storepass \
-dname $server_dname \
-keyalg RSA -keysize -validity -keystore server.keystore
echo "generate client keystore"
keytool -genkeypair -alias clientkey -keypass $keypass -storepass $storepass \
-dname $client_dname \
-keyalg RSA -keysize -validity -keystore client.keystore
echo "export server certificate"
keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass $storepass
echo "export client certificate"
keytool -exportcert -keystore client.keystore -file client.cer -alias clientkey -storepass $storepass
echo "add server cert to client trust keystore"
keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server \
-storepass $storepass -noprompt
echo "add client cert to server trust keystore"
keytool -importcert -keystore server_trust.keystore -file client.cer -alias server_trust_client \
-storepass $storepass -noprompt
2. Java 证书与 nginx 证书互转
Java通常使用JKS作为证书存储格式,而Nginx往往采用PEM证书格式,如何实现互转?
Nginx 证书 转 JKS
A pem证书和私钥合成p12
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass: -password pass: \
-name server -out server.p12注意定义-name 选项,这将作为keystore识别实体的参数
B p12 证书转jks 证书
keytool -importkeystore -srckeystore server.p12 -destkeystore server.keystore \
-srcstoretype pkcs12 -deststoretype jks -srcalias server -destalias server \
-deststorepass -srcstorepass如果p12 文件中未指定实体名称,使用keytool转换时则不需提供srcalias/destalias参数,而输出的keystore实体名称默认为1
JKS 证书 转 Nginx证书
A jks 证书转p12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 \
-srcstoretype jks -deststoretype pkcs12 -srcalias server -destalias server \
-deststorepass -srcstorepassB p12 证书提取pem证书和私钥
openssl pkcs12 -in server.p12 -clcerts -nokeys -password pass: -out server.crt
openssl pkcs12 -in server.p12 -nocerts -password pass: -passout pass: -out server.key其中得到的私钥文件为PKCS#8 加密格式,证书和密钥均为PEM文件编码。
3. 其他
已有的Nginx证书,如何快速在Java中添加信任
通过keytool -importcert 命令可直接导入信任证书
keytool 通用格式为 jks,如何获取私钥
通过程序读取,参考stackoverflow
JavaSE样例
最新文章
- hbase批量数据导入报错:NotServingRegionException
- 浅谈C/C++中的顺序点和副作用
- oracle插入主键数据、sequence和触发器
- 18个有用的 .htaccess 文件使用技巧
- POJ 1258 Agri-Net(最小生成树,基础)
- OllyDbg 使用笔记 (二)
- centos 6.X 安装node
- 体验Lua
- (原)STL中vector的疑问
- [HDU 3336]Count the String[kmp][DP]
- MySQL的简单使用-(一)
- Erlang 编写 Kafka 客户端之最简单入门
- leetcode-数组中只出现一次的数字
- .net core2.x 自动注入 Entity(实体对象到上下文)
- [java,2017-05-17] 数据型参数趣谈
- H5新特性-视频,音频-Flash-canvas绘图
- Ubuntu14.04 编译 Android 5.1.1源码(采用国内镜像)
- Git rebase使用
- android 常用adb 及linux 命令
- js动态生成水印