key:私钥
csr:证书申请文件,生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。
crt:证书
1.创建服务器私钥
2.生成证书请求文件并发送给证书颁发机构(自签代替)获取证书
3.部署
openssl genrsa -out server.key 2048 #rsa算法 2048长度
#openssl genrsa -des3 -out server.key 2048 #-des3可选,为server.key设置密码,后续用到此文件时要输入密码
openssl req -new -key server.key -out server.csr
此步骤由自制根证书签名代替,步骤如下:
openssl genrsa -out ca.key 2048
openssl req -new -x509 -sha256 -days 365 -key ca.key -out ca.crt
#填写信息的时候CN项(Common Name (e.g. server FQDN or YOUR name))填写本机的hostname即可
#它代表颁发者
#其实上述命令可拆分成两条命令理解
#1.生成证书请求
#openssl req -new -key ca.key -out ca.csr
#2.自签署
#openssl x509 -req -sha256 -days 365 -in ca.csr -signkey ca.key -out ca.crt
将待部署服务器上生成的请求文件(csr)拿过来
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt \
-CAkey ca.key -CAcreateserial -out server.crt
特别注意:上述命令生成的证书使用后,浏览器还是会报错:NET::ERR_CERT_COMMON_NAME_INVALID
解决办法:创建文本文件ext.conf,内容如下:
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.110.160
#如果是域名
#DNS.1=www.test.com
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt \
-CAkey ca.key -CAcreateserial -out server.crt -extfile ext.conf
生成的server.crt即为服务器所需的证书
安装好nginx,修改配置/etc/nginx/nginx.conf
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /userdata/caTest/server/server.crt;
ssl_certificate_key /userdata/caTest/server/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
nginx重载配置或重启服务,服务器部署完成。
下载ca.crt,并安装。
将ca证书添加信任后,所有由此ca签名的server都会被信任,无需重复添加。
至此,所有配置完成。
效果图:
openssl genrsa -out client-key.key 2048
openssl req -new -out client-req.csr -key client-key.key
openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 365
#生成客户端p12格式根证书(密码设置)
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /userdata/caTest/server/server.crt;
ssl_certificate_key /userdata/caTest/server/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#客户端认证
ssl_client_certificate /userdata/caTest/ca/ca.crt;
ssl_verify_client on;
location / {
root html;
index index.html index.htm;
}
}
下载client.p12到客户端,导入到浏览器。
设置->安全 ->证书管理->个人->导入->client.p12