目录
1 案例目标
2 环境要求
3 知识储备
4 案例流程
5 案例实践
Step 1 为hadoop01节点生成根证书
Step2 生成keystore(密钥库)
Step 3 向truststore(信任库)添加CA
Step 4 从keystore导出cert
Step 5 用CA对cert签名
Step 6 将CA证书和用CA签名后的证书导入到keystore
Step 7 将keystore、trustsore拷贝到配置目录,并添加jks扩展名
6 案例解析
证书使用流程
keytool和openSSL区别
keystore和truststore的区别和联系
7 案例总结
1 案例目标
为Hadoop集群制作SSL证书,以便后续进行Shuffle加密
2 环境要求
Hadoop完全分布式集群
| 主机 | Hadoop功能 |
|---|---|
| hadoop01 | namenode/resourceManager/作业提交客户端 |
| hadoop02 | datanode/nodeManager |
| hadoop03 | datanode/nodeManager |
3 知识储备
密钥:包含公钥+私钥
公钥的用途:
验证对方身份:防止其他人假冒对方向你发送数据
解密
私钥的用途:
表明自己的身份
加密
证书:数字证书是指CA( Certificate Authority)机构发行的一种电子文档,是一串能够表明网络用户身份信息的数字,提供了一种在计算机网络上验证网络用户身份的方式,因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。
根证书:由CA机构签发,可以为其他证书进行签名,通常需要加入到受信库(truststore)中
keytool:Java数字证书管理工具
keystore:keytool生成的密钥库文件,存储密钥(key)和证书(certificates),Keystore包含:
密钥实体(密钥:公钥+私钥)
可信任的证书实体,只包含公钥
truststore:存储可以信任证书的文件(受信库),和keystore的区别在于truststore只包含公钥的数字证书,而keystrore则包含私钥
jks:Java key store,Java用于存储密钥的容器
cer文件:用于存储证书公钥的文件,包括序列号,发布方标识,主体标识,证书算法,证书有效期,签名算法,版本号,公钥等
4 案例流程
使用openssl制作根证书
产生客户端/服务端keystore
将根证书添加到truststore
对keystore中的证书签名
将根证书,签名后证书添加到keystore
在集群SSL配置目录下保存keystore和truststore
5 案例实践
Step 1 为hadoop01节点生成根证书
使用openssl制作根证书
产生客户端/服务端keystore
将根证书添加到truststore
对keystore中的证书签名
将根证书,签名后证书添加到keystore
在集群SSL配置目录下保存keystore和truststore
Step 1 为hadoop01节点生成根证书
执行如下命令为namenode(nodemanager)节点生成证书:
openssl req -new -x509 -keyout namenodehost_ca_key -out namenodehost_ca_cert -days 9999 -subj /C=CN/ST=guangdong/L=shenzhen/O=demo/OU=demo/CN=hadoop01
这里我的密码设置与主机登录root密码一致
说明:
OpenSSL:开源项目,可以进行证书管理,对称加密和非对称加密等,包含三个组件:openssl(命令行工具)、libcrypto(加密算法库)、libssl(实现ssl,tls的加密模块库)
openssl req -new -x509: 生成自签名证书(x509是一种证书格式,只有公钥,不含私钥)
-keyout:生成自签名证书时自动生成密钥,文件名由后面的参数指定(namenodehost_ca_key:密钥文件)
-out:指定自签名证书文件名
-days:证书过期时间
-subj:证书相关的用户信息(subject的缩写)
CN:中国简称;ST:省份;L:城市;O和OU:公司或个人域名;namenodehost823是生成CA证书主机名
最后生成两个文件:namenodehost_ca_key(保存私钥),namenodehost_ca_cert(x509格式证书,只包含公钥)
执行结果:
注意:在这里不要直接按enter回车,需要输入一个密码,重复输入两次,进行验证即可生成
以上为直接按“回车键”报错,无法生成
以上为第一次输入面与第二次输入密码不一致
以下步骤将生成keystore和truststores
需要在nodemanager和提交作业的客户端上完成以下步骤,由于本例子namenode和nodemanager是同一台机器(hadoop01),而且也作为提交作业的客户端,因此只需要在hadoop01上完成下面的操作。
要提交作业的客户端一定要提供证书,并将证书加入truststores中
Step2 生成keystore(密钥库)
keytool -keystore keystore -alias hadoop01 -validity 9999 -genkey -keyalg RSA -keysize 2048 -dname "CN=hadoop01, OU=demo, O=demo, L=shenzhen, ST=guangdong, C=CN"
说明:
keytool:JDK内置的密钥和证书管理工具
keystore密钥库文件名,它包含公钥、私钥和证书,可以存放多个条目(公钥,私钥、证书)
-genkey:生成一对非对称密钥,也写作,-genkeypair
-validity:有效期
RSA:密钥算法
CN=hadoop01: hadoop01为机器域名或ip,**如果在命令行提示下输入时(即不使用-dname选项)在名字和姓氏处填写域名或ip地址
需要输入2次密钥口令和2次访问密钥库的口令,此时会生成keystore文件(这里我的密码设置与主机登录root密码一致)
Step 3 向truststore(信任库)添加CA
将step 1 使用openssl生成的可签名的证书导入到信任库,并指定别名:CARoot_namenodehost
keytool -keystore truststore -alias CARoot_namenodehost -import -file namenodehost_ca_cert
说明:
设置密钥库口令
在是否信任证书时输入:y
会生成truststore文件
根证书导入到受信库后,可对其他证书进行签名
生成的文件名为 truststore
Step 4 从keystore导出cert
keytool -certreq -alias hadoop01 -keystore keystore -file namenodehost_cert
说明:
alias:要导出证书的别名,密钥库中使用别名区分证书
-file:指定生成的证书文件
namenodehost_ca_cert 根证书,namenodehost_cert是主机hadoop01的证书
Step 5 用CA对cert签名
使用根证书对导出的证书进行签名
openssl x509 -req -CA namenodehost_ca_cert -CAkey namenodehost_ca_key -in namenodehost_cert -out cert_signed -days 9999 -CAcreateserial
说明:
-CA:指定CA证书的路径(或文件)
CAkey:指定CA证书的私钥路径 (或文件)
-CAcreateserial:表示创建证书序列号文件,扩展名为srl
签名后目录下生成一个srl文件和cert_signed文件
Step 6 将CA证书和用CA签名后的证书导入到keystore
导入CA根证书:
keytool -keystore keystore -alias CARoot_namenodehost -import -file namenodehost_ca_cert
导入签名证书:
keytool -keystore keystore -alias hadoop01 -import -file cert_signed
Step 7 将keystore、trustsore拷贝到配置目录,并添加jks扩展名
在Hadoop的ssl-server.xml和ssl-client.xml配置中,服务端证书和提交作业的客户端证书要求配置在用户home目录的keystores中,由于提交作业也使用hadoop01完成,所以server-keystore.jks和client-keystore.jks都是keystores。
mkdir keystores cp keystore keystores/server-keystore.jks cp keystore keystores/client-keystore.jks cp truststore keystores/truststore.jks
6 案例解析
证书使用流程
使用openssl生成根证书
将根证书导入信任库
从密钥库导出客户端,服务端证书,使用根证书进行签名
将签名后的证书,根证书放到客户端、服务端密钥库
keytool和openSSL区别
使用openssl生成根证书
将根证书导入信任库
从密钥库导出客户端,服务端证书,使用根证书进行签名
将签名后的证书,根证书放到客户端、服务端密钥库
keytool和openSSL区别
keytool是JDK内置的数字证书生成工具,但只能生成自签名证书,自签名证书只保证自己是完整的没有经过篡改,但无法证明证书属于谁,也就是说,keytool无法签发证书
openssl能够进行签发证书和进行证书链管理,openssl可以生成根证书、服务端证书
keystore和truststore的区别和联系
keystore和truststore有相似的结构,都是用于存储私钥和证书
keystore的应用目标:
keystore存储SSL链接期间需要使用的证书
通常,keystore用于存储私钥和公钥证书用来初始化一个加密的远程链接
SSL服务器正在启动或者服务器进行客户端授权时,keystore必须存储必要的key和证书
truststore的应用目标
刚好和keystore相对
当建立链接时用于校验证书
通常包含第三方证书,比如根证书,受链接端点签名的证书
7 案例总结
客户端链接SSL服务端时,客户端必须提供keystore中的证书,服务端根据truststore中的证书验证客户端
SSL服务端链接客户端时,客户端同样使用trustore中的证书验证服务端keystore中的证书。



