java 证书工具keytool生成自签名证书和自签CA证书

jdk自带的证书管理工具叫keytool,在jdk/bin目录下,可以用来生成自签名证书、导入导出证书、打印证书信息等。

1. 名词

自签名证书:用自己的私钥签发自己的公钥即主体信息生成的证书。
证书签名:对证书固定值进行hash后用密钥对中的私钥对hash值加密
keystore:  keytool生成证书的存储库,用来存储若干条目,每一条目包含公私钥,主体信息等。默认为用户目录下.keystore,相当于一个有密码保护的文件。
truststore: 与keystore格式相同,但是为区分只用来存放信任的证书,不存密钥等信息。

der:证书编码格式,证书结构体转换为二进制格式。
pem:证书编码格式,对der二进制编码的base64字符,包含---begin---,----end----。// 命令中加-rfc可打印和生成此类文件
.csr:证书请求文件格式,包含公钥和主体信息,发给ca,ca用私钥对内容签名并制作成证书返回。keytool在生成csr文件时需要指定证书(即公钥与主体信息)。
.crt:一般用于linux系统的证书格式,包含公钥和主体信息。
.cer:一般用于windows的证书文件格式,包含公钥和主体信息。
.p12:证书交换格式,包含公钥私钥(私用密码加密),用于交换传输。

2.具体使用

可以以一个完整例子来了解keytool命令。在socket或http协议传输数据时,如需加密传输会话内容,会在TCP上加上ssl/tls,http则改为https协议。此时服务端需要给客户端提供证书以供客户端验证并协商会话密钥,如果没有正规CA签发的证书,则需自签名。

客户端用签发证书的根证书验证,如果是自签名一级证书,则客户端需内置此自签名证书,如果是自签名二级证书,则用签发它的跟证书验证

  • 生成自签名证书
keytool -genkeypair -alias golove -keysize 2048 -keyalg RSA -validity 3650 -keystore teststore.jks -storetype JKS
  • genkeypair:生成公私钥对条目,私钥不可见,公钥会以证书格式保存在keystore中。
  • alias: 指定别名,区分不同条目,默认mykey
  • keysize: 密钥长度
  • keyalg: 公私钥算法
  • validity: 证书过期时间
  • keystore: 指定存储密钥库,若不存在会创建,若指定则在当前文件夹下生成。默认密钥库为用户目录下.keystore文件
  • storetype: 密钥库类型 JKS PKCS等

输入密钥库密码和本条目密码都为123456,以及其他主体信息会生成密钥对保存在teststore.jks中。公钥以证书格式保存,带有主体信息。此时证书库中可以看到公钥信息(私钥无法打印)

第一条主体信息:您的姓名与姓氏中填入服务器域名的完整信息而非name,如:www.golove.com

  • 导出自签名证书
// 如果要生成pem编码格式的证书直接加上 -rfc参数即可,证书详细信息格式用 -v
keytool -export -alias golove -keystore teststore.jks -file golove.crt

现在可以将此证书分发给客户端了,客户端做相应配置,验证域名或直接跳过验证(因为是用它自身公钥验证,不能保证安全性,一般默认信任),使用此证书与服务端交换随机数。


接下来稍微了解下keystore内容并生成一个跟证书来签发二级证书。

  • 查看keystore中证书条目列表
keytool -list -v -keystore teststore.jks
1.png

再看下刚才根据此条目导出的自签证书,导出后已经包含了公钥等其他信息形成了完整证书,但注意verifiedby字段还是自己


3.png
  • 生成证书签名请求(CSR文件)
keytool -certreq -alias golove -keystore teststore.jks -file temp_go_love.csr

用keystore中golove条目生成了证书签名请求文件temp_go_love.csr,内包含golove条目的公钥和主体信息,将证书签名请求文件发给正规CA,CA用私钥对公钥和信息签名后制作成证书文件返回就可以使用了。正规CA的公钥浏览器内置,所以此时浏览器可以验签名成功。

但我们要自己模拟CA签发二级证书,CA也是要有公私钥对,所以先生成CA密钥对。

  • 生成一个自签名证书作为CA根证书,名字与姓氏选项这里填入root
