数字证书 & CSR & OpenSSL

参考 Reference

Openssl的证书操作
Why do I have to create a certificate request (CSR) from the private key?
什么是CSR文件
SSL证书请求文件(CSR)生成指南
什么是CSR ? 什么是公钥和私钥?
Where in the CSR is the public key?
openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
How to create a .pem file for SSL Certificate Installations
OpenSSL生成根证书CA及签发子证书


CSR Certificate Signing Request,证书签名请求,即申请者通过将公钥发送给 CA,Certificate Authority, 来申请数字签名证书的请求。发送的文件叫做 CSR 文件。

In public key infrastructure (PKI) systems, a certificate signing request (also CSR or certification request) is a message sent from an applicant to a registration authority of the public key infrastructure in order to apply for a digital identity certificate.

有了数字签名证书,我们即可证明自己是可信的,CA 会为此背书。

  • CRT,certificate 的缩写,即证书;
  • X.509,一种证书格式。对 X.509 证书来说,认证者总是 CA 或由 CA 指定的人,一份 X.509 证书是一些标准字段的合集,这些字段包含有关用户或设备及其相应公钥的信息;
  • PEM,Privacy Enhanced Mail,以「-----BEGIN...」开头,「-----END...」结尾,内容是 BASE64 编码。Apache 和 *NIX 服务器偏向于使用这种编码格式;
  • DER,Distinguished Encoding Rules,打开看是二进制格式,不可读,
    Java 和 Windows 服务器偏向于使用这种编码格式。

CSR 文件

申请者向 CA 申请数据证书,首先需要自己先产生一对公私密钥。申请者保管好私钥,再把公钥和申请者信息发送给 CA,CA 通过这个公钥和申请者信息签发数字证书。

CSR 文件就是包含了申请者公钥和申请者信息的数据文件。申请者产出这个 CSR 文件,发送给 CA,CA 会根据 CSR 文件中的内容签发数字证书。

如何产生 CSR 文件

要产生 CSR 文件的方法有很多,比较常用的是 OpenSSL。

也可以通过 CA 机构在线生成 CSR(不推荐,因为暴露了密钥对)。

私钥

使用 RSA 算法,私钥输出到 private.key 文件。

openssl genrsa -out private.key 1024
  • genrsa 使用 RSA 算法产生私钥
  • -out 输出文件路径
  • 1024 制定私钥长度

生成 CSR 文件

使用私钥 private.key 生成 CSR 文件 server.csr
这里需要填写申请者信息。要注意的是 Common Name 这里,要填写成使用 SSL 证书(即:HTTPS 协议)的域名或主机名,否则浏览器会认为不安全。例如:如果以后打算用 https://dummy.example.com/xxx 这里就填写 dummy.example.com

$ 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) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:dummy.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# OR
$ openssl req -new -key private.key -out server.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"
  • req 执行证书签发命令
  • -new 新证书签发请求
  • -key 指定私钥
  • -out 输出 CSR 文件路径
  • -subj 证书相关的用户信息

公钥

完成上面的两个步骤后,公钥会同时出现在 server.csrprivate.key 文件中。

$ openssl rsa -in server.key -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4IPFCBOLLyJWtx37bibBKhKvE
9MbfD0MV8bXU544dVXvWZwLQwluyrsYebpl+4K1aLNmh01qUwBsm4GxESZo4mF3L
13Yki7Xlw95KJVgDBN0i1j96LgaxV/4K8z4RQ1MryGw+EHYFK/5pwtLxGN7Rn7kB
L9HOPEkwfwWbenUikQIDAQAB
-----END PUBLIC KEY-----

$ openssl req -in server.csr -noout -pubkey
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4IPFCBOLLyJWtx37bibBKhKvE
9MbfD0MV8bXU544dVXvWZwLQwluyrsYebpl+4K1aLNmh01qUwBsm4GxESZo4mF3L
13Yki7Xlw95KJVgDBN0i1j96LgaxV/4K8z4RQ1MryGw+EHYFK/5pwtLxGN7Rn7kB
L9HOPEkwfwWbenUikQIDAQAB
-----END PUBLIC KEY-----

证书

生成的 csr 文件交给 CA 签名后形成服务端自己的证书。

我们将 CSR 文件提交给 CA 申请证书,经过 CA 身份对申请者身份进行审核后,使用 CA 的私钥来给签名,生成证书。

CA 签名算法工作流程大致如下:一般是对信息做一个 Hash 计算,得到一个 Hash 值,这个过程不可逆,也就是说无法通过 Hash 值得出原来的信息内容。再把信息发送出去时,把这个 Hash 值用 CA 私钥加密后,作为一个签名和信息一起发出去。

CA 端

CA 有自己的证书 crt 文件,这个 CA 自己的证书(证明自己是可信的),由更高级别的 CA 给它颁发的。

$ openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca_private.key -out server.crt

# OR

$ openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca_private.key -out server.pem
  • x509 生成 x509 格式证书
  • -days 证书有效期(天)
  • -in 输入的 CSR 文件
  • -CA CA 的证书 CRT 文件
  • -CAkey CA 的私钥,即签发证书的私钥
  • -out 输出的 CRT / PEM 证书文件
  • -CAserial 指定证书序列号文件的路径
  • -CAcreateserial 表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀

申请人收到证书文件后,将证书公钥配合私钥文件转化为服务器对应的格式的文件,部署在 HTTP 服务器上面,这样我们的网站就可信了。

通过 certificate 创建 PEM 文件

# (optional) Remove the password from the Private Key by following the steps listed below:
$ openssl rsa -in server.key -out nopassword.key

# Combine the private key, public certificate and any 3rd party intermediate certificate files:
$ cat nopassword.key > server.pem
$ cat server.crt >> server.pem

# Note: Repeat this step as needed for third-party certificate chain files, bundles, etc:
$ cat server.key server.crt > server.pem

查看证书内容

$ openssl x509 -in server.pem -noout -text
  • Issuer 证书由谁颁发;
  • Subject 证书颁发给谁;
  • Validity 证书期限;
  • Public-key 公钥内容;
  • Signature Algorithm 签名算法;

未来任何人都从服务端获取这个证书,而不是公钥。你需要得到这个证书的发布机构 CA 的公钥,来解密这个证书的签名,如果解密成功了,Hash 也对得上,就说明这个证书中自带的公钥没什么问题。

拓展

OpenSSL Heartbleed 心脏出血漏洞

你可能感兴趣的:(数字证书 & CSR & OpenSSL)