一文读懂SSL认证全解析

概念:
密钥:包含公钥+私钥
公钥的用途:验证对方身份-防止其他人假冒对方向你发送数据、解密。
私钥的用途:表明自己的身份、加密。
密钥库( keystore.jks):是服务器的密钥存储库,存储服务器的公钥、私钥、证书。keytool生成的密钥库文件,存储密钥(key)和证书(certificates),Keystore包含:密钥实体(密钥:公钥+私钥)、可信任的证书实体,只包含公钥。
信任库( truststore.jks): 是服务器的信任密钥存储库,存CA公钥。存储可以信任证书的文件,和keystore的区别在于truststore只包含公钥的数字证书,而keystrore则包含私钥。
Certificate Authority (CA) :中间证书颁发机构。
根证书:由CA机构签发,可以为其他证书进行签名,通常需要加入到受信库(truststore)中。
证书:数字证书是指CA发行的一种电子文档,是一串能够表明网络用户身份信息的数字,提供了一种在计算机网络上验证网络用户身份的方式,因此数字证书又称为数字标识。
数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。提供一个主机名,请中间证书颁发机构,进行签名,输出一个CA签名后的证书 (即客户端证书) 。
keytool:Java数字证书管理工具。
jks:Java key store,Java用于存储密钥的容器。
cert文件:用于存储证书公钥的文件,包括序列号,发布方标识,主体标识,证书算法,证书有效期,签名算法,版本号,公钥等

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

keytool和openSSL区别:
keytool是JDK内置的数字证书生成工具,但只能生成自签名证书,自签名证书只保证自己是完整的没有经过篡改,但无法证明证书属于谁,也就是说,keytool无法签发证书
openssl能够进行签发证书和进行证书链管理,openssl可以生成根证书、服务端证书

keystore和truststore的区别和联系:
keystore和truststore有相似的结构,都是用于存储私钥和证书
1、keystore的应用目标:
keystore存储SSL链接期间需要使用的证书
通常,keystore用于存储私钥和公钥证书用来初始化一个加密的远程链接
SSL服务器正在启动或者服务器进行客户端授权时,keystore必须存储必要的key和证书
2、truststore的应用目标:
刚好和keystore相对
当建立链接时用于校验证书
通常包含第三方证书,比如根证书,受链接端点签名的证书

证书使用流程:
使用openssl生成根证书
将根证书导入信任库(truststore)
从密钥库(keystore)导出客户端、服务端证书,使用根证书进行签名
将签名后的证书,根证书放到客户端、服务端密钥库(keystore)

整体步骤:
1、使用openssl制作根证书(生成namenodehost_ca_key(保存私钥),namenodehost_ca_cert(x509格式证书,只包含公钥))
2、产生客户端/服务端keystore (生成密钥库:keystore)
3、将根证书添加到truststore (生成信任库:truststore)
4、对keystore中的证书签名 (生成主机证书:hadoop01_cert)
5、将根证书,签名后证书添加到keystore (生成一个srl文件和cert_signed文件,并导入keystore)
6、在集群SSL配置目录下保存keystore和truststore (复制keystore、truststore,配置ssl-server.xml、ssl-client.xml)

操作步骤:
1、为hadoop01节点生成根证书(生成根证书:namenodehost_ca_key(保存私钥),namenodehost_ca_cert(x509格式证书,只包含公钥))
执行如下命令为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格式证书,只包含公钥)

生成后将根证书传到hadoop02 和hadoop03节点上:
用根证书用来签名证书(每台节点都需要步骤2 到 步骤7),保证每台机器都有keystore和truststore,这才表示所有机器拥有自己的证书。证书别名注意对应修改成主机名