keytool -genkeypair -alias rootca -keysize 2048 -keyalg RSA -validity 3650 -keystore teststore.jks -storetype JKS

-使用CA证书给golove证书签名,即用CA的私钥签名后与golove的公钥生成一个证书

keytool -gencert -alias rootca -keystore teststore.jks -infile temp_go_love.csr -outfile golove_new.crt

此时已经生成了一个golove_new.crt的二级证书,以文件形式打开golove.crt和golove_new.crt两个证书文件对比下内容。
golove.crt:


3.png

golove_new.crt:


4.png

可以看到签发者已经变成root,公钥等其他信息不变,但签名值变了,说明已经用新的私钥(root私钥)替换原有(golove)签名,在证书信任连上序号为2,此即二级证书。

  • 将二级证书导回teststore库中,并且直接替换原有别名为golove的条目
keytool -import -v -alias golove -file golove_new.crt -keystore teststore.jks

再次打印证书库中条目列表可以看到别名为golovet的条目证书链变为2,发布者变为root.


5.png

此时可以将root证书导出给客户端内置,服务端绑定二级证书,这样客户端验证时可以用根证书验证二级证书。其实大部分程序直接使用一级的自签名证书即可,但若需要双向验证,服务端验证客户端时不同客户端最好使用服务端的rootca私钥来签发,这样服务端可以直接用一个rootca的证书验证。实现了动态扩展且客户端的证书不同。
-为了区分teststore,可以新建一个只放信任证书,不存储密钥的仓库。将刚才的rootca证书和golove二级证书导入一个新仓库(如果为了方便,也可以直接用一个密钥库,不需要此库)

// 从teststore导出rootca证书
keytool -export -alias rootca -keystore teststore.jks -file rootca.crt
// 导入rootca证书到新库
keytool -import -v -file rootca.crt -alias rootca -keystore truststore.jks
// 导入golove证书到新库
keytool -import -v -file golove_new.crt -alias golove -keystore truststore.jks

keytool 常用命令:

// 以rfc模式打印,即base64可见字符,与pem编码格式一样。 -v为详细输出
keytool -printcert -rfc -file rootca.ctr  
// 查看证书库中证书条目列表 详细信息
keytool -list -v -keystore teststore.jks
// 将证书库中的条目导出为证书文件,如要生成可见字符编码格式的证书文件 加上 -rfc 参数即可。
keytool -export -alias rootca -keystore teststore.jks -file rootca.ctr
// 删除密钥库中的条目 
keytool -delete -alias rootca -keystore teststore.keystore
// 修改证书库密码,输入旧密码或加参数 -storepass 111111
keytool -storepasswd -new 123456 -keystore truststore 
// 修改某条目密码
keytool -keypasswd -alias myCA -keypass 654321 -new newpass -storepass 123456 -keystore myCALib

还有一个问题,keytool不能打印出密钥对中的私钥,用-list查看密钥库列表也没有完整的私钥信息。要获取私钥,可以在java程序中加载密钥库,用jdk KeyStore类的相关方法获取到公私钥信息,然后做加解密的验证等。

有不对的地方请指出...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 本文转载,出处如下:数字证书原理 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了...
    随安居士阅读 1,672评论 1 8
  • 数字证书就是网络通讯中标志通讯各方身份信息的一系列数据,其作用类似于现实生活中的身份证。它是由一个权威机构发行的,...
    拉肚阅读 21,105评论 1 17
  • 87年未婚,太原人,身高175,活泼开朗,热爱运动,车房全,从事金融行业,素食主义者,觅善良,贤惠,通情达理,有爱...
    太原家老冯阅读 963评论 0 0
  • 第一章 哈勃望远镜事故 主要内容: 1、哈勃望远镜,引以为傲的0.007秒角稳定度系统(17亿美元) 2、事故的社...
    Jennie夏阅读 242评论 2 0
  • 01 大喊“国民党”的爷爷 上周五骑车路过一处红灯,看到交警在查逆行以及电动车带人。有些人没来得及“跑掉”,被交警...
    不悔将来阅读 373评论 2 5