jks生成密钥证书及其与x509 pem的转换

jks创建:

 

#!/bin/bash
#Step 1
keytool -keystore server.keystore.jks -alias localhost -validity 365 -keyalg RSA -genkey -storepass passwd1 -dname "C=US,ST=province,L=city,O=someorg,OU=somedept,CN=server.com"
#Step 2
openssl genrsa -out ca-key 2048
openssl req -new -x509 -days 365 -key ca-key -out ca-cert -subj '/C=CA/ST=province/L=city/O=someorg/OU=somedept/CN=ca.com'
 
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert -storepass passwd1
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert -storepass passwd1
#Step 3
keytool -keystore server.keystore.jks -alias localhost -certreq -file cert-file -storepass passwd1
openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial
keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert -storepass passwd1
keytool -keystore server.keystore.jks -alias localhost -import -file cert-signed -storepass passwd1
 
 
keytool  -storepass passwd1 -list -v -keystore server.keystore.jks
 
 
openssl ecparam -genkey -name secp256r1 -out server.key
openssl req -new -key server.key -out server.csr -subj "/C=US/ST=province/L=city/O=someorg/OU=somedept/CN=server.com"
echo subjectAltName = IP:127.0.0.1,IP:127.0.0.3 > extfile.cnf

openssl x509 -req -CA ca-cert -CAkey ca-key -CAcreateserial -days 3650 -in server.csr -out server.crt -extfile extfile.cnf

openssl ecparam -genkey -name secp384r1 -out client.key
openssl req -new -key client.key -out client.csr -subj "/C=US/ST=province/L=city/O=someorg/OU=somedept/CN=client.com"
openssl x509 -req -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in client.csr -out client.crt
 
 
jks证书转换
 
keytool -export -alias localhost -file server.crt -keystore server.keystore.jks -storepass passwd1
 
 
jks私钥转换
 
keytool -v -importkeystore -srckeystore server.keystore.jks -srcstoretype jks -srcstorepass passwd1 -destkeystore server.pfx -deststoretype pkcs12 -deststorepass passwd2
 
openssl pkcs12 -in server.pfx -nocerts -nodes -out priv.key -password pass:passwd2
 
 
 
 

1 引言

密钥管理是任何IT基础设施中必不可少的⼀部分,主要包括了密钥的⽣成、交换、存储、备份、使⽤、销毁以及更新等功能。

在区块链系统中,密钥主要指控制区块链账户的公私钥对,在部分⽀持证书体系的系统中,还包括了证书 以及会话密钥。这⾥我们主要关注非对称密钥的公私钥对,重点是私钥。

 

2 区块链中的密钥管理

本节主要描述区块链应用环境下, 密钥在生成、分配、使用、存储、备份、恢复和销毁等全生命周期环节的管理策略和方法。

2.1 密钥⽣成

  • 随机数
  • 助记词:原理同上,只是随机数以⼀串单词的形式存在,便于记忆。
  • BIP32:随机⽣成种⼦/根私钥,通过单向函数衍⽣出新的私钥,可以通过该种⼦/根私钥恢复全部衍⽣私钥。

2.2 密钥存储

私钥的存储借鉴了云服务密钥管理的最佳实践,即⽤户通过密码控制KDF(密钥衍⽣函数)⽣成 对称密钥,然后加密私钥,加密后的私钥以keystore格式持久化;

 

2.3 备份/恢复

  • 直接备份私钥
  • 备份助记词
  • 备份种⼦/根密钥
  • 备份keystore

2.4 私钥使⽤

原则上要求私钥不触⽹,对于比特币等公链来说,最佳实践为冷钱包和硬件钱包。

 

 

 

3 密钥管理方案

依据使用设备的不同,平台的实践方案主要分为基于硬件的密钥管理、基于软件的密钥管理以及软硬混用的密钥管理机制。

平台目前对于主流的安全硬件均有支持,如HSM、符合GM0018标准的密码卡、可信计算TEE(如Intel® SGX)、TCG TPM2.0等。

平台通过使⽤中⼼化的服务,支持对于符合国际密码标准的密钥和国家商用密码标准的密钥证书的⽣成、分发和使⽤。

 

3.1 密钥⽣成

使⽤符合标准规范的随机数⽣成器(例如NIST SP800-90A/B/C)、硬件⽣成私钥(cpu rdrand指令或专用硬件)或上述助记词/种⼦/根私钥。

3.2 密钥存储

参考NIST SP800-57P,需要明确私钥的类型、⽤途、安全策略、⽣命周期等,然后结构化存储于数据 库/密钥数据库/加密硬件中,通常还需要设置审计规则(例如事件触发)。

3.3 备份/恢复

私钥经过符合标准规范的安全处理⽅法(例如NIST FIPS140)处理后,通常备份在专⽤硬件/妥善保管 的可移除介质,备份数量和访问政策视私钥的安全要求⽽定。

3.4 密钥使⽤

对于安全硬件存储的密钥的使用需要提供硬件和权限,对于软件加密的私钥则需要先解密。

 

 

4 其他

基于秘密分享的密钥管理

Shamir's Secret Sharing算法被⼴泛应⽤在存储备份,基于SSS的Threshold SSS将某个Secret分成n⽚,并允许⽅中的x⽅( t <= x <= n)重建该Secret。

基于TSSS可以进⾏私钥的安全备份和恢复,私钥被分⽚之后可以灵活存储在n⽅(例如云盘、备份服务、可移除介质),私钥丢失后,只需其中t⽚即可重建私钥;这种⽅式降低了私钥备份的单点⻛险; TSSS还可以⽤于密钥的安全存储,同上,私钥被分⽚之后,存储在n⽅(客户端、云服务器);需要签名 时,收集t个分⽚重建私钥完成签名,整个过程中私钥不在任何⼀⽅持久化,⼤⼤减少了私钥被盗取的⻛险(实际上⼤多数私钥被盗发⽣在静态期)。

 

5 展望

未来的工作内容主要包括基于IBC的密钥管理分配方案、 属性加密、层级密钥管理等。

 

 

 

 

posted @   zJanly  阅读(519)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2022-02-16 H1
点击右上角即可分享
微信分享提示