共计 3117 个字符,预计需要花费 8 分钟才能阅读完成。
1 问题
- 什么是公钥,什么是私钥?
- keytool 和 openssl?
- crt/pem/key/csr 都是什么?
- Linux 证书签发步骤
2 公钥和私钥
- 公钥是公开的,私钥是保存在自己本地的
- 通信双方各有一套公钥和私钥
- 公钥加密的数据只有私钥可以解密
- 私钥加密的数据只有公钥可以解密
假如你用 Github 的话,应该注意到 Github 链接有俩种方式。一种是https,一种是ssh,通过https经常需要输密码,而通过 ssh 则不需要。回忆你设置 ssh 的步骤,本地生成了一个密钥对,并将公钥上传到了 Github。每次传输用自动本地私钥加密,服务器用你上传的公钥解密,就不需要手动输入密码了。
3 keytool / openssl
keytool
和 openssl
是俩个证书管理工具,keytool
是java JDK
自带的证书管理工具,使用keytool
可以生成密钥,创立证书。只需装了jdk,并正确设置了环境变量,即可以之间通过命令行执行keytool
命令来管理证书。
openssl
则是一个开源的安全套接字层密码库,功能比keytool
更加丰富。
4 crt/pem/key/csr都是什么
证书(Certificate): *.cer *.crt
私钥(Private Key): *.key
证书签名请求(Certificate signing request): *.csr
至于pem
和der
,是编码方式,以上三类均可以使用这两种编码方式,因此.pem
和.der
不一定是以上三种(Cert,Key,CSR)中的某一种
pem: base64编码
der: 二进制编码
可以使用以下方法简单区分带有后缀扩展名的证书文件:
- .DER 或 .CER 文件: 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。
- .CRT 文件: 这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与 DER及CER证书文件相同。
- .PEM 文件: 这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。 .PEM 文件如果只包含私钥,一般用
.KEY
文件代替。 - PFX 或 .P12 文件: 这样的证书文件是二进制格式,同时包含证书和私钥,且一般有密码保护。
也可以使用记事本直接打开证书文件。如果显示的是规则的数字字母,例如:
—–BEGIN CERTIFICATE—–
MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh......
—–END CERTIFICATE—–
那么,该证书文件是文本格式的。
- 如果存在
——BEGIN CERTIFICATE——
,则说明这是一个证书文件。 - 如果存在
—–BEGIN RSA PRIVATE KEY—–
,则说明这是一个私钥文件。
5 Linux 自签名生成证书
x509证书通常会用到三类文:key,csr,crt
*.key:密钥文件,一般是SSL中的私钥,通常是rsa算法,分带口令和不带口令的版本;
*.csr:证书请求文件,里面包含公钥和其他信息,通过签名后就可以生成证书;用于向证书颁发机构申请crt证书时使用,服务器配置时不会用到;在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥;
.crt, .cert:CA认证后的证书文件,包含公钥,签名和其他需要认证的信息,比如主机名称(IP)等;
*.pem:里面一般包含私钥和证书的信息;
我们自签名证书配置,虚拟主机需要的是 .crt
证书,和不带口令的SSL Key的.key文件;
5.1 生成CA证书
# 1、生成CA根证书私钥
$ openssl genrsa -des3 -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
.....................................................+++
........................................+++
e is 65537 (0x10001)
Enter pass phrase for ca.key: #123456768
Verifying - Enter pass phrase for ca.key: #123456768
$ ls
ca.key
# 可以通过以下方法生成没有密码的key
$ openssl rsa -in ca.key -out ca.key
Enter pass phrase for ca.key:
writing RSA key
$ ls
ca.key
# ca.key就是没有密码的版本了
# 2、通过CA根私钥签发CA根证书
$ openssl req -new -x509 -key ca.key -out ca.crt -days 3650
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
$ ls
ca.crt ca.key
这样是生成 rsa 私钥,des3 算法,openssl 格式,2048 位强度。ca.key 是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。
5.2 生成服务端证书
# 1、生成服务端证书私钥
$ openssl genrsa -out server.key 2048
# 2、生成签发请求csr
$ openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=shaanxi/L=xian/O=srelife/OU=srelife/CN=*.srelife.cn"
$ ls
ca.crt ca.key server.csr server.key
# 3、用CA证书签发服务端证书
# -CA选项指明用于被签名的csr证书
# -CAkey选项指明用于签名的密钥
# -CAserial指明序列号文件
# -CAcreateserial指明文件不存在时自动生成
$ openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=shaanxi/L=xian/O=srelife/OU=srelife/CN=*.srelife.cn
Getting CA Private Key
ca.crt ca.key ca.srl server.crt server.csr server.key
完成证书生成
最后生成了私用密钥:server.key 和本身认证的SSL证书 server.crt
证书合并:
cat server.key server.crt > server.pem