/article/2017/09/03/openssl-for-CA-and-Certificate/

基于OpenSSL的CA服务和SSL/TLS证书颁发

  • 【作者】看不见我
  • 【分类】Linux
  • 【发布】2017-09-03 20:14
  • 【更新】2018-11-04 21:23

基于OpenSSL的CA服务和SSL/TLS证书颁发

OpenSSL, SSL/TLS, CA Certificate

OpenSSL

openssl是一个开源程序的套件、这个套件有三个部分组成:

  • libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库
  • libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能
  • openssl,是个多功能linux命令行工具,它可以实现加密解密,还可以当CA来用,可以管理证书。

SSL/TLS

SSL/TLS原理详解: http://seanlook.com/2015/01/07/tls-ssl/

CA Certificate

CA和数字证书: http://seanlook.com/2015/01/15/openssl-certificate-encryption/

Linux上基于OpenSSL的CA证书服务系统

CA证书认证服务器(证书认证中心)

默认情况和CentOS和Ubuntu上都已安装好openssl。

CentOS 6.x上有关ssl证书默认的目录结构:

/etc/ssl/
     └── certs -> /etc/pki/tls/certs
/etc/pki/
     ├── CA/               # 本服务器上搭建的CA认证中心/目录。
     │   ├── certs/
     │   ├── crl/          # 吊销的证书。
     │   ├── newcerts/     # 存放CA签署(颁发)过的数字证书(证书备份目录)。
     │   └── private/      # 用于存放CA的私钥。
     ├── ca-trust/         # 存放系统信任的CA机构证书。
     └── tls/
         ├── cert.pem -> certs/ca-bundle.crt
         ├── certs/        # 系统的证书存放目录,可以放置系统自己的证书和内置证书。
         │   └── ca-bundle.crt    # Mozilla root CA 生成的X.509 CA公钥证书。
         ├── openssl.cnf   # openssl的CA主配置文件。
         └── private/      # 系统的证书私钥目录,存放系统使用的证书私钥。

Ubuntu的CA位于/etc/ssl/demoCA/

创建CA证书认证服务(Centos)

(1)修改openssl的CA的配置文件

CA要给别人颁发证书,首先自己得有一个作为根证书, 要在一切工作之前修改好CA的配置文件、序列号、索引等等。

/etc/pki/tls/openssl.cnf

# 对于自建的非权威CA认证中心,这个文件配置大部分配置使用配置比较简单。
# 这里只有配置文件的部分内容。

[ ca ]
default_ca      = CA_default            # The default ca section

# ca证书/目录相关配置
[ CA_default ]
dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.
certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

# 颁发的证书默认有效时间配置
default_days    = 5365                  # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

# 使用openssl生成证书时的一些证书信息默认值。
# 这个文件基本上配置这个就可以了,方便生成证书时的信息输入。
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = XX
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
#stateOrProvinceName_default    = Default Province
localityName                    = Locality Name (eg, city)
localityName_default    = Default City
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Default Company Ltd
# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName                      = Common Name (eg, your name or your server\'s hostname)
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64

(2)生成CA根密钥

(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

(3)生成根证书

使用openssl req命令生成自签证书:

(umask 077;openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem)
  1. 会提示输入一些内容(之前修改的openssl.cnf会在这里呈现),最好记住能与后面保持一致。
  2. 注意输入的内容,Common Name选项,需要填写CA服务器对应的IP或域名。
  3. 生成的这个cacert.pem证书文件,可以导入到客户端(用户)系统CA信任证书中,或客户端浏览器信任证书中。

(4)初始化CA的/目录文件

touch /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt
touch /etc/pki/CA/serial
echo "01" > /etc/pki/CA/serial

到此一个CA认证服务中心就创建完成了。

应用服务端(服务器)生成证书签署请求文件

应用服务端使用HTTPS或基于ssl/TLS应用需要到CA签署证书文件。

(1)应用服务端(服务器)生成ssl密钥

openssl genrsa -out server.key 2048

生成的key文件为应用服务端(服务器)私有的,需要注意保存。

(2)应用服务端(服务器)生成证书签署请求文件

openssl req -new -key server.key -out server.csr
  1. 同样会提示输入一些内容。除了Commone Name一定要是你要授予证书的服务器域名或主机名,challenge password不填。
  2. 注意输入的内容,Common Name选项,需要填写需要授予证书的服务器的域名或IP地址,challenge password不填。
  3. 如果要使用泛域名(通配符)证书,需要在Common Name选项输入通配域名(例如.baidu.com。并且注意,如果是a.b.baidu.com要写成.b.baidu.com)。
  4. 生成的csr文件只对CA签署证书有用,提供此文件CA就能根据信息完成证书签署。

CA根据应用服务端(服务器)的请求签署证书并颁发证书文件

# 生成的crt文件就是应用服务端(服务器)的证书文件,要将文件提供给应用服务端(服务器)。
openssl ca -in server.csr -out server.crt

# 指定证书有效天数:
openssl ca -in server.csr -out server.crt -days 400

注:

应用服务端(服务器)最后使用部署ssl服务时用到的文件是两个:

  • 应用服务端(服务器)生成ssl密钥key文件(server.key)。
  • CA签署后颁发的证书crt文件(server.crt)。

应用服务器拿这两个文件部署服务。

资料参考

Top