先做一個(gè)服務(wù)端單向認(rèn)證,最后完成一個(gè)服務(wù)端客戶端雙向認(rèn)證
制作一個(gè)CA私服,取名叫testca。
### 準(zhǔn)備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簽署(頒發(fā))過的數(shù)字證書(證書備份目錄)
private目錄用于存放CA的私鑰
conf只是用于存放一些簡(jiǎn)化參數(shù)用的配置文件
serial和index.txt分別用于存放下一個(gè)證書的序列號(hào)和證書信息數(shù)據(jù)庫(kù)
### 生成根證書
#### 配置根證書
創(chuàng)建testca根證書配置文件及內(nèi)容
```shell
vi "$HOME/testca/conf/gentestca.conf"
```
內(nèi)容如下
```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 = [email protected]
[ ca_extensions ]
basicConstraints = CA:true
########################################
```

申請(qǐng)根證書
```shell
cd "$HOME/testca"
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config "$HOME/testca/conf/gentestca.conf"
# req 表示發(fā)起一個(gè)證書簽名請(qǐng)求
# -x509 用x509結(jié)構(gòu)替代cert
# -nwekey rsa:2048,新建一個(gè)2048 bit的rsa秘鑰
# -out 輸出的證書文件
# -outform 輸出的格式,DER或者PEM
# -days 有效時(shí)間2190天
# -config 請(qǐng)求的配置文件,這里是根證書的配置信息
```
執(zhí)行過程中需要輸入CA私鑰的保護(hù)密碼,假設(shè)我們輸入密碼: 123456
查看一下自己CA證書的內(nèi)容
```shell
openssl x509 -in cacert.pem -text -noout
```
#### 準(zhǔn)備根證書配置文件
方便以后用它來生成,在它下面的子證書
```shell
vi "$HOME/testca/conf/testca.conf"
```
寫入文件內(nèi)容
```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
########################################
```

單向認(rèn)證
```shell
mkdir -p "$HOME/testca/test/server"
cd "$HOME/testca/test/server"
```
### 創(chuàng)建服務(wù)器私鑰,并生成testca的證書請(qǐng)求文件
通過req命令,生成一個(gè)簽名證書申請(qǐng),使用rsa:1024生成新秘鑰,申請(qǐng)證書為testkey.pem,格式為PEM,證書簽名參數(shù)為-subj指定的內(nèi)容
```shell
openssl req -newkey rsa:1024 -out serverreq.pem -keyout serverkey.pem -keyform PEM -outform PEM -subj "/O=ABCom/OU=servers/CN=servername"
# req 表示發(fā)起一個(gè)證書簽名請(qǐng)求
# -nwekey rsa:1024,新建一個(gè)1024 bit的rsa秘鑰
# -out 輸出的證書請(qǐng)求文件
# -keyout 表示存放生成私鑰的文件
# -keyform 表示生成的秘鑰文件格式,這里是PEM
# -outform 輸出的格式,DER或者PEM
# -subj 設(shè)置或修改請(qǐng)求證書簽名主題
```
執(zhí)行命令過程中輸入密鑰保護(hù)密碼,我們輸入:949494
serverkey.pem為的私鑰,serverreq.pem為CA簽名證書請(qǐng)求文件。
查看請(qǐng)求文件內(nèi)容
```shell
openssl req -in serverreq.pem -text -noout
```
### CA簽發(fā)證書
```shell
openssl ca -in serverreq.pem -out servercert.pem -config "$HOME/testca/conf/testca.conf"
```
執(zhí)行過程中需要輸入CA私鑰的保護(hù)密碼,前面設(shè)置的123456。
查看證書內(nèi)容
```shell
openssl x509 -in servercert.pem -text -noout
```Nginx配置
找到nginx運(yùn)行的配置文件,將證書servercert.pem及私鑰serverkey.pem放到配置目錄下,修改內(nèi)容如下
```json
http {
# 配置https服務(wù)
server {
# 開啟443端口,ssl安全協(xié)議
listen 443 ssl;
server_name localhost;
# 配置證書及服務(wù)器私鑰
ssl_certificate servercert.pem;
ssl_certificate_key serverkey.pem;
# 會(huì)話參數(shù)的緩存,所有工作進(jìn)程之間共享的緩存
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協(xié)議時(shí),服務(wù)器密碼優(yōu)先于客戶端密碼
ssl_prefer_server_ciphers on;
location / {
root /data/www/;
index welcome.html;
}
}
}
```