本文将介绍关于CA Server的相关内容。CA Server搭建与自签名证书创建,实体认证与证书颁发,服务器证书申请与导入。
另外,证书申请后,想要进行应用,还需要配置服务器的HTTPS。
CA Server initialize
本文使用easy-rsa
工具(GitHub repo)进行CA Server的配置与维护,easy-rsa
是基于shell的CA管理工具,可以方便进行CA的管理和基本操作。
-
下载repo release后,将其移动到适合位置,这里选择
/opt/easy-rsa
。并选取合适目录权限 -
进入目录,初始化
pki
cd easy-rsa
./easyrsa init-pki
配置 vars
vars
是基本CA服务器配置文件,新版配置文件被放入pki
目录中,需要另行修改
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Shang Hai"
set_var EASYRSA_REQ_CITY "Shang Hai"
set_var EASYRSA_REQ_ORG "Zheng's Studio"
set_var EASYRSA_REQ_EMAIL "hz1624917200@outlook.com"
set_var EASYRSA_REQ_OU "My Organizational Unit"
生成CA根证书
./easyrsa build-ca
生成CA根证书ca.crt
,此证书是CA的凭证,所有该CA签署的证书都需要该根证书证明
将ca.crt
取出,分发给服务器和客户端。服务器需要CA证书作为信任链,客户端需要信任CA根证书。
Linux 安装证书
将crt
证书移动到/usr/local/share/ca-certificates
下,更新证书
sudo update-ca-certificates
更新后的证书可以在/etc/ssl/certs
中查到(仅软链接)
Windows 安装证书
双击证书,点击install
,安装在Trusted Root Certification Authorities
.这一步非常关键,Windows将给予该CA机构根信任,该机构签发的所有证书都将被系统信任。
证书申请与颁发
服务器密钥对生成
在申请证书前,需要先生成证书的目标公钥,使用openssl工具生成密钥对。
openssl genrsa -out <key_name>.key
密钥请妥善保存,若遗失则证书将不再有保护作用,需要申请撤销
申请证书
Attention: 在申请证书前,需要添加DNS请求字段,否则将出现证书域名不匹配,会被浏览器拦截。
我们将在下文中看到如果不添加字段的后果,如果想避免重新申请和颁发证书,请照做
在openssl.conf
文件中,(位置不完全相同,笔者的文件在/etc/ssl
中),增加如下信息:
...
[ req ]
...
req_extentions = v3_req
[ v3_req ]
...
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = domain1
DNS.2 = domain2
- 在
DNS.x
字段后添加认证的域名,可以添加多个
然后执行如下指令,创建申请
sudo openssl req -new -key <key_name>.key -out <request_name>.req
- openssl会询问关于证书的详细信息,这些信息将被写入证书中
- 生成完毕后,查看证书请求信息
sudo openssl req -text -noout -in <req_name>.req
将请求文件传输给CA Server,准备颁发
证书签署
使用easy-rsa
维护证书实体和申请等信息
./easyrsa import-req <req_name> <entity_name>
req_name
: 请求文件名entity_name
: 将录入数据库的实体名称
使用sign-req
命令签署证书
./easyrsa sign-req server <entity_name>
生成文件位于./pki/issued/<entity_name>.crt
在Windows上查看证书:
- 此证书不需要安装,因为已经安装有根证书,此证书已经被信任
在Linux上查看证书:
sudo openssl x509 -in <cert_name> -noout -text
- 可以在Linux上安装证书,以后Apache调用证书直接使用安装位置
Apache2 配置 HTTPS
启用 module
启用ssl module
sudo a2enmod ssl
查看模块信息
sudo a2query -m
配置站点
在 /etc/apache2/sites-available
下,新建站点(也可以直接修改默认站点)
原先自带两个站点配置文件,000-default.conf
, default-ssl.conf
将两个配置文件合并为新的配置文件,继续修改(需要同时配置80和443的端口,可以使用echo合并,自行操作)
<VirtualHost *:443>
ServerAdmin ...
ServerName ...
DocumentRoot ...
...
SSLCertificateFile /path/to/server/certificate
SSLCertificateKeyFile /path/to/server/certificate/key
SSLCertificateChainFile /path/to/server/certificate/chain
...
</VirtualHost>
配置HTTP协议的重定向,在Virtual Host 80中,添加重定向配置
Redirect permanent / https://<https_server_name>
SSLCertificateFile
: 服务器证书文件目录SSLCertificateKeyFile
: 证书对应私钥SSLCertificateChainFile
:证书链文件,包含从根证书(需要客户端信任)到服务器证书的证书链(本样例中只有单层,故使用CA证书路径,也可以配置在SSLCACertificateFile
中)
启用站点
sudo a2dissite 000-default.conf
sudo a2ensite site_name.conf
sudo service apache2 restart
测试
成功完成HTTPS配置!
通过Burpsuite可以观察到正确的重定向操作
通过浏览器,可以看到证书的详情页面
问题说明
unissued cert error
浏览器报错,Peer's Certificate issuer is not recognized
,此类在Firefox上会出现
因为Firefox自行管理证书系统,需要将CA根证书导入Firefox中解决。
bad cert domain
为了增强证书安全性,RFC规定将证书的Alt Name作为DNS域, 只有证书与域名相匹配,才能认为证书合法。这也是申请证书中需要配置openssl.conf
的原因。如果遇到这个问题,需要重新进行证书申请,并附带DAN信息。