前言
https 相较于 http 而言有很大的安全性,当我们一个服务开启 https 并与之通信时,往往需要证书的认证,如果是浏览器访问服务,只要在浏览器内设置信任证书即可,而如果是程序内访问服务(如 java 程序),则需要导入该服务的证书所信任的证书。
实际情况中,内部系统的互相通信使用 https,往往不可能向公有 CA 申请证书(申请证书需要很高的费用),故我们需要创建一个私有 CA 来申请证书实现 https 通信。
名词介绍
CA 和证书认证
详见我的一篇博文:https 简单解读
实现步骤
环境介绍
64 位 centos 7.X 操作系统
装有 openssl 命令
构建私有 CA
CA 要给别人签发证书,首先自己得有一个作为根证书,我们得在一切工作之前修改好 CA 的配置文件、序列号、索引等等。
输入以下命令更改配置文件:
vi /etc/pki/tls/openssl.cnf
配置文件更改以下部分:
[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
…
default_days = 3650 # how long to certify for
…
# For the CA policy
[policy_match]
countryName = match
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
在 /etc/pki/CA 目录创建两个文件 index.txt 和 serial:
cd /etc/pki/CA && touch index.txt serial && echo 01 > serial
仍在当前目录下生成一个 CA 私钥 cakey.pem 和自签证书 cacert.pem:
openssl genrsa -out private/cakey.pem 2048
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
生成公钥的时候会提示输入一些信息,例子如下:
Country Name (2 letter code) []:CN #国家名
State or Province Name (full name) []:hangzhou #省份名
Locality Name (eg, city) []:hangzhou #地名
Organization Name (eg, company) []:company #公司名
Organizational Unit Name (eg, section) []:unit #部门名
Common Name (eg, your websites domain name) []:localhost #服务域名
Email Address []: #电子邮件
后面一些信息可按回车略过
这里比较重要的是 Comman Name 填写的是服务的域名地址,即如果该证书用于某个服务则填该服务的域名地址(如用于百度服务器,则填写 www.baidu.com)
本方案的 CA 证书不用于某个服务,故可填 localhost
私有 CA 签署证书
为一个服务生成私钥 server.key 和一个证书请求文件 server.csr:
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
生成证书请求文件时,仍会提示输入一些信息,例子如下:
Country Name (2 letter code) []:CN #国家名
State or Province Name (full name) []:hangzhou #省份名
Locality Name (eg, city) []:hangzhou #地名
Organization Name (eg, company) []:company #公司名
Organizational Unit Name (eg, section) []:unit #部门名
Common Name (eg, your websites domain name) []:XXX.XXX.XXX #服务域名
Email Address []: #电子邮件
这里的 Common Name 就应该填你实际服务所用的域名了
下面将该证书请求文件 server.csr 由你构建的私有 CA 签署,生成一个 server.crt 证书:
openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out server.crt
到此为止,server.crt 证书可用于服务提供 https 访问,客户端若想访问该服务,导入 CA 根证书 cacert.pem 即可。