你好,再见 发表于 2024-5-30 18:45

大佬们请问如何抓取ssl证书

现在有一个神奇的api接口https://a.com/post.php
我使用CURL post表单到这个接口会报错提示SSL connect error
但我如果将https改为http后,post又会提示403拒绝访问
有一个解决方案是禁止CURL校验证书
    curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);

但是这样又感觉不太合适,我还是希望能够正常以https的方式使用这个接口
请教大佬们这种情况是不是因为服务器端使用的是自签的私有证书不被客户端系统信任而导致错误的?
我按照网上的方法使用wireshark导出了一个crt证书,但是我尝试安装抓到的证书却提示无效



求教大佬应该如何正确抓取到这个自签证书{:301_999:}

xiaohuaiwu 发表于 2024-5-30 22:16

加油,我也想知道

爱飞的猫 发表于 2024-5-30 22:27

Linux 下可以用 OpenSSL 抓证书,Windows 下可以尝试在 WSL 下操作。或许在 Windows 下也可以正常用,没测试了。

---

服务器搭建,简单的一个服务器环境,`server.py`:

```py
import http.server
import ssl

server_address = ('localhost', 4443)
handler = http.server.SimpleHTTPRequestHandler
httpd = http.server.HTTPServer(server_address, handler)

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='cert.pem', keyfile='key.pem')

httpd.socket = context.wrap_socket(httpd.socket, server_side=True)

print(f"Serving on https://{server_address}:{server_address}")
httpd.serve_forever()
```

然后生成需要的证书:

```sh
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out cert.pem
```

询问 CN (`Common Name (e.g. server FQDN or YOUR name) `) 的时候输入 `localhost`,其它的可以随便填。

然后用 `python3 server.py` 启动即可,监听端口 `4443`。

---

客户端用 `openssl` 抓需要的证书:

```sh
openssl s_client -showcerts -connect localhost:4443 </dev/null | openssl x509 -outform PEM > my-ca.pem
```

然后用 `curl` 来连接就好了:

```sh
curl -I --cacert my-ca.pem https://localhost:4443
```

正常连接:

```http
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.12.3
Content-type: text/html; charset=utf-8
Content-Length: 310
```
页: [1]
查看完整版本: 大佬们请问如何抓取ssl证书