为了完成实验以及不同电脑虚拟机不同,索性买了一个腾讯云的服务器,学生价,很便宜。
实验环境:CentOS7.5,Apache 2.4.6 OpenSSL 1.0.2k
理论知识
Http和Https的区别略
Https建立流程如下图(图源郭老师知乎)
大概流程:
- CA服务器生成自己的密钥对,并颁发给自己一个证书(根证书)
- 在浏览器中加入此根证书,即信任由该机构颁发的证书
- 网站服务器生成自己的密钥对,将自己的域名等验证信息、公钥生成一个csr文件,作为请求发送给CA服务器,CA服务器验证无误之后,CA的私钥对网站发送给自己的信息加密,生成该网站的证书颁发给该网站服务器
- 网站成功获取证书
- 客户机访问该https网站
- 网站将自己的证书发送给客户机
- 客户机查看证书颁发机构,从自己的证书库中查找有无该证书颁发机构的根证书
- 使用根证书中的公钥对网站所发送证书进行验证,核实网站服务器的身份和域名等信息是否有误
- 验证无误,与服务器进行协商通信加密方式
- 开始通信
搭建实验环境
安装apache、PHP、MySQL(此实验用不到)、ssl模块(mod_ssl)、openssl
略
配置CA
查看CA配置文件 /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
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha256 # use SHA-256 by default
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
为了简单一点,直接使用默认配置,不做改动。
生成根证书
在/etc/pki/CA中,默认初始化有四个空文件夹,如果没有,请创建。
创建数据库index.txt和序列号文件serial,并给serial一个初始值01
使用openssl生成一个密钥对,存放在private文件中(对应配置文件中要求)
生成证书请求,并自签证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
req 生成证书请求命令
-new 生成新证书请求
-x509 采用x509格式标准
-key 所使用的密钥对
-days 证书有效期
-out 证书保存路径
在该命令后,需要输入国家、省份、城市、组织名、部门名、服务器名和Email
至此,CA根证书颁发完成。
网站服务器向CA请求认证
创建目录,存放网站的密钥对和证书
使用openssl生成密钥对
生成证书请求文件csr
openssl req -new -key httpd.key -days 365 -out httpd.csr
需要输入国家、省份、城市、组织名(与根证书组织名相同)、部门名、主机名(十分关键,即域名)、Email
主机名中,如果想通过IP直接访问,即填IP地址,如果有域名,即填域名;
如果想通过修改hosts文件的方式通过域名访问,需要使用一个没有备案的域名,本例中采用www.alskjdfqorewasd.com
至此,生成了一个csr文件(Certificate Signing Request),将此证书请求发送给CA,生成证书颁发给服务器,在此采用最简单的方式
显示该证书请求中的关键信息,确认后两次键入y,将生成证书发动到-out后面的参数中
至此,网站服务器已经成功获取到由CA发送的证书。
查看CA中的数据库index.txt,已经有了数据,并在newcerts中有了一个新的证书文件
修改apache的证书和密钥对配置
查看/etc/httpd/conf.d/ssl.conf,找到SSLCertificateFile和SSLCertificateKeyFile,分别将后面的参数修改为ssl目录中的httpd.crt和httpd.key,并保存。
重启httpd服务
systemctl restart httpd.service
如果有报错,显示httpd服务无法正常重启,有可能是证书和密钥指向的位置不对,或者之前哪一步有错误,认真检查。
在客户机测试
采用本地Windows系统做测试,使用火狐浏览器
因为生成证书时使用的是映射域名,所以修改C:\Windows\System32\drivers\etc下的hosts文件,在最后加上一行
服务器IP地址 www.alskjdfqorewasd.com
使用浏览器打开https://www.alskjdfqorewasd.com,显示如下
浏览器告诉我们说这个网站是自签名的,火狐不信任这个网站,证书颁发者未知,此时只需要将CA的根证书导入到浏览器中即可
- 将服务器上的/etc/pki/CA/cacert.pem拷贝至本地
- 火狐浏览器右上角三道杠-选项-隐私与安全-证书-查看证书
- 证书颁发机构-导入
- 选择cacert.pem文件,两项全打勾,确认导入
可点击查看,查看CA根证书中的详细信息。
重新刷新网站,成功访问。
可通过点击地址栏左侧小锁,安全连接>查看更多信息-查看证书来查看网站的证书详细信息。
HTTPS服务器搭建完成。