2、生成keystore(生成密钥库: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”
说明:需要输入2次密钥口令和2次访问密钥库的口令,此时会生成keystore文件(这里我的密码设置与主机登录root密码一致)
keytool:JDK内置的密钥和证书管理工具
keystore密钥库文件名,它包含公钥、私钥和证书,可以存放多个条目(公钥,私钥、证书)
-genkey:生成一对非对称密钥,也写作,-genkeypair
-validity:有效期
RSA:密钥算法
CN=hadoop01: hadoop01为机器域名或ip,**如果在命令行提示下输入时(即不使用-dname选项)在名字和姓氏处填写域名或ip地址

3、向truststore(信任库)添加CA (生成信任库:truststore)
将1步骤,使用openssl生成的可签名的证书导入到信任库,并指定别名:CARoot_namenodehost
keytool -keystore truststore -alias CARoot_namenodehost -import -file namenodehost_ca_cert
说明:
设置密钥库口令
在是否信任证书时输入:y
会生成truststore文件
根证书导入到受信库后,可对其他证书进行签名
生成的文件名为 truststore

4、从keystore导出cert (生成主机证书:hadoop01_cert)
keytool -certreq -alias hadoop01 -keystore keystore -file hadoop01_cert
说明:
alias:要导出证书的别名,密钥库中使用别名区分证书
-file:指定生成的证书文件
生成的hadoop01_cert是主机hadoop01的证书

5、用CA对cert签名(生成一个srl文件和cert_signed文件)
使用根证书对导出的证书进行签名
openssl x509 -req -CA namenodehost_ca_cert -CAkey namenodehost_ca_key -in hadoop01_cert -out cert_signed -days 9999 -CAcreateserial
说明:
-CA:指定CA证书的路径(或文件)
-CAkey:指定CA证书的私钥路径 (或文件)
-CAcreateserial:表示创建证书序列号文件,扩展名为srl
签名后目录下生成一个srl文件和cert_signed文件

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

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

工具使用:
1、keytool工具说明
Keytool 是一个Java 数据证书的管理工具 。
Keytool 将密钥(key)和证书(certificates)存在一个称为keystore的文件中,在keystore文件里,包含两种数据:
密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
可信任的证书实体(trusted certificate entries)——只包含公钥
ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写
JDK中keytool 常用命令:
-genkey 创建密钥库。在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
(在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:/Documents and Settings/UserName/文件名为“.keystore”)
-alias keystore的别名
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定keystore密钥库的密码(获取keystore信息所需的密码)
-keypass 指定别名条目的密码(私钥的密码)
-dname 指定证书拥有者信息 例如: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”
-list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码
-printcert 查看导出的证书信息 keytool -printcert -file yushan.crt
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
-storepasswd 修改keystore口令 keytool -storepasswd -keystore e:/yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)
-import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

下面是各选项的缺省值。
-alias “mykey”
-keyalg “DSA”
-keysize 1024
-validity 90
-keystore 用户宿主目录中名为 .keystore 的文件
-file 读时为标准输入,写时为标准输出

证书条目的删除:
keytool -delete -alias shuany(指定需删除的别名) -keystore yushan.keystore -storepass 123456
证书条目口令的修改:
keytool -keypasswd -alias yushan(需要修改密码的别名) -keypass yushan(原始密码) -new 123456(别名的新密码) -keystore e:/yushan.keystore -storepass 123456
keystore口令的修改:
keytool -storepasswd -keystore e:/yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)
修改keystore中别名为yushan的信息
keytool -selfcert -alias yushan -keypass yushan -keystore e:/yushan.keystore -storepass 123456 -dname “cn=yushan,ou=yushan,o=yushan,c=us”

2、openssl工具说明
openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书。
openssl req -new -x509 -keyout ca-key -out ca-cert -days {validity}
主要命令选项:
-new :说明生成证书请求文件
-x509 :说明生成自签名证书
-key :指定已有的秘钥文件,以便来生成秘钥请求,只与生成证书请求选项-new配合。
-newkey :-newkey是与-key互斥的,-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,然后生成的密钥名称由-keyout参数指定。当指定newkey选项时,后面指定rsa:bits说明产生
rsa密钥,位数由bits指定。 如果没有指定选项-key和-newkey,默认自动生成秘钥。
-out :-out 指定生成的证书请求或者自签名证书名称。 指定输出文件,此处输出文件即为证书请求文件。
-keyout :用于把新建立的私钥,输出到指定文件
-config :默认参数在ubuntu上为 /etc/ssl/openssl.cnf, 可以使用-config指定特殊路径的配置文件
-nodes :如果指定-newkey自动生成秘钥,那么-nodes选项说明生成的秘钥不需要加密,即不需要输入passphase.
-batch :指定非交互模式,直接读取config文件配置参数,或者使用默认参数值
-subj 给出证书的 Subject 字段的值。参数值的格式必须是 /=/type1=… # 不允许有空格,但可以用 \ 来转义

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值