yokila
yokila
Published on 2024-03-27 / 49 Visits
0
0

Postman配置进行HTTPS交互

本文基于 OpenSSL 来生成文中将会使用的证书,使用 Nginx作为服务端的反向代理Postman作为客户端 进行 单向和双向认证交互

本文基于:

Postman版本:10.24.7

一、HTTPS单向认证与双向认证介绍

可参考阿里云的介绍文章:HTTPS双向认证

可参考华为云的介绍文章:https双向认证与单向认证

简单介绍:

  • 单向认证:客户端验证服务端身份(其实就是服务端证书),服务端不验证客户端身份,通过后开始建立交互的安全通道。

  • 双向认证:客户端验证服务端身份,服务端验证客户端身份(其实就是客户端证书),通过后开始建立交互的安全通道。

双向认证过程中私钥的用处:建立安全通道时,客户端会用服务端证书里的公钥加密协商的数据发送给服务端,服务端需要用私钥来解密获得被加密的数据。如果是双向认证,则服务端也会用客户端证书里的公钥加密协商的数据发给客户端。建立安全通道完毕后,理论上就不再需要私钥和证书的参与了。

二、OpenSSL相关

如何入门使用,可参考文章:OpenSSL命令行实例

当然,你也可以选择其他方式来生成本次示例所需的密钥和证书(例如代码生成),不依赖本文所描述的 OpenSSL的方式。

注:不管你是否使用OpenSSL来生成密钥和证书,都请先看一下下文关于 客户端证书生成 和 服务端证书生成 的说明。

三、HTTPS双向认证证书生成

我们可以把 Postman 当作是 客户端,把 Nginx 当作是 服务端

此时可以参考文章进行证书文件的生成:OpenSSL 生成双向认证使用的证书

注意:Nginx配置的服务端证书的 subjectAltName 必须包含 所在服务器的域名或IP地址。

注意:本文中,Nginx配置的证书的CN无所谓,不需要=所在服务器的域名或IP地址

下文将假设你已具备以下文件:

  • Postman(客户端)使用的文件

    • client.key (客户端私钥)

    • client.crt (客户端证书,证明自己的身份)

    • clientTrustChain.pem (客户端信任库,用于验证服务端身份)

  • Nginx (服务端)使用的文件

    • server.key (服务端私钥)

    • server.crt (服务端证书,证明自己的身份。本文中,需要subjectAltName 包含 所在服务器的域名或IP地址)

    • serverTrustChain.pem (服务端信任库,用于验证客户端身份,如果是单向认证的话不需要)

四、Nginx配置HTTPS代理

可参考这篇文章:Nginx HTTP/HTTPS反向代理 配置 Nginx 的 HTTPS代理

注意:ssl_verify_client on; 这个配置,on 就是双向认证off 就是单向认证

如果手头没有服务可以被Nginx代理以响应Postman的请求,则可以这么写 location 的内容,这样会使得请求到达后,直接返回对应的字符串内容:

  location / {
    add_header Content-Type text/plain;
    return 200 "Hello, World!";
  }

五、Postman配置HTTPS交互

本文假设请求路径为 GET https://1.2.3.4:12301/

由于配置了前文提及的Nginx直接应答结果。所以如果成功,Postman会收到应答 “Hello, World!”

另外,不要只关注应答体的报错信息,还要看控制台的错误信息(点击 Console 打开控制台):

例如这是一次报错:

5.1 Nginx 配置为单向认证时

5.1.1 Postman 配置证书

点击图中的 Setting,进入设置页面。

选择 Certificates,进入证书设置页面

选择开启CA证书,然后选择前文生成好的客户端信任库文件,配置好就可以点击 X 关闭这个窗口。

注:这里的CA证书配置是全局生效的。

启动SSL证书校验(这里设置是只针对这个请求开启SSL证书校验):

点击 Send 发送请求,得到应答,成功!

5.2 Nginx 配置为双向认证时

5.2.1 Postman 配置证书

点击图中的 Setting,进入设置页面。

选择 Certificates,进入证书设置页面

选择开启CA证书,然后选择前文配置好的客户端信任库文件

注:这里的CA证书配置是全局生效的。

点击 Add Certificate

在打开的页面里,输入服务器地址端口,选择客户端证书密钥,然后点击 Add,完成客户端证书的设置

注:PFX为一种文件格式,里面包含了私钥和证书。这里因为我们直接选择了客户端证书和密钥,就不需要选择PFX文件。

注:如果私钥有口令保护,则要在 Passphrase 里输入口令。

注:可以依据不同的目标服务,添加对应的客户端证书和密钥(即多次进行这个操作,添加多个客户端证书)

注:这里的客户端证书配置是全局生效的,不过Postman会自动依据请求的Host和Port来区分使用的的客户端证书。

启动SSL证书校验(这里设置是只针对这个请求开启SSL证书校验):

点击 Send 发送请求,得到应答,成功!

补充

这里设置开启SSL校验,是全局生效的,会使得所有请求默认开启SSL校验(当然,你可以在具体请求里关闭这个校验)

不过,感觉一般不太会这样全局设置默认开启SSL校验。

可能的报错

报错信息:Error: Hostname/IP does not match certificate's altnames

可能原因:Nginx配置为单向认证/双向认证,服务端证书的 subjectAltName 不包含 所在服务器的域名或IP地址

解决:重新颁发服务端证书,使服务端证书的 subjectAltName 包含 所在服务器的域名或IP地址。可参考这篇文章中关于如何生成服务端证书的描述:OpenSSL 生成双向认证使用的证书


报错信息:unable to get issuer certificate

可能原因:Nginx配置为单向认证/双向认证,Postman配置的信任库错误(也有可能是Nginx配置的服务端证书错误),导致Poatman的信任库未验证过服务端证书。

解决:

  • 如果是信任库错误,则需要使用正确的能验证服务端证书的信任库,可请参考文章 OpenSSL 生成双向认证使用的证书 中关于如何生成信任库文件的内容进行信任库文件的生成,并且注意信任库文件内容必须是从 root到最后一级颁发者CA 的证书链内容。

  • 如果是Nginx配置的服务端证书,则需要重新配置正确的服务端证书。


报错信息:400 The SSL certificate error

可能原因:Nginx配置为双向认证,Postman配置错SSL证书,导致服务端验证未通过

解决:Postman需要配置正确的客户端证书


报错信息:Unable to verify the first certificate

可能原因:Nginx配置为单向认证/双向认证,Postman未配置信任库发起请求

解决:Postman需要配置信任库CA


报错信息:400 No required SSL certificate was sent

可能原因:Nginx配置为双向认证,但是Postman未配置客户端证书发起请求

解决:Postman需要配置客户端证书


Comment