ubuntu - 如何确定哪个 Linux TLS 证书允许我访问给定的主机?

标签 ubuntu ssl encryption proxy

我们在公司 MITM 代理后面有两台 Ubuntu Linux 机器,它重新加密了 HTTPS 流量。为了通过此代理,我们需要将自定义 TLS 证书添加到 /etc/ssl/cert/ca-certificates.crt Ubuntu的文件。
现在,我们的一台机器设置正确,所以它可以访问主机 A。另一台机器不能这样做,可能是因为缺少正确的证书。我们想知道哪些证书是“正确的”并将它们添加到另一台机器上。
成功 session 的痕迹如下所示(更改了一些名称和 IP):

$ curl  -L https://A.com -vvvv
*   Trying 10.123.89.26...
* TCP_NODELAY set
* Connected to <PROXY> port 3128 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to A.com:443
> CONNECT A.com:443 HTTP/1.1
> Host: A.com:443
> User-Agent: curl/7.58.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs                                                                                                                                                    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CONNECT phase completed!
* CONNECT phase completed!
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):                                                                                                                            * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=CN; DC=appName gitlab; DC=caName sha256; ST=pkiNo 255088; O=EVILCORP; OU=IT; CN=A.com; emailAddress=admin@admin.com
*  start date: Jan 10 09:02:59 2019 GMT
*  expire date: Jan  9 09:02:59 2024 GMT
*  subjectAltName: host "A.com" matched cert's "A.com"
*  issuer: CN=HWIT Enterprise CA 1
*  SSL certificate verify ok.
现在,我们还应该收集什么信息才能说,例如,是证书 X 允许我们运行这个 session ?
X 指的是 ca-certificate.crt 中显示的证书:
-----BEGIN CERTIFICATE-----
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
...
...
-----END CERTIFICATE-----

最佳答案

最简单的方法 :肯定有一种完善的方法可以找到和下载 MITM 代理的 CA 证书,而且肯定有记录在某处。您不需要从另一台机器的系统池中寻找正确的 CA。
也就是说,如果您真的必须知道如何仅使用与随机网站的连接来找到正确的 CA 证书,请继续阅读。

这可以分两步完成:

  • 查找服务器返回的链中最顶层证书颁发者的可分辨名称
  • 查找其主题专有名称与刚刚找到的 CA 证书匹配的 CA 证书

  • 查找颁发者的专有名称 :
    要查找颁发者的名称,请向几乎任何主机发出请求。提供的服务器证书将是来自您的 MITM 代理的证书,而不是真正的证书,但过程完全相同。
    让我们以 www.google.com 为例: 请注意,我是故意告诉 openssl 不是 使用系统 CA 池,实际上不信任任何东西。当你运行它时,你不需要 -no-CApath争论。
    $ openssl s_client -no-CApath  -connect www.google.com:443 
    CONNECTED(00000003)
    depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
    verify error:num=20:unable to get local issuer certificate
    verify return:1
    depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
    verify return:1
    ---
    Certificate chain
     0 s:C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
       i:C = US, O = Google Trust Services, CN = GTS CA 1O1
     1 s:C = US, O = Google Trust Services, CN = GTS CA 1O1
       i:OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
    ---
    etc.....
    
    服务器返回了两个证书:带有 CN = www.google.com 的服务器证书及其发行者(中间 CA)属于 Google Trust Services .中间 CA 由 GlobalSign Root CA - R2 颁发,这就是我们需要找到的证书。

    查找匹配的 CA 证书 :
    我现在需要找到具有匹配专有名称的 CA 证书:OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign .
    要解码系统池中的证书,我可以使用 openssl再次。让我们只检查一个证书(如果文件名对您没有帮助,您可能需要检查多个证书。一个小脚本应该可以解决问题):
    $ openssl x509 -text -in /usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R2.crt
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                04:00:00:00:00:01:0f:86:26:e6:0d
            Signature Algorithm: sha1WithRSAEncryption
            Issuer: OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
            Validity
                Not Before: Dec 15 08:00:00 2006 GMT
                Not After : Dec 15 08:00:00 2021 GMT
            Subject: OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
    etc...
    
    此证书具有主题专有名称:OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign这与颁发者的专有名称完全匹配。是大概正确的证书(可能有多个具有相同名称的证书,通常在证书更新时)。

    备注 :在您的示例中,返回单个证书(而不是服务器证书和一些中间 CA)。这同样适用:您需要找到具有主题名称的 CA 证书:CN=HWIT Enterprise CA 1 (假设 curl 打印了整个名称)。
    如前所述,可能有多个 CA 具有匹配的专有名称。最简单的方法是将它们全部添加到 CA 证书目录中。在某些情况下(并非总是如此,因为这不是必需的),证书也有 Authority Key Identifier可以与可能的 CA 的 Subject Key Identifier 匹配.

    关于ubuntu - 如何确定哪个 Linux TLS 证书允许我访问给定的主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63937420/

    相关文章:

    用于取消当前(以及所有后续)脚本的 Bash 退出选项

    Python处理socket.error : [Errno 104] Connection reset by peer

    ubuntu - ubuntu 中的 TURN 服务器无法正常工作

    http - 从 wxWidgets 应用程序通过 HTTPS POST 发送反馈数据

    ssl - meteor 错误 : failed: WebSocket is closed before the connection is established

    PHP CURL SSL 连接到 XML 网关

    php - 哪种 PHP mcrypt 密码最安全?

    sql - MySQL Workbench 无法在 ubuntu 上打开

    c - C语言凯撒密码程序的高级思考

    php - Android 和 PHP 之间的加密/解密问题