翼度科技»论坛 云主机 服务器技术 查看内容

https如何通过nginx完成双向认证转发

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
https 单向认证和双向认证

具体可以看看这篇文章 https双向认证,写的很详细和形象

  • 单向认证


  • 双向认证


生成自签证书、服务端证书和客户端证书

具体可以看这篇文章 Nginx配置ssl双向认证
1.CA 与自签名
  1. # 生成CA私钥,会让你输自定义密码(例:000000)
  2. openssl genrsa -aes256 -out ca.key 2048

  3. # 制作CA公钥/根证书
  4. openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
  5. # 输入CA密码:000000
  6. # Common Name 随意填写(test.com);其它随意
复制代码
2.服务端证书(server.client server.key)
  1. # 生成服务器私钥(.pem文件),会让你输自定义密码(例:111111)
  2. openssl genrsa -aes256 -out server.pem 1024
  3. # .pem文件转换.key文件
  4. openssl rsa -in server.pem -out server.key
  5. # 输入Server密码:111111

  6. # 生成签发请求
  7. openssl req -new -key server.pem -out server.csr
  8. # 输入Server密码:111111
  9. # Common Name填写自己的ip地址即可,其他随意

  10. # 用CA签发证书
  11. openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
  12. # 输入CA密码:000000
复制代码
3.客户端证书(client.client client.key)
  1. # 生成客户端私钥(.pem文件),会让你输自定义密码(例:222222)
  2. openssl genrsa -aes256 -out client.pem 1024
  3. # .pem文件转换.key文件
  4. openssl rsa -in client.pem -out client.key
  5. # 222222

  6. # 生成签发请求
  7. openssl req -new -key client.pem -out client.csr
  8. # 输入Client密码:222222
  9. # Common Name填写自己的ip地址即可,其他随意

  10. # 用CA签发证书
  11. openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt
  12. # 输入CA密码:000000

  13. # 使用浏览器访问时,需要生成p12格式的客户端证书,会让你输入自定义密码(例:123456)
  14. openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
复制代码
服务端使用 https 进行通信,并使用双向认证
  1. const express = require("express");
  2. const https = require("https");
  3. const fs = require("fs");
  4. const app = express();
  5. const PORT = 7000;
  6. const options = {
  7.   key: fs.readFileSync("./ssl/server.key"),
  8.   cert: fs.readFileSync("./ssl/server.crt"),
  9.   ca: [fs.readFileSync("./ssl/ca.crt")],
  10.   requestCert: true,
  11.   rejectUnauthorized: true,
  12. };

  13. https
  14.   .createServer(options, app)
  15.   .listen(PORT, () => console.log(`App listening on port ${PORT}!`));

  16. app.get("/v1", (req, res) => res.send("Hello World!"));
复制代码
配置 nginx,进行转发
  1. server {
  2.     listen       8080;
  3.     server_name  localhost;

  4.     location /api {
  5.         proxy_ssl_certificate ssl/client.crt;
  6.         proxy_ssl_certificate_key ssl/client.key;
  7.         # client-pw.txt 里面是Client密码:222222
  8.         proxy_ssl_password_file ssl/client-pw.txt;
  9.         proxy_pass https://localhost:7000/v1;

  10.     }
  11.     error_page   500 502 503 504  /50x.html;
  12.     location = /50x.html {
  13.         root   html;
  14.     }
  15. }
复制代码
测试


  • 直接使用浏览器访问 https://loalhost:7000/v1 是获取不到数据的
  • 使用 http://loalhost:8080/api 是可以获取到数据的
  • 或者浏览器安装 client.p12 证书(安装时输入的密码是 p12 密码:123456)也是可以通过 https://loalhost:7000/v1 获取数据

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:https://www.jb51.net/server/330935pr5.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具