我有一个 REST API,它使用基于 HTTPS 的 JWT 持有者身份验证。 SSL 证书安装在托管我的 REST API 的 Web 服务器上。我是否需要向想要使用我的 API 的不同应用程序(用户) 提供客户端证书,以便使用我提供的客户端证书在他们的服务器和我的服务器之间进行握手。
我尝试从我的机器本地运行的 python 脚本调用我用 C# 开发的 HTTPS REST API,但我必须将验证标志指定为 False 或 ssl.CERT_NONE
才能使调用成功
import requests
requests.get('some https url', verify=False)
我知道我们也可以使用自签名证书。我担心 Man in the Middle 攻击,如果他们使用 verify=False
调用我的端点,并且如果有人试图在他的应用程序中使用我的 API,该应用程序正在通过 https 进行生产我需要向他提供用于握手的客户端证书,否则他的应用程序无需我专门提供客户端证书即可调用我的 https api 端点。
我试图从这个 question 中获得一些线索但它没有解释其应用程序试图通过 https 调用我的端点的不同用户将如何与我的 rest api 执行握手
任何指导将不胜感激。
最佳答案
快速回答:确保您的私钥文件安全,您不会有任何问题。
长答案与解释非对称加密及其如何在 TLS 握手中实现有关。当客户端打开与您的服务器的 HTTPS 连接时,会来回发送一系列请求:
- 客户发送HELLO
- 服务器发回 HELLO,包括服务器 SSL 证书
- 客户通过证书颁发机构验证证书
- 客户端发回一个用服务器公钥加密的随机字节串
- 服务器使用私钥解密字符串
在最后一步之后,在客户端和服务器之间创建了一个 session 。为了使中间人攻击成功,“中间人”需要您的私钥并代理刚才描述的每个操作返回您的服务器,否则其中一个步骤将失败并且客户端将在他们的浏览器中收到“服务器未验证”错误,警告他们连接不安全。
这是对过程的一个非常简短的解释,你可以做更多的阅读here
关于c# - 我应该为我的 REST API 的消费者提供客户端证书吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59309011/