SSL 自签名证书
X.509 格式标准
X.509:这是一种公钥证书的格式格式标准(
https://zh.wikipedia.org/wiki/X.509),详情参考 RFC5280
编码格式
PEM:Privacy Enhanced Mail
文本格式,Apache 和 Unix-like 服务器偏向使用这种编码格式。查看 PEM 格式的证书(可以包含私钥):
openssl x509 -in certificate.pem -text -noout
- DER: Distinguished Encoding Rules
二进制格式, Java 和 Windows 服务器偏向使用这种编码格式。查看 DER 格式的证书(单纯的证书,不可包含私钥):
openssl x509 -in certificate.der -inform der -text -noout
- DER: Distinguished Encoding Rules
PEM 转 DER:openssl x509 -in cert.crt -outform der -out cert.der
DER 转 PEM:openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
注:
- 查看/转换密钥(公钥或者私钥)文件则使用
openssl rsa
; - 查看/转换的是 CSR 文件则使用
openssl req
。
文件后缀名
- crt,certificate 的缩写,Unix-like 证书文件的常见后缀名,通常是 PEM 编码。
- cer,也是 certificate 的缩写,Windows 证书文件的常见后缀名,通常是 DER 编码。
- key, 通常是公钥或者私钥文件的后缀名。
- csr,Certificate Signing Request,证书签名申请文件后缀名。
- pfx/p12,predecessor of PKCS#12,将证书和私钥存放在一个文件中,使用 DER 编码。 通常是 IIS 使用,Unix 系服务器通常证书和私钥是放在不同的文件中。
- JKS,Java Key Storage,通常用在 tomcat 中,Java 提供 keytool 工具支持将 pfx/p12 转换成 JKS:
keytool -importkeystore -srckeystore test.pfx -srcstoretype PKCS12 -deststoretype JKS -destkeystore test.jks
PEM <--> pfx/p12-->
Unix 系的 PEM 证书转 pfx/p12 格式证书:openssl pkcs12 -export -in certificate.crt -inkey privateKey.key [-certfile CACert.crt] -out certificate.pfx
反过来:
openssl pkcs12 -in certificate.pfx -nodes -out certificate.pem
因为 certificate.pem
是一个同时包含证书和私钥的 PEM 证书,进一步可以通过下面命令分离成单独 PEM 证书和私钥 2 个文件:
openssl rsa -in certificate.pem -out privateKey.key
openssl x509 -in server.pem -out certificate.crt
生成证书
自签名证书( x.509 v1)
自己签署的证书,没有 CA 可以证明其有效性,无法被吊销。由于大多数移动平台不支持使用自签名证书,因此不推荐使用。用下面方法可以生成 x.509 v1 版本的自签名证书。
生成 RSA 私钥(不加密的私钥):
openssl genrsa -out server.key 1024
注:通过
man genrsa
查看使用手册。如果证书要使用在 Nginx 上,为避免每次 nginx reload ssl 都要手动输入口令,这里生成的私钥不加密。创建证书签名申请(CSR, Certificate Signning Request):
openssl req -new -key server.key -out server.csr
使用前面生成的私钥对 CSR 进行签名生成自签名证书:
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
自签名(私有) CA 证书
由自己进行签署的 CA。它既是证书也是 CA。因为它是树中的最顶层证书,因此也是根 CA。不推荐在外部面向因特网的服务器上将私有 CA 签署的证书用于生产,因为可能存在安全隐患。但是,在开发和测试环境中会优先选择此类证书,因为其成本较低。它们也适用于内部(内部网)服务器,因为这些证书可以快速和轻松地部署。
可以使用 openssl ca
与 openssl x509
都可以自签名 CA 证书和使用自签名 CA 证书签署其他证书。 openssl ca
可以看着是 openssl x509
封装(注:不知道实现上实际是不是),通过配置文件设置默认参数(遵循一定规则和约束),openssl x509
签署证书时需要自己指定所有参数。另外,openssl ca
的 index.txt
还记录着已经签署的证书信息。
使用 openssl ca
openssl ca 的默认配置文件是 /etc/pki/tls/openssl.cnf
(openssl-1.0.2k-16.el7_6.1.x86_64,具体路径可能不同),下图是默认工作目录 /etc/pki/CA
的结构和组成:
初始化工作目录 /etc/pki/CA
使用 openssl ca
前需要初始化一些文件:
openssl rand -out /etc/pki/CA/private/.rand 1000 && openssl rand -hex 8 | awk '{print toupper($0)}' > /etc/pki/CA/serial && touch /etc/pki/CA/index.txt
各个文件含义参考 /etc/pki/tls/openssl.cnf
文件。 .rand
提供随机数种子,serial
提供证书序列号, index.txt
数据库索引文件,记录签署的所有证书。
生成自签名 CA 证书(x.509 v3)
以下使用的私钥及证书的文件(及后缀名)都是 /etc/pki/tls/openssl.cnf
定义的 默认值 ,这样之后可以直接使用 openssl ca
签署证书而不用额外指定参数。
- 生成 CA 私钥(加密)
openssl genrsa -aes256 -out /etc/pki/CA/private/cakey.pem 2048
生成自签名 CA 证书:使用
openssl req -x509
、openssl x509
和openssl ca
都可以『自签署』证书请求文件。openssl req -x509 -new -days 3650 -extensions v3_ca -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
或者
openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/private/ca.csr
openssl x509 -req -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -in /etc/pki/CA/private/ca.csr -signkey /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
或者(推荐
openssl ca
)openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/private/ca.csr
openssl ca -selfsign -in /etc/pki/CA/private/ca.csr -out /etc/pki/CA/cacert.pem && rm -f /etc/pki/CA/private/ca.csr
使用自签名 CA 证书签署证书
生成私钥(不加密)
openssl genrsa -out /etc/pki/CA/private/xb29.key 2048
生成证书签名请求
openssl req -new -key /etc/pki/CA/private/xb29.key -out /etc/pki/CA/private/xb29.csr
使用自签名 CA 证书签署证书
openssl ca -days 3650 -in /etc/pki/CA/private/xb29.csr -out /etc/pki/CA/newcerts/xb29.crt
使用 openssl x509
生成自签名 CA 证书(x.509 v3)
自签名 CA 证书生成方式如上一节描述,这里再 『描述』 一遍,主要是为了展示证书和私钥可以存放在任意路径,不需要像 openssl ca
一样遵循配置文件。
- 生成 CA 私钥(加密)
openssl genrsa -aes256 -out ca.key 2048
- 生成自签名 CA 证书:
openssl req -new -x509 -days 3650 -extensions v3_ca -key ca.key -out ca.crt
使用自签名 CA 证书签署证书
生成私钥(不加密)
openssl genrsa -out xb29.key 2048
生成证书签名请求
openssl req -new -key xb29.key -out xb29.csr
使用自签名 CA 证书签署证书
openssl x509 -req -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_req -CA ca.crt -CAkey ca.key -CAcreateserial -in xb29.csr -out xb29.crt
注:-CAcreateserial
参数自动在当前目录创建一个证书签发使用的序列号文件 ca.srl
(如果不存在的话,文件名同 CA 证书名,后缀 .srl
) 。
(可选) 有些应用可能不支持设置的单独的证书和私钥,这个时候需要将证书和私钥合并成一个文件。
cat xb29.crt xb29.key > xb29.pem