jdk创建自己的证书

1.进入JKD bin目录

2.执行java 命令

keytool -genkeypair -alias Loen -keysize 2048 -keyalg RSA -validity 36500 -keystore Loen.jks -storetype JKS

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

> 输入密钥库密码和本条目密码都为123456,以及其他主体信息会生成密钥对保存在Loen.jks中。公钥以证书格式保存,带有主体信息。此时证书库中可以看到公钥信息(私钥无法打印)
  >
  > 第一条主体信息:您的姓名与姓氏中填入服务器域名的完整信息而非name,如:www.golove.com。

公钥口令:csl528528

私钥口令:loen53

D:\Java1.8\jdk1.8.0_20_64\bin>keytool -genkeypair -alias Loen -keysize 2048 -keyalg RSA -validity 36500 -keystore Loen.jks -storetype JKS
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  peng
您的组织单位名称是什么?
  [Unknown]:  mpeng
您的组织名称是什么?
  [Unknown]:  mpeng
您所在的城市或区域名称是什么?
  [Unknown]:  changsha
您所在的省/市/自治区名称是什么?
  [Unknown]:  hunan
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=peng, OU=mpeng, O=mpeng, L=changsha, ST=hunan, C=cn是否正确?
  [否]:  y

输入 <Loen> 的密钥口令
        (如果和密钥库口令相同, 按回车):
再次输入新口令:
 

D:\Java1.8\jdk1.8.0_20_64\bin\Loen.jks

- 导出自签名证书

D:\Java1.8\jdk1.8.0_20_64\bin>keytool -export -alias Loen -keystore Loen.jks -file Loen.crt

输入密钥库口令:csl528528
存储在文件 <Loen.crt> 中的证书

D:\Java1.8\jdk1.8.0_20_64\bin\Loen.crt

 

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

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

 

- 查看keystore中证书条目列表

keytool -list -v -keystore teststore.jks

- 生成证书签名请求(CSR文件)

keytool -certreq -alias Loen -keystore Loen.jks -file Loen.csr

D:\Java1.8\jdk1.8.0_20_64\bin\Loen.csr

  > 用keystore中golove条目生成了证书签名请求文件Loen.csr,内包含Loen条目的公钥和主体信息,将证书签名请求文件发给正规CA,CA用私钥对公钥和信息签名后制作成证书文件返回就可以使用了。正规CA的公钥浏览器内置,所以此时浏览器可以验签名成功。
  >
  > 但我们要自己模拟CA签发二级证书,CA也是要有公私钥对,所以先生成CA密钥对。

- 生成一个自签名证书作为CA根证书,名字与姓氏选项这里填入root

- 使用CA证书给Loen证书签名,即用CA的私钥签名后与Loen的公钥生成一个证书
D:\Java1.8\jdk1.8.0_20_64\bin>keytool -gencert -alias rootca -keystore Loen.jks -infile Loen.csr -outfile Loen_new.crt

此时已经生成了一个Loen_new.crt的二级证书

D:\Java1.8\jdk1.8.0_20_64\bin\Loen_new.crt

- 将二级证书导回Loen库中,并且直接替换原有别名为Loen的条目

keytool -import -v -alias Loen -file Loen_new.crt -keystore Loen.jks

 

D:\Java1.8\jdk1.8.0_20_64\bin>keytool -import -v -alias Loen -file Loen_new.crt -keystore Loen.jks
输入密钥库口令:
输入 <Loen> 的密钥口令
证书回复已安装在密钥库中
[正在存储Loen.jks]

D:\Java1.8\jdk1.8.0_20_64\bin>keytool -list -v -keystore Loen.jks

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

> 此时可以将root证书导出给客户端内置,服务端绑定二级证书,这样客户端验证时可以用根证书验证二级证书。其实大部分程序直接使用一级的自签名证书即可,但若需要双向验证,服务端验证客户端时不同客户端最好使用服务端的rootca私钥来签发,这样服务端可以直接用一个rootca的证书验证。实现了动态扩展且客户端的证书不同。  ​

- 为了区分teststore,可以新建一个只放信任证书,不存储密钥的仓库。将刚才的rootca证书和Lone二级证书导入一个新仓库(如果为了方便,也可以直接用一个密钥库,不需要此库

// 从Lone导出rootca证书

D:\Java1.8\jdk1.8.0_20_64\bin>keytool -export -alias rootca -keystore Loen.jks -file rootca.crt
输入密钥库口令:
存储在文件 <rootca.crt> 中的证书

// 导入rootca证书到新库

D:\Java1.8\jdk1.8.0_20_64\bin>keytool -import -v -file rootca.crt -alias rootca -keystore truststore.jks
输入密钥库口令:
再次输入新口令:

// 导入Loen_new证书到新库
keytool -import -v -file Loen_new.crt -alias Loen -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类的相关方法获取到公私钥信息,然后做加解密的验证等。

 

## openssl生成证书

由于是给nginx配置https用的,我先在nginx目录下创建一个文件夹。

$sudo mkdir -p /etc/nginx/conf
$cd /etc/nginx/config.d/ss

- 创建秘钥

openssl genrsa -des3 -out server1.key

输入123456密码创建一个rsa私钥。(此处des3与公私钥对无关。)可以打印查看以下对应的公钥。 openssl rsa -in server1.key -pubout 

- 创建请求文件

sudo openssl req -new -key server1.key -out server1.cs
输入密码123456后回车 依次填写主体信息,大部分可以直接回车略过
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:flk
Organizational Unit Name (eg, section) []:flk-test
Common Name (e.g. server FQDN or YOUR name) []:   // 这里可以填写服务器对应域名,否则浏览器警告
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

- 删除私钥中的密码

由于生成私钥时指定了des3密码,每次使用私钥都要输入密码,比较麻烦,这里删除掉。

openssl rsa -in server1.key -out server1.key

- 生成证书

openssl x509 -req -days 3650 -in server1.csr -signkey server1.key -out server1.crt

 

可以看到是用自己的私钥签发的主体信息。生成证书后可以删除crt了。

此时有私钥server1.key和自签名证书server1.crt。如果nginx代理https请求,只要指定此目录对应文件即可。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值