0%

SSL 自签名证书

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

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

注:

  1. 查看/转换密钥(公钥或者私钥)文件则使用 openssl rsa
  2. 查看/转换的是 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 版本的自签名证书。

  1. 生成 RSA 私钥(不加密的私钥):

    openssl genrsa -out server.key 1024

    注:通过 man genrsa 查看使用手册。如果证书要使用在 Nginx 上,为避免每次 nginx reload ssl 都要手动输入口令,这里生成的私钥不加密。

  2. 创建证书签名申请(CSR, Certificate Signning Request):

    openssl req -new -key server.key -out server.csr

  3. 使用前面生成的私钥对 CSR 进行签名生成自签名证书:

    openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

自签名(私有) CA 证书

由自己进行签署的 CA。它既是证书也是 CA。因为它是树中的最顶层证书,因此也是根 CA。不推荐在外部面向因特网的服务器上将私有 CA 签署的证书用于生产,因为可能存在安全隐患。但是,在开发和测试环境中会优先选择此类证书,因为其成本较低。它们也适用于内部(内部网)服务器,因为这些证书可以快速和轻松地部署。

可以使用 openssl caopenssl x509 都可以自签名 CA 证书和使用自签名 CA 证书签署其他证书。 openssl ca 可以看着是 openssl x509 封装(注:不知道实现上实际是不是),通过配置文件设置默认参数(遵循一定规则和约束),openssl x509 签署证书时需要自己指定所有参数。另外,openssl caindex.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 签署证书而不用额外指定参数。

  1. 生成 CA 私钥(加密)
    openssl genrsa -aes256 -out /etc/pki/CA/private/cakey.pem 2048
  1. 生成自签名 CA 证书:使用 openssl req -x509openssl x509openssl 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 证书签署证书
  1. 生成私钥(不加密)
    openssl genrsa -out /etc/pki/CA/private/xb29.key 2048

  2. 生成证书签名请求
    openssl req -new -key /etc/pki/CA/private/xb29.key -out /etc/pki/CA/private/xb29.csr

  3. 使用自签名 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 一样遵循配置文件。

  1. 生成 CA 私钥(加密)
    openssl genrsa -aes256 -out ca.key 2048
  1. 生成自签名 CA 证书:
    openssl req -new -x509 -days 3650 -extensions v3_ca -key ca.key -out ca.crt
使用自签名 CA 证书签署证书
  1. 生成私钥(不加密)
    openssl genrsa -out xb29.key 2048

  2. 生成证书签名请求
    openssl req -new -key xb29.key -out xb29.csr

  3. 使用自签名 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 ) 。

  1. (可选) 有些应用可能不支持设置的单独的证书和私钥,这个时候需要将证书和私钥合并成一个文件。

    cat xb29.crt xb29.key > xb29.pem

参考资料

  1. 通过使用不受信任的证书配置 SSL
  2. openssl ca(签署和自建CA)
  3. OpenSSL生成根证书CA及签发子证书
  4. Wiki X.509