基于OpenSSL的https的Nginx反向代理
- 使用openssl实现 --》先安装openssl
- 单向验证
- 1. 产生不带密码保护的私钥
- 2. 产生构造证书请求
- 3. 自签发根CA证书
- 4. 在后面遇到了报错,https访问不成功,解决办法
- 5. 修改nginx配置文件,开启https访问
- 6. 重启nginx
- 7. 测试
- 双向验证
- 1. 制作根证书
- 2. 制作服务端证书
- 3. 制作客户端证书 (跟制作服务端证书步骤一样)
- 4. 将ca证书追加到 /etc/pki/tls/certs/ca-bundle.crt
- 5. 配置nginx
- 6.本地浏览器导入p12格式的证书
- 7. 测试
使用openssl实现 --》先安装openssl
yum install openssl -y
单向验证
1. 产生不带密码保护的私钥
openssl genrsa -out nginx.key 1024
2. 产生构造证书请求
openssl req -new -key nginx.key -out nginx.csr
3. 自签发根CA证书
根CA的证书是自己签发的,通过x509命令进行自签发:
openssl x509 -req -in nginx.csr -signkey nginx.key -out nginx.pem
4. 在后面遇到了报错,https访问不成功,解决办法
(可以先跳过这一步,报错了再回来,不然你不知道为什么)
- 将签发该证书的私有CA公钥cacert.pem文件内容(本人生成的是nginx.pem),追加到
/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
- 或者:
cd /etc/pki/tls/certs/
cp ca-bundle.crt ca-bundle.crt.bk --》先备份
cat /usr/local/sczoupeng99/conf/https/nginx.pem >> ca-bundle.crt
5. 修改nginx配置文件,开启https访问
......
......
#定义一个负载均衡器,名字scapp
upstream scapp{
server 192.168.2.152;
server 192.168.2.153;
}
......
......
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/local/sczoupeng99/conf/https/nginx.pem;
ssl_certificate_key /usr/local/sczoupeng99/conf/https/nginx.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;
}
}
6. 重启nginx
nginx -s reload
7. 测试
curl https://192.168.76.129
浏览器测试
双向验证
1. 制作根证书
- 生成CA私钥:ca.key
(这个是信任的起点,根证书,所有其他的证书都要经过CA的私钥签名)openssl genrsa -des3 -out ca.key 2048
- 生成 CA根证书的公钥:ca.crt
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
2. 制作服务端证书
- 生成证服务端书私钥:server.pem
openssl genrsa -des3 -out server.pem 1024
- 生成无密码的服务端私钥:server.key
openssl rsa -in server.pem -out server.key
- 生成服务端签发请求:server.csr
openssl req -new -key server.pem -out server.csr
- 最后用CA证书给服务端证书进行签名
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
- 把ca.crt的内容追加到server.crt后面,因为有些浏览似乎不支持
cat ca.crt >> server.crt
3. 制作客户端证书 (跟制作服务端证书步骤一样)
- 生成客户端证书私钥
openssl genrsa -des3 -out client.pem 2048
- 生成客户端证书签发请求
openssl req -new -key client.pem -out client-req.csr
- 用CA证书给客户端证书进行签名
openssl x509 -req -sha256 -in client-req.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt
- 客户端证书CRT转换为PKCS
#12格式(全称应该叫做 Personal Information Exchange,通常以 p12作为后缀) --》浏览器用的openssl pkcs12 -export -clcerts -in client.crt -inkey client.pem -out zoup.p12
4. 将ca证书追加到 /etc/pki/tls/certs/ca-bundle.crt
(前面提到过的报错解决方法)
cd /etc/pki/tls/certs/
cp ca-bundle.crt ca-bundle.crt.bk
cat /usr/local/sczoupeng99/conf/https/server.crt >> ca-bundle.crt
5. 配置nginx
......
......
#定义一个负载均衡器,名字scapp
upstream scapp{
server 192.168.2.152;
server 192.168.2.153;
}
......
......
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/local/sczoupeng99/conf/https/server.crt;
ssl_certificate_key /usr/local/sczoupeng99/conf/https/server.key;
ssl_verify_client on; #开启客户端给验证
ssl_client_certificate /usr/local/sczoupeng99/conf/https/ca.crt; #CA证书用于验证客户端证书的合法性
ssl_verify_depth 1;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://zpapp;
}
}
6.本地浏览器导入p12格式的证书
将第三步中生成的客户端证书 zp.p12 传入本地机器并导入浏览器
浏览器–》设置–》安全/隐私–》证书管理–》导入–》个人
7. 测试
验证双向认证是否成功
浏览器访问