本文将着重介绍从ssl证书申请到搭建yum使用https双向认证完成rpm包安装的流程,具体https双向认证的原理在这不做详细的描述,认证的详细描述的原理可以参考: https://blog.csdn.net/duanbokan/article/details/50847612
以下是详细流程:
一. 申请证书
1. 搭建自己的CA服务器
制作本地的CA:
/etc/pki/CA目录,就是CA默认的工作目录
/etc/pki/tls/openssl.conf 是openssl的配置文件
/etc/pki/CA/private 存放我们自己建的CA的私钥
cd /etc/pki/tls
vi openssl.conf
找到[ CA_default ]行:
把"dir = ../../CA"改为"dir = /etc/pki/CA,即把我们CA的工作目录使用绝对路径来定义
cd /etc/pki/CA
(umask 077; openssl genrsa 2018 > private/cakey.pem)
创建这个文件,并直接更改它的权限;文件的名字是固定的,配置文件中定义好的,cakey.pem是用于存放CA自己的私钥,CA虽然是授权的发证单位,但自己也要有私钥来实现数字签名,来区分不同的CA
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
会自动提取到公钥,创建cacet.pem这个证书,这个证书是CA本身的证书,格式为x509。以后CA就可以给别人发证了。
req:申请证书
-new:表示是新发的申请
-x509:指定我们的CA证书的格式
-key:指定一个私钥文件
-out:从我们知道的私钥中提取公钥信息,并保存至cacert.pem文件中
-days:指定证书的有效期
命令执行之后会出现这些信息让填入:
第一个:我们要创建的CA所在的国家,两个字符
第二个:我们要创建的CA所在的省份
第三个:我们要创建的CA所在的城市
第四个:我们要创建的CA的公司名称
第五个:CA申请者所在的部门
第六个:我们要创建的CA服务器
第七个:我们要创建的CA的邮箱
mkdir certs crl newcerts
certs 为所签证书的目录
crl为 所吊销的证书的目录
newcerts 要签的新证书的目录
touch index.txt serial crlnumber
echo 01 > serial
echo 01 > crlnumber
通过这几个步骤,我们创建了CA必须的几个文件,至此我们的CA服务器就建好了
2. 申请服务端公钥及证书
生成服务端key server.key
openssl genrsa -out server.key 1024
生成服务端请求文件 server.csr
openssl req -new -out server.csr -key server.key
填入证书配置信息:
Country Name (2 letter code) [AU]:cn 国家名(2个字母的代号)
State or Province Name (full name) [Some-State]:cq 省
Locality Name (eg, city) []:cq 市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:gs 公司名
Organizational Unit Name (eg, section) []:gs 组织或部门名
Common Name (eg, YOUR name) []:test.com 域名(尽量用服务器域名,不然会引起服务器警告)
Email Address []: 邮箱地址
A challenge password []:123456 密码
An optional company name []:gs 公司名
生成服务端证书server.cer
openssl x509 -req -in server.csr -out server.cer -signkey server.key -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -days 3650
3. 生成客户端公钥及证书
生成客户端key client.key:
openssl genrsa -out client.key 1024
生成客户端请求文件client.csr
openssl req -new -out client.csr -key client.key
填入证书配置信息:
Country Name (2 letter code) [AU]:cn 国家名(2个字母的代号)
State or Province Name (full name) [Some-State]:cq 省
Locality Name (eg, city) []:cq 市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:gs 公司名
Organizational Unit Name (eg, section) []:gs 组织或部门名
Common Name (eg, YOUR name) []:tyl 签发机构\开发者人员(这里随意)
Email Address []: 邮箱地址
A challenge password []:123456 密码
An optional company name []:gs 公司名
生成客户端证书 client.cer:
openssl x509 -req -in client.csr -out client.cer -signkey client.key -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -days 3650
生成客户端p12格式根证书client.p12(可弄可不弄):
openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12
二.搭建一个nginx 服务器:
把步骤一中生成的服务器公钥server.key以及证书server.crt放置/etc/nginx/conf.d目录下。
创建一个repo源,以/usr/local/test目录为根目录,首先我在/usr/local/test目录下弄了两个rpm包:
yumdownloader lrzsz-0.12.20-36.el7.x86_64
yumdownloader logstash-5.6.5.rpm
创建repo源
createrepo /usr/local/test
在/etc/nginx/conf.d下创建一个test_yum.repo文件:
server {
listen 443 ssl;
ssl on;
ssl_certificate conf.d/server.crt;
ssl_certificate_key conf.d/server.key;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
# 开启客户端认证
ssl_client_certificate cacert.pem;
ssl_verify_client on;
server_name test.yum.com;
index index.php index.html index.htm;
location / {
root /usr/local/test;
}
}
检查nginx语法是否有问题:
nginx -t
重新加载nginx配置文件
nginx -s reload
三. yum repo测试
找一台测试机,绑定域名解析,在Linux系统下,可直接在/etc/hosts文件中添加域名到nginx机器ip的指定,以便于寻找到我们刚才搭建的nginx服务器。
在/etc/yum.repos.d目录下添加一个repo配置文件localyum.repo:
[localyum]
name=localyum
baseurl=https://test.yum.com/
failovermethod=priority
enabled=1
gpgcheck=0
sslverify=1
sslclientcert=/root/test/ssl/client/client.cer
sslclientkey=/root/test/ssl/client/client.key
sslcacert=/etc/pki/CA/cacert.pem
baseurl填写https:// 加上证书申请时申请的域名test.yum.com
sslclientcert填写客户端的证书
sslclientkey填写客户端的公钥
sslcacert填写颁发证书的CA服务器的证书
清空yum的cache数据:
yum clean all
查询yum 可用rpm 包:
yum provides lrzsz
查到以下结果:
可以看到yum的确是检索到我们设置的yum源了,并且在该源中查到了我们自己添加的lrzsz的rpm包。
结束!!!