先做一个服务端单向认证,最后完成一个服务端客户端双向认证
制作一个CA私服,取名叫testca。
### 准备CA工作目录
```shell
mkdir "$HOME/testca"
cd "$HOME/testca"
mkdir newcerts private conf
chmod g-rwx,o-rwx private
echo "01" > serial
touch index.txt
```
$HOME/testca为待建CA的主目录
newcerts子目录将存放CA签署(颁发)过的数字证书(证书备份目录)
private目录用于存放CA的私钥
conf只是用于存放一些简化参数用的配置文件
serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库
### 生成根证书
#### 配置根证书
创建testca根证书配置文件及内容
```shell
vi "$HOME/testca/conf/gentestca.conf"
```
内容如下
```shell
####################################
[ req ]
default_keyfile = $ENV::HOME/testca/private/cakey.pem
default_md = md5
prompt = no
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
[ ca_distinguished_name ]
organizationName = dongnaoedu
organizationalUnitName = dongnao
commonName = ca.dongnaoedu.com
emailAddress = 805921455@qq.com
[ ca_extensions ]
basicConstraints = CA:true
########################################
```
申请根证书
```shell
cd "$HOME/testca"
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config "$HOME/testca/conf/gentestca.conf"
# req 表示发起一个证书签名请求
# -x509 用x509结构替代cert
# -nwekey rsa:2048,新建一个2048 bit的rsa秘钥
# -out 输出的证书文件
# -outform 输出的格式,DER或者PEM
# -days 有效时间2190天
# -config 请求的配置文件,这里是根证书的配置信息
```
执行过程中需要输入CA私钥的保护密码,假设我们输入密码: 123456
查看一下自己CA证书的内容
```shell
openssl x509 -in cacert.pem -text -noout
```
#### 准备根证书配置文件
方便以后用它来生成,在它下面的子证书
```shell
vi "$HOME/testca/conf/testca.conf"
```
写入文件内容
```shell
####################################
[ ca ]
default_ca = testca # The default ca section
[ testca ]
dir = $ENV::HOME/testca # top dir
database = $dir/index.txt # index file.
new_certs_dir = $dir/newcerts # new certs dir
certificate = $dir/cacert.pem # The CA cert
serial = $dir/serial # serial no file
private_key = $dir/private/cakey.pem # CA private key
RANDFILE = $dir/private/.rand # random number file
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = md5 # message digest method to use
unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
policy = policy_any # default policy
[ policy_any ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
########################################
```
单向认证
```shell
mkdir -p "$HOME/testca/test/server"
cd "$HOME/testca/test/server"
```
### 创建服务器私钥,并生成testca的证书请求文件
通过req命令,生成一个签名证书申请,使用rsa:1024生成新秘钥,申请证书为testkey.pem,格式为PEM,证书签名参数为-subj指定的内容
```shell
openssl req -newkey rsa:1024 -out serverreq.pem -keyout serverkey.pem -keyform PEM -outform PEM -subj "/O=ABCom/OU=servers/CN=servername"
# req 表示发起一个证书签名请求
# -nwekey rsa:1024,新建一个1024 bit的rsa秘钥
# -out 输出的证书请求文件
# -keyout 表示存放生成私钥的文件
# -keyform 表示生成的秘钥文件格式,这里是PEM
# -outform 输出的格式,DER或者PEM
# -subj 设置或修改请求证书签名主题
```
执行命令过程中输入密钥保护密码,我们输入:949494
serverkey.pem为的私钥,serverreq.pem为CA签名证书请求文件。
查看请求文件内容
```shell
openssl req -in serverreq.pem -text -noout
```
### CA签发证书
```shell
openssl ca -in serverreq.pem -out servercert.pem -config "$HOME/testca/conf/testca.conf"
```
执行过程中需要输入CA私钥的保护密码,前面设置的123456。
查看证书内容
```shell
openssl x509 -in servercert.pem -text -noout
```Nginx配置
找到nginx运行的配置文件,将证书servercert.pem及私钥serverkey.pem放到配置目录下,修改内容如下
```json
http {
# 配置https服务
server {
# 开启443端口,ssl安全协议
listen 443 ssl;
server_name localhost;
# 配置证书及服务器私钥
ssl_certificate servercert.pem;
ssl_certificate_key serverkey.pem;
# 会话参数的缓存,所有工作进程之间共享的缓存
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 启用的密码
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# SSLv3和TLS协议时,服务器密码优先于客户端密码
ssl_prefer_server_ciphers on;
location / {
root /data/www/;
index welcome.html;
}
}
}
```