OpenSSL生成CA

CentOS 7.2.1511

环境:

Distributor ID: CentOS
Description: CentOS Linux release 7.2.1511 (Core)
Release: 7.2.1511

安装

文件夹准备

  

yum install openssl -y
find / -name "openssl.cnf"
/etc/pki/tls/openssl.cnf
cat /etc/pki/tls/openssl.cnf
dir		= /etc/pki/CA		# Where everything is kept
cd /etc/pki/CA
ls
certs  crl  newcerts  private
touch index.txt
echo 01 > serial
ls
certs  crl  index.txt  newcerts  private  serial

  • certs——存放已颁发的证书

  • newcerts——存放CA指令生成的新证书

  • private——存放私钥

  • crl——存放已吊销的整数

  • index.txt——OpenSSL定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的

  • serial——证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号

  • 生成证书之前,需要先生成一个随机数

  

#rand——生成随机数
#-out——指定输出文件
#1000——指定随机数长度
openssl rand -out private/.rand 1000

生成根证书:

  • 生成根证书私钥(pem文件)
  

openssl genrsa -aes256 -out private/cakey.pem 1024
Generating RSA private key, 1024 bit long modulus
........++++++
..............++++++
e is 65537 (0x10001)
Enter pass phrase for private/cakey.pem:
Verifying - Enter pass phrase for private/cakey.pem:

  • genrsa——使用RSA算法产生私钥

  • -aes256——使用256位密钥的AES算法对私钥进行加密

  • -out——输出文件的路径

  • 1024——指定私钥长度

  • 生成根证书签发申请文件(csr文件)
    使用上一步生成的私钥(pem文件),生成证书请求文件(csr文件)

  

openssl req -new -key private/cakey.pem -out private/ca.csr -subj \
"/C=CN/ST=Beijing/L=Beijing/O=Ourdark/OU=Ourdark/CN=Ourdark"
Enter pass phrase for private/cakey.pem:

  • req——执行证书签发命令

  • -new——新证书签发请求

  • -key——指定私钥路径

  • -out——输出的csr文件的路径

  • -subj——证书相关的用户信息(subject的缩写)

  • C是Country,

  • ST是state

  • L是local

  • O是Organization

  • OU是Organization Unit

  • CN是common name

  • 自签发根证书(cer文件)
    csr文件生成以后,可以将其发送给CA认证机构进行签发,当然,这里我们使用OpenSSL对该证书进行自签发

  

openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey \
private/cakey.pem -in private/ca.csr -out certs/ca.cer
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=Ourdark/OU=Ourdark/CN=Ourdark
Getting Private key
Enter pass phrase for private/cakey.pem:

  • x509——生成x509格式证书
  • -req——输入csr文件
  • -days——证书的有效期(天)
  • -sha1——证书摘要采用sha1算法
  • -extensions——按照openssl.cnf文件中配置的v3_ca项添加扩展
  • -signkey——签发证书的私钥
  • -in——要输入的csr文件
  • -out——输出的cer证书文件

  

ls certs/
ca.cer


用根证书签发server端证书

  • 生成服务端私钥
  

openssl genrsa -aes256 -out private/server-key.pem 1024

  • 生成证书请求文件
  

openssl req -new -key private/server-key.pem -out private/server.csr -subj \
"/C=CN/ST=Beijing/L=Beijing/O=Ourdark/OU=Ourdark/CN=Ourdark"

  • 使用根证书签发服务端证书
  

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem \
-CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer

  • -CA——指定CA证书的路径
  • -CAkey——指定CA证书的私钥路径
  • -CAserial——指定证书序列号文件的路径
  • -CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀

注意:这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE

  

[ v3_req ]

# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

而前面生成根证书时,使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书

  

[ v3_ca ]


# Extensions for a typical CA


# PKIX recommendation.

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid:always,issuer

# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true

在x509指令中,有多重方式可以指定一个将要生成证书的序列号,可以使用set_serial选项来直接指定证书的序列号,也可以使用-CAserial选项来指定一个包含序列号的文件。所谓的序列号是一个包含一个十六进制正整数的文件,在默认情况下,该文件的名称为输入的证书名称加上.srl后缀,比如输入的证书文件为ca.cer,那么指令会试图从ca.srl文件中获取序列号,可以自己创建一个ca.srl文件,也可以通过-CAcreateserial选项来生成一个序列号文件。


用根证书签发client端证书

与签发server端的证书的过程类似,改下参数

  • 生成客户端私钥
  

openssl genrsa -aes256 -out private/client-key.pem 1024

  • 生成证书请求文件
  

openssl req -new -key private/client-key.pem -out private/client.csr -subj \
"/C=CN/ST=Beijing/L=Beijing/O=Ourdark/OU=Ourdark/CN=Ourdark"

  • 使用根证书签发客户端证书
  

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem \
-CAserial ca.srl -in private/client.csr -out certs/client.cer

注意上方签发服务端证书时已经使用-CAcreateserial生成过ca.srl文件,因此这里不需要带上这个参数


  

ls certs/
ca.cer  client.cer  server.cer


导出证书

  • 导出客户端证书
  

openssl pkcs12 -export -clcerts -name ourdarkclient -inkey \
private/client-key.pem -in certs/client.cer -out certs/client.keystore

  • pkcs12——用来处理pkcs#12格式的证书

  • -export——执行的是导出操作

  • -clcerts——导出的是客户端证书,-cacerts则表示导出的是ca证书

  • -name——导出的证书别名

  • -inkey——证书的私钥路径

  • -in——要导出的证书的路径

  • -out——输出的密钥库文件的路径

    • 导出服务端证书
  

openssl pkcs12 -export -clcerts -name ourdarkserver -inkey \
private/server-key.pem -in certs/server.cer -out certs/server.keystore

  • 信任证书的导出
  

keytool -importcert -trustcacerts -alias www.ourdark.org \
-file certs/ca.cer -keystore certs/ca-trust.keystore


### 查看证书文件 ****
  

ls certs/
ca.cer  ca-trust.keystore  client.cer  client.keystore  server.cer  server.keystore

****