在加密中,证书颁发机构或证书颁发机构(CA)是颁发数字证书的实体。数字证书通过证书的指定主题来证明公钥的所有权。这允许其他人(依赖方)依赖签名或关于与经认证的公钥对应的私钥的断言。CA充当受信任的第三方 -由证书的主体(所有者)和依赖证书的一方信任。这些证书的格式由X.509标准指定。
证书颁发机构的一个特别常见的用途是签署HTTPS中使用的证书,这是万维网的安全浏览协议。另一个常见用途是由国家政府签发身份证,用于电子签名文件。
实验环境
IP 192.168.253.128
系统 Centos7
openssl的配置文件为/etc/pki/tls/openssl.cnf
下面为截取的部分,对自建CA比较关键的一些信息部分
[ CA_default ]
dir = /etc/pki/CA # CA存放的目录
certs = $dir/certs # 保存签入数字证书的目录
crl_dir = $dir/crl # 证书吊销列表存放的目录
database = $dir/index.txt # 数据库索引文件
new_certs_dir = $dir/newcerts # 用于存放新证书存放的位置 certs.
certificate = $dir/cacert.pem # 自签证书
serial = $dir/serial # 序列号文件
crlnumber = $dir/crlnumber # 当前crl(证书吊销列表)序列号
private_key = $dir/private/cakey.pem# CA自己的私钥
[ req ]
default_bits = 2048 #生成证书请求用到的私钥的密钥长度
default_md = sha256 #证书请求签名时的单项加密算法
default_keyfile = privkey.pem #默认新创建的私钥存放位置
distinguished_name = req_distinguished_name #可识别字段
在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需要的目录及文件即可;具体如下
a.生成私钥,大小为4096bit,因为私钥是一个很重要的文件,所以权限一定要严格,这里用括号是创建子进程,设置umask,不影响当前进程的umask。这里的私钥文件/etc/pki/CA/private/cakey.pem在配置文件定义了,不能随便更改
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
b.生成自签证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 > /etc/pki/CA/serial
创建后的目录结构
[root@localhost ~]# tree /etc/pki/CA
/etc/pki/CA
├── cacert.pem
├── certs
├── crl
├── index.txt
├── newcerts
├── private
│ └── cakey.pem
└── serial
安装nginx服务这里不是重点,简单安装一下
上传之前下载好的nginx的tar包
cd /usr/local/src/
useradd -M -s /sbin/nologin nginx
yum install pcre pcre-devel openssl openssl-devel gcc gcc-devel -y
tar -zxf nginx-1.14.0.tar.gz
cd nginx-1.14.0
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=nginx --group=nginx
make
make install
PATH="/usr/local/nginx/sbin:$PATH"
echo 'PATH="/usr/local/nginx/sbin:$PATH"' > /etc/profile.d/nginx.sh
a.用到证书的主机(这里的主机与CA为相同的服务器)生成私钥;
mkdir /usr/local/nginx/ssl
cd /usr/local/nginx/ssl
(umask 077; openssl genrsa -out /usr/local/nginx/ssl/nginx.key 2048)
b.生成证书签署请求
openssl req -new -key /usr/local/nginx/ssl/nginx.key -out /usr/local/nginx/ssl/nginx_ssl.csr -days 365
c.将请求通过可靠方式发送给CA主机(scp或者u盘等都可以)因为我这里都在同一台主机,所以没有这个步骤
d.在CA主机上签署证书;/usr/local/nginx/ssl/nginx_ssl.csr 这个文件是刚才我们生成的证书签署请求,/usr/local/nginx/ssl/nginx_ssl.crt这个文件是我们需要的证书
openssl ca -in /usr/local/nginx/ssl/nginx_ssl.csr -out /usr/local/nginx/ssl/nginx_ssl.crt
e.查看证书中的信息,验证一下
openssl x509 -in /usr/local/nginx/ssl/nginx_ssl.crt -noout -serial -subject
这里用nginx配置
server {
listen 443 ssl; ##监听443端口
server_name www.hal.com; ##与证书匹配的域名
ssl on; ##允许ssl连接
ssl_certificate /usr/local/nginx/ssl/nginx_ssl.crt;#证书的路径
ssl_certificate_key /usr/local/nginx/ssl/nginx.key;#web服务器私钥路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
测试一下配置文件有没有问题
[root@localhost ssl]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
关闭防火墙和selinux然后启动nginx
systemctl stop firewalld
setenforce 0
nginx
因为这个域名没有买,所以需要在本地做一个解析
修改这个目录C:\Windows\System32\drivers\etc下的hosts文件添加一条记录
然后用浏览器访问,因为是私人的CA所以浏览器提示不安全很正常,这里可以在设置那里将CA的自签证书导入就可以了,这里不导了
a.客户端获取要吊销的证书的serial(在使用证书的主机执行):
openssl x509 -in /usr/local/nginx/ssl/nginx_ssl.crt -noout -serial -subject
b. CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
c.吊销
格式:openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要换成证书真正的序列号;在吊销证书的第一步得到的那个serial编码是01 所以需要变成下面这条命令
openssl ca -revoke /etc/pki/CA/newcerts/01.pem
d.生成吊销证书的吊销编号(第一次吊销证书时执行)
echo 01 > /etc/pki/CA/crlnumber
e.更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/newcerts/01.pem