一、概念解析

1.密钥:包含公钥和私钥。公钥用于验证对方身份、解密数据;私钥用于表明自己的身份、加密数据。

2.密钥库(keystore.jks):服务器的密钥存储库,存储服务器的公钥、私钥和证书。它由 keytool 生成,包含密钥实体(公钥+私钥)和可信任的证书实体(只包含公钥)。

3.信任库(truststore.jks):服务器的信任密钥存储库,存储 CA 公钥。与 keystore 不同,truststore 只包含公钥的数字证书。

4.Certificate Authority (CA):中间证书颁发机构,负责签发证书。

5.根证书:由 CA 机构签发,可对其他证书进行签名,通常需加入到受信库(truststore)中。

6.证书:数字证书是 CA 发行的电子文档,能表明网络用户身份信息,为网络交流中的信息和数据提供加密或解密保障,确保其完整性和安全性。

7.keytool:Java 数字证书管理工具。

8.jks:Java key store,Java 用于存储密钥的容器。

9.cert 文件:用于存储证书公钥的文件,包含序列号、发布方标识、主体标识、证书算法、有效期、签名算法、版本号、公钥等。

二、SSL证书认证关系

客户端链接SSL证书服务端时,客户端必须提供 keystore 中的证书,服务端根据 truststore 中的证书验证客户端。SSL证书服务端链接客户端时,客户端同样使用 truststore 中的证书验证服务端 keystore 中的证书。

三、keytool 和 openSSL 区别

keytool 是 JDK 内置的数字证书生成工具,但只能生成自签名证书,无法证明证书属于谁。而 openssl 能够进行签发证书和证书链管理,可生成根证书、服务端证书。

四、keystore 和 truststore 的区别与联系

keystore 和 truststore 结构相似,都用于存储私钥和证书。

1.keystore 的应用目标:存储 SSL 链接期间需要使用的证书,通常用于存储私钥和公钥证书,以初始化加密的远程链接。在 SSL 服务器启动或进行客户端授权时,keystore 必须存储必要的 key 和证书。

2.truststore 的应用目标:与 keystore 相对,在建立链接时用于校验证书,通常包含第三方证书,如根证书和受链接端点签名的证书。

五、证书使用流程

1.使用 openssl 生成根证书。

2.将根证书导入信任库(truststore)。

3.从密钥库(keystore)导出客户端、服务端证书,使用根证书进行签名。

4.将签名后的证书和根证书放到客户端、服务端密钥库(keystore)。

六、整体步骤

1.为节点生成根证书:

(1)使用 openssl 为 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`。生成两个文件:namenodehost_ca_key(保存私钥)和 namenodehost_ca_cert(x509 格式证书,只包含公钥)。

(2)将根证书传到其他节点,用于签名证书,确保每台机器都有 keystore 和 truststore。

2.生成 keystore:

使用 keytool 生成 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”`。需输入两次密钥口令和两次访问密钥库的口令,生成 keystore 文件。

3.向 truststore 添加 CA:

将使用 openssl 生成的可签名证书导入到信任库,并指定别名`CARoot_namenodehost`,命令为`keytool -keystore truststore -alias CARoot_namenodehost -import -file namenodehost_ca_cert`。设置密钥库口令,在信任证书时输入“y”,生成 truststore 文件。

4.从 keystore 导出 cert:

使用 keytool 从 keystore 导出主机证书,命令为`keytool -certreq -alias hadoop01 -keystore keystore -file hadoop01_cert`。生成的 hadoop01_cert 是主机 hadoop01 的证书。

5.用 CA 对 cert 签名:

使用根证书对导出的证书进行签名,命令为`openssl x509 -req -CA namenodehost_ca_cert -CAkey namenodehost_ca_key -in hadoop01_cert -out cert_signed -days 9999 -CAcreateserial`。签名后目录下生成一个 srl 文件和 cert_signed 文件。

6.将 CA 证书和签名后的证书导入到 keystore:

(1)导入 CA 根证书,命令为`keytool -keystore keystore -alias CARoot_namenodehost -import -file namenodehost_ca_cert`。

(2)导入签名证书,命令为`keytool -keystore keystore -alias hadoop01 -import -file cert_signed`。

7.将 keystore、trustsore 拷贝到配置目录,并添加 jks 扩展名:

在 Hadoop 的 ssl-server.xml 和 ssl-client.xml 配置中,将 keystore 和 truststore 拷贝到配置目录,并别命名为 server-keystore.jks 和 client-keystore.jks、truststore.jks。

七、工具使用

1.keytool 工具说明:

(1)Keytool 是 Java 数据证书管理工具,将密钥和证书存在 keystore 文件中。keystore 文件包含密钥实体(公钥、私钥)和可信任的证书实体(只包含公钥)。

(2)JDK 中 keytool 常用命令有-genkey(创建密钥库)、-alias(keystore 的别名)、-keystore(指定密钥库名称)、-keyalg(指定密钥算法)、-validity(指定证书有效期)、-keysize(指定密钥长度)、-storepass(指定 keystore 密钥库密码)、-keypass(指定别名条目密码)、-dname(指定证书拥有者信息)、-list(显示密钥库中的证书信息)、-export(将别名指定的证书导出到文件)、-delete(删除密钥库中某条目)、-printcert(查看导出的证书信息)、-keypasswd(修改密钥库中指定条目口令)、-storepasswd(修改 keystore 口令)、-import(将已签名数字证书导入密钥库)等。

2.openssl 工具说明:

(1)openssl req 命令主要功能有生成证书请求文件、查看验证证书请求文件和生成自签名证书。

(2)主要命令选项有-new(生成证书请求文件)、-x509(生成自签名证书)、-key(指定已有秘钥文件)、-newkey(自动生成密钥)、-out(指定生成的证书请求或自签名证书名称)、-keyout(用于把新建立的私钥输出到指定文件)、-config(指定特殊路径的配置文件)、-nodes(生成的秘钥不需要加密)、-batch(指定非交互模式)、-subj(给出证书的 Subject 字段的值)等。