先做一個服務端單向認證,最后完成一個服務端客戶端雙向認證
制作一個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 = [email protected]
[ 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;
}
}
}
```