java加密解密
一:
1.KeyManagerFactory类(密钥管理工厂,用来管理密钥):
构建密钥库管理工厂与下例一样:
System.setProperty("javax.net.ssl.keyStore","D:\\server.keystore");
System.setProperty("javax.net.ssl.keyStorePassword","123456");
2.TrustManagerFactory类(用于管理信任材料的管理器工厂)
构建信任库管理工厂与下例一样:
System.setProperty("javax.net.ssl.trustStore","D:\\server.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","123456");
3.SSLContext类(用于表示安全套接字上下文,为安全套接字协议的实现,充当安全套接字工厂或SSLEngine的工厂):用一组密钥和信任管理器及安全随机字节初始化此类
4.HttpsURLConnection类(构建https连接)
5.SSLSession接口(用于保持SSL协议网络交互会话状态,可获得加密套件CipherSuite、数字证书)。
6.SSLSocketFactory类(用于创建SSLSocket,并获得相应加密套件)
7.SSLSocket类(基于SSL协议的Socket,用于设置加密套件、处理握手结束事件,并管理SSLSession)
8.SSLServerSocketFactory类(和SSLSocketFactory类一样,只是构建的Socket是SSLServerSocket类)
9.SSLServerSocket类(专用于服务端的SSLSocket,是ServerSocket的子类)
二:数字证书概念描述:
1.数字证书为加密算法和公钥的载体。
1.1 证书的签发过程:为对申请数字证书的公钥做数字签名
1.2 证书的验证过程:为对数字证书的公钥做验证签名,包括证书有效期验证。
2.数字证书采用了公钥基础设施(PKI),包含了:非对称加密算法、数字签名算法、消息摘要算法:
2.1 非对称加密算法:用于对数据进行加密/解密操作,确保数据机密性
2.2 数字签名算法:用于对数据进行签名/验证操作,确保数据的完整性和抗否认性
2.3 消息摘要算法:用于对数字证书本身做摘要处理,确保数字证书完整性(有的叫:指纹算法)
3.数字证书文件编码格式:CER(可变长)、DER(定长)
4.目前主要有JKS和PEM两种编码格式文件:
4.1 JKS:java原生的密钥库/信任库文件
4.2 PEM(隐私增强邮件):使用多种加密方法提供机密性、认证和信息完整性的因特网电子邮件,在OpenSSL中最为常见的密钥库文件。
5.通常使用Base64编码格式作为数字证书文件存储格式
6.KeyTool进行数字证书管理:用于数字证书的申请、导入、导出和撤销等操作。与本地密钥库相关联,将私钥存于密钥库,公钥则以数字证书输出。KeyTool位于%JDK_HOME%\bin目录下
三:使用KeyTool进行证书管理:
1.构建自签名证书(自己为自己签发一个数字证书,未进行CA认证)
1.1 生成密钥对,放于生成的数字证书中(基于某种非对称加密算法的公私钥):“www.zlex.org”为别名,RSA为加密算法,密钥长度为2048位,SHA1withRSA为数字签名算法,签发有效期为36000天
例:keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias www.zlex.org -keystore zlex.keystore
-dname "CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN"
命令说明:
-genkeypair 生成密钥对
-keyalg 指定密钥算法,这里为RSA算法
-keysize 指定密钥长度,默认为1024位,这里指定为2048位
-sigalg 指定数字签名算法,这里为SHA1withRSA
-validity 指定证书有效期,这里为36000天
-alias 指定别名,这里为www.zlex.org
-keystore 指定密钥库存储位置,这里是zlex.keystore(新生成的密钥对就在里面)
-dname 指定用户信息 (创建数字证书时避免手输)
-storepass 指定密码(创建数字证书时避免手输)
1.2 导出数字证书
例: keytool -exportcert -alias www.zlex.org -keystore zlex.keystore -file zlex.cer -rfc -storepass 123456
-exportcert 证书导出操作
-alias 指定导别名,这里为 www.zlex.org
-keystore 指定密钥库文件,这里为 zlex.keystore
-file 指定导出文件路径,这里为 zlex.cer (此为数字证书)
-rfc 指定以Base64编码格式输出
-storepass 指定导出时的密码,这里为 123456
1.3 将数字证书中的内容打印出来 (将zlex.cer中的内容打印出来)
例:keytool -printcert -file zlex.cer
2.构建CA签发证书
1.若要获取CA机构认证的证书,需生成数字证书签发申请(CSR),经CA机构认证并颁发,同时将认证后的证书导入本地密钥库和信任库
例:keytool -certreq -alias www.zlex.org -keystore zlex.keystore -file zlex.csr -v -storepass 123456
-certreq 生成数字证书签发申请操作
-alias 指定别名,这里为 www.zlex.org
-keystore 指定密钥库文件,这里为 zlex.keystore
-file 指定导出文件路径 ,这里为 zlex.csr
-v 详细信息
-storepass 指定导出时的密码,这里为 123456
2.导入数字证书
例:keytool -importcert -trustcacerts -alias www.zlex.org -file zlex.cer -keystore zlex.keystore -storepass 123456
-importcert 导入数字证书
-trustcacerts 将数字证书导入信任库
-alias 指定导别名,这里为 www.zlex.org
-file 指定导入数字证书文件路径,这里为 zlex.cer
-keystore 指定密钥库文件,这里为 zlex.keystore
-storepass 指定导入时设置的密码,这里为 123456
3.列出密钥库中的条目
例:keytool -list -alias www.zlex.org -keystore zlex.keystore -storepass 123456
-list 列出密钥库中的条目
-alias 指定别名,这里为 www.zlex.org
-keystore 指定密钥库文件,这里为 zlex.keystore
-storepass 指定输出时要输入的密码,这里为 123456
四:OpenSSL证书管理
1.功能远胜KeyTool,可用于根证书、服务器证书、客户端证书管理。
2.下载OpenSSL后得先配置环境变量
2.1 变量名: OpenSSL_Home C:\OpenSSL(安装目录)
2.2 将变量加入到系统变量Path: %OpenSSL_Home%\bin;
3.构建根证书
3.1 构建根证书前,得先构建随机数文件(.rand)
例子:openssl rand -out private/.rand 1000
rand 随机数命令
-out 输出文件路径,这里将随机数文件输出到private目录下
1000 产生伪随机字节数
4.构建根证书私钥(通常使用PEM编码格式保存私钥)(此处私钥在5中会用到)
例子:openssl genrsa -aes256 -out private/ca.key.pem 2048 (执行这条命令后还得设置根证书密码:123456)
genrsa 产生RSA密钥命令
-aes256 使用AES算法(256位密钥)对产生的私钥加密。可选算法包括DES、DESede、IDEA和AES
out 输出路径,这里指private/ca.key.pem(生成的根证书私钥)
2048 指RSA密钥长度位数,默认长度为512位
5.完成密钥构建后,还得生成根证书签发申请文件(ca.csr) (此处执行下列命令后,需输入根证书密码:123456)
例子:openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=*.zlex.org"
req 产生证书签发申请命令
-new 表示新请求
-key 密钥,这里为private/ca.key.pem文件(根证书私钥)
-out 输出路径,这里为private/ca.csr文件(根证书申请文件)
-subj 指定用户信息,这里使用泛域名"*.zlex.org"作为用户名
6.获得根证书签发申请文件后,进行根证书签发(一般要将ca.csr发给CA机构签发,此处进行自行签发。执行下列命令后还需输入根证书密钥:123456)
例子:openssl x509 -req -days 10000 -shal -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
x509 签发X.509格式证书命令
-req 证书输入请求
-days 证书有效天数,这里为10000天
-shal 证书摘要算法,这里为SHA1算法
-extensions 按OpenSSL配置文件v3_ca项添加扩展
-signkey 自签名密钥,这里为private/ca.key.pem(根证书私钥)
-in 输入文件,这里为private/ca.csr(根证书申请文件)
-out 输出文件,这里为certs/ca.cer(生成的根证书)
7.根证书转换:签发获得数字证书后(根证书),在java环境中是不能直接用的,需转化为PKCS#12编码格式。(执行下列命令后,还需输入根证书密钥:123456)
例子:openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
pkcs12 PKCS#12编码格式证书命令
-export 导出证书
-cacerts 仅导出CA证书
-inkey 输入密钥,这里为private/ca.key.pem(根证书密钥)
-in 输入文件,这里为certs/ca.cer (原始的根证书)
-out 输出文件,这里为certs/ca.p12 (转码后的根证书)
8.使用KeyTool查看个人信息交换文件(PKCS#12),该类型文件可作为密钥库或信任库使用。(下列作为密钥库文件,查看密钥库信息)
例子:keytool -list -keystore certs/ca.p12 -storetype pkcs12 -v -storepass 123456
注意:构建根证书(ca.cer)成功后,可根据根证书签发服务器证书和客户证书
9.构建服务器证书的密钥(执行下列命令后,需输入服务器证书密码:123456)
例子:openssl genrsa -aes256 -out private/server.key.pem 2048
genrsa 产生RSA密钥命令
-aes256 使用AES算法(256位密钥)对产生的私钥加密。可选算法包括DES、DESede、IDEA和AES
out 输出路径,这里指private/server.key.pem(生成的服务器证书私钥)
2048 指RSA密钥长度位数,默认长度为512位
10.服务器证书密钥构建成功后,需生成服务器证书签发申请文件(执行下列命令后,还需输入服务器证书密码:123456)
例子:openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/CN=www.zlex.org"
req 生成证书签发申请文件命令
-new 新请求
-key 密钥,这里为private/server.key.pem(为9中生成的服务器证书密钥)
-out 输出路径,这里为private/server.csr(生成的证书签发申请文件)
-subj 指定用户信息,这里使用域名"www.zlex.org"作为用户名
11.根据根证书进行服务器证书进行签发,生成服务器证书(执行下列命令后,需设置服务器证书密码:123456)
例子:openssl x509 -req -days 3650 -shal -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer
x509 签发X.509格式证书命令
-req 证书输入请求
-days 有效天数,这里为3650天
-sha1 证书摘要算法,这里为SHA1算法
-extensions 按OpenSSL配置文件v3_req项添加扩展
-CA CA证书,这里为certs/ca.cer(根证书)
-CAkey CA证书密钥,这里为private/ca.key.pem
-CAserial CA证书序列号文件,这里为ca.srl
-CAcreateserial 创建CA证书序列号
-in 输入文件,这里为private/server.csr(服务器证书签发申请文件)
-out 输出文件,这里为certs/server.cer(服务器证书)
12.生成的服务器证书不能直接使用,需将证书转化为PKCS#12格式(执行下列命令后,需输入服务器证书密码:123456)
例子:openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
pkcs12 PKCS#12编码格式证书命令
-export 导出证书
-clcerts 仅导出客户证书
-inkey 输入密钥文件路径,这里为private/server.key.pem(为9中生成的服务器证书密钥)
-in 输入文件路径,这里为certs/server.cer(原证书文件)
-out 输出文件路径,这里为certs/server.p12(转码后的证书文件)
注意:此处已经表示构建服务器证书成功,可使用该证书构建基于单向认证的网络交互平台了
13.构建客户证书,先构建客户私钥(与构建服务证书差不多,执行下列命令后,需设置客户证书密码:123456)
例子:openssl genrsa -aes256 -out private/client.key.pem 2048
genrsa 产生RSA密钥命令
-aes256 使用AES算法(256位密钥)对产生的私钥加密。可选算法包括DES、DESede、IDEA和AES
out 输出路径,这里指private/client.key.pem(生成的客户证书私钥)
2048 指RSA密钥长度位数,默认长度为512位
14.客户证书密钥申请成功后,需生成客户证书签发申请文件(执行下列命令后,需输入客户证书密码:123456)
例子:openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/CN=zlex"
req 生成证书签发申请文件命令
-new 新请求
-key 密钥,这里为private/client.key.pem(为9中生成的服务器证书密钥)
-out 输出路径,这里为private/client.csr(生成的证书签发申请文件)
-subj 指定用户信息,这里使用域名"zlex"作为用户名
15.根据根证书和客户证书签发申请文件,生成客户证书(执行下列命令后,需输入客户证书密码:123456,并同意签发证书)
例子:openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem
ca 签发证书命令
-days 证书有效期,这里为3650天
-in 输入文件,这里为private/client.csr(客户证书签发申请文件)
-out 输出文件,这里为certs/server.cer(客户证书文件)
-cert 根证书文件,这里为certs/ca.cer
-keyfile 根证书密钥文件,这里为private/ca.key.pem
16.生成的客户证书不能直接使用,需进行PKCS#12编码转换(执行下列命令后,需输入客户证书密码:123456)
例子:openssl pkcs12 -export -clcerts -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
pkcs12 PKCS#12编码格式证书命令
-export 导出证书
-clcerts 仅导出客户证书
-inkey 输入密钥,这里为private/client.key.pem
-in 输入文件,这里为certs/client.cer(原客户证书文件)
-out 输出文件,这里为certs/client.p12(转码后证书文件)
注意:到达此处时,已经生成了服务端和客户端证书,此时可以进行双向认证了。