关于自签SSL证书的一些小知识汇总

3,760 阅读6分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

1 问题

  • 什么是公钥,什么是私钥?
  • keytoolopenssl是什么?
  • crt/pem/key/csr都是什么?
  • Linux 证书签发步骤

2 公钥和私钥

  • 公钥是公开的,私钥是保存在自己本地的
  • 通信双方各有一套公钥和私钥
  • 公钥加密的数据只有私钥可以解密
  • 私钥加密的数据只有公钥可以解密

假如你用 Github 的话,应该注意到 Github 链接有俩种方式。一种是https,一种是ssh,通过https经常需要输密码,而通过 ssh 则不需要。回忆你设置 ssh 的步骤,本地生成了一个密钥对,并将公钥上传到了 Github。每次传输用自动本地私钥加密,服务器用你上传的公钥解密,就不需要手动输入密码了。

3 keytool / openssl

keytoolopenssl是俩个证书管理工具,keytooljava JDK自带的证书管理工具,使用keytool可以生成密钥,创立证书。只需装了jdk,并正确设置了环境变量,即可以之间通过命令行执行keytool命令来管理证书。 openssl则是一个开源的安全套接字层密码库,功能比keytool更加丰富。

4 crt/pem/key/csr都是什么

证书(Certificate): *.cer *.crt 私钥(Private Key): *.key 证书签名请求(Certificate signing request): *.csr

至于pemder,是编码方式,以上三类均可以使用这两种编码方式,因此.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 生成 key

[root@VM-1-14-centos key]# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...........+++
....+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
[root@VM-1-14-centos key]# ls
server.key

这样是生成rsa私钥,des3算法,openssl格式,2048位强度。server.key是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。

可以通过以下方法生成没有密码的key:

[root@VM-1-14-centos key]# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
[root@VM-1-14-centos key]# ls
server.key

server.key 就是没有密码的版本了。

5.2 生成CA的crt

[root@VM-1-14-centos key]# openssl req -new -x509 -key server.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 []:
[root@VM-1-14-centos key]# ls
ca.crt  server.key

生成的 ca.crt 文件是用来签署下面的 server.csr 文件。

5.3 生成csr

[root@VM-1-14-centos key]# openssl req -new -key server.key -out server.csr
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]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:cloudcared
Organizational Unit Name (eg, section) []:section
Common Name (eg, your name or your server's hostname) []:www.ssltest.com
Email Address []:honest1y@cloudcared.cn 
​
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@VM-1-14-centos key]# ls
ca.crt  server.csr  server.key

须要依次输入国家,地区,组织,Email。最重要的是common name,能够写你的名字或者域名。

若是为了https申请,这个必须和域名吻合,不然会引起浏览器警报。生成的 csr 文件交给 CA签名 后造成服务端本身的证书。

5.4 生成crt

CSR文件必须有CA的签名才可形成证书,可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢。

[root@VM-1-14-centos key]# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=Shaanxi/L=Xi'an/O=cloudcared/OU=section/CN=www.ssltest.com/emailAddress=honest1y@cloudcared.cn
Getting CA Private Key
[root@VM-1-14-centos key]# ls
ca.crt  ca.srl  server.crt  server.csr  server.key

输入key的密钥后,完成证书生成。

-CA 选项指明用于被签名的csr证书

-CAkey 选项指明用于签名的密钥

-CAserial 指明序列号文件

-CAcreateserial 指明文件不存在时自动生成

最后生成了私用密钥:server.key和本身认证的SSL证书:server.crt

证书合并:

cat server.key server.crt > server.pem