代码之家  ›  专栏  ›  技术社区  ›  Gary McGill

如何修复“SSL证书问题:证书链中的自签名证书”错误?

  •  1
  • Gary McGill  · 技术社区  · 7 年前

    我有一个基于Linux的Docker容器,如果我这样做:

    curl https://google.com
    

    …然后我得到一个错误:

    curl:(60)SSL证书问题:证书链中的自签名证书 详情如下: https://curl.haxx.se/docs/sslcerts.html

    同样的情况也会发生在任何URL上——这不是谷歌的错。

    上面引用的链接建议了各种解决方案,除了最后一个建议更新证书存储的解决方案之外,没有一个解决方案看起来是合适的。但是没有关于如何做到这一点的说明(或者至少没有对我有意义的说明)。

    这是正确的做法吗?如果是,怎么做?


    使现代化 :根据要求,以下是结果:

    openssl s_client -showcerts -connect www.google.com:443
    
    CONNECTED(00000003)
    depth=3 DC = com, DC = forestroot, CN = SHA256RootCA
    verify error:num=19:self signed certificate in certificate chain
    ---
    Certificate chain
     0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com
       i:/CN=ssl-decrypt
    -----BEGIN CERTIFICATE-----
    MIIDXzCCAkegAwIBAgIIXIk3p8xOX/kwDQYJKoZIhvcNAQELBQAwFjEUMBIGA1UE
    AxMLc3NsLWRlY3J5cHQwHhcNMTgxMjE5MDgxNzAwWhcNMTkwMzEzMDgxNzAwWjBo
    ...
    tq0VAGIoj4+YhO6bktTq3alCRoLstJuuxjVdb1wRkH4YRi0I6ZAB1Cw+M8Lg+2eQ
    KuEo
    -----END CERTIFICATE-----
     1 s:/CN=ssl-decrypt
       i:/DC=com/DC=bgs/CN=SHA256IssueCA
    -----BEGIN CERTIFICATE-----
    MIIGzDCCBLSgAwIBAgITEQAADvB9T7mSaacwDQABAAAO8DANBgkqhkiG9w0BAQsF
    ADBCMRMwEQYKCZImiZPyLGQBGRYDY29tMRMwEQYKCZImiZPyLGQBGRYDYmdzMRYw
    ...
    1z9f/nkj2XTRyGeACoy0qRd5uXJHp1iGM27l3RFDR9OjrfPV56pOBUYWAlc9Nn+1
    Vr3qUZrcCkROrmYisVF4jg==
    -----END CERTIFICATE-----
     2 s:/DC=com/DC=MyCompanyServer/CN=SHA256IssueCA
       i:/DC=com/DC=MyCompanyServer/CN=SHA256RootCA
    -----BEGIN CERTIFICATE-----
    MIIH4zCCBcugAwIBAgITOQAAAAOa4wv9nnK0uQAAAAAAAzANBgkqhkiG9w0BAQsF
    ADBIMRMwEQYKCZImiZPyLGQBGRYDY29tMRowGAYKCZImiZPyLGQBGRYKZm9yZXN0
    ...
    IomErcbcymIWBmN75PVMsk9EMyqDP394jG8+IOK+lVUVX4pxzhdd7eYbqTAwDE1X
    bNWcZZkt/w==
    -----END CERTIFICATE-----
     3 s:/DC=com/DC=MyCompanyServer/CN=SHA256RootCA
       i:/DC=com/DC=MyCompanyServer/CN=SHA256RootCA
    -----BEGIN CERTIFICATE-----
    MIIFgzCCA2ugAwIBAgIQULxmYXGJ1aFIlIyCHA4NIzANBgkqhkiG9w0BAQsFADBI
    MRMwEQYKCZImiZPyLGQBGRYDY29tMRowGAYKCZImiZPyLGQBGRYKZm9yZXN0cm9v
    ...
    jQBLY0/KIjHywv66GhtVWpexgQcXrLxQP2VHW7eXpsylvwkNU5XNQYzHTB7u+w5C
    VunfRLt/7mVWyURcwkOre38tVSByKR4=
    -----END CERTIFICATE-----
    ---
    Server certificate
    subject=/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com
    issuer=/CN=ssl-decrypt
    ---
    No client certificate CA names sent
    Peer signing digest: SHA256
    Server Temp Key: ECDH, P-256, 256 bits
    ---
    SSL handshake has read 6556 bytes and written 302 bytes
    Verification error: self signed certificate in certificate chain
    ---
    New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
    Server public key is 2048 bit
    Secure Renegotiation IS NOT supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    SSL-Session:
        Protocol  : TLSv1.2
        Cipher    : ECDHE-RSA-AES128-GCM-SHA256
        Session-ID: 723D9976F985887CA5F256EE3C2E7B44B9C98A6B440AAF4E19564AE101F78D00
        Session-ID-ctx:
        Master-Key: C3D8759A753C1D269FF9C00854E59B8C10ABC1E94AFE9F0166486A649FE295ACE1AF5E5BEDB0129E557E781BC860D2FA
        PSK identity: None
        PSK identity hint: None
        SRP username: None
        Start Time: 1548690163
        Timeout   : 7200 (sec)
        Verify return code: 19 (self signed certificate in certificate chain)
        Extended master secret: yes
    ---
    read:errno=0
    

    我从中得到的信息是,这个链中有一个证书属于我工作的公司(我已将其更名为MyCompanyServer),我想这就是问题所在。

    我认为我需要为该证书安装某种密钥,这对吗?这对我来说都是希腊语,所以对于新手的问题我深表歉意。

    1 回复  |  直到 7 年前
        1
  •  21
  •   Jan Garaj    7 年前

    可能容器中没有正确的CA证书,因此无法验证TLS连接。

    尝试安装 ca-certificates 包(包可能有不同的名称,这取决于使用的分发版)。


    更新:

    • 将公司CA证书复印至董事 /usr/local/share/ca-certificates/
    • sudo update-ca-certificates

    如果您的主机操作系统已正确预配置CA证书(包括公司CA证书),则您可以将其作为卷装载到容器中:

    docker run \
      -v /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt \
      ...
    

    • /etc/ssl/certs/ca-certificates.crt
    • /etc/pki/tls/certs/ca-bundle.crt 软呢帽/RHEL 6
    • /etc/ssl/ca-bundle.pem
    • /etc/pki/tls/cacert.pem 开瓶器
    • /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem CentOS/RHEL 7
        2
  •  3
  •   Ahmed Tounsi Chaime    6 年前

    好的,我刚刚添加了这个语句,现在可以了。

    CURLOPT_SSL_VERIFYPEER => 0,
    
        3
  •  0
  •   Hemant Kumar    6 年前

    SSL证书问题:证书链中的自签名证书 php卷曲

    curl_setopt($ch, CURLOPT_URL, "https://test.example.com/v1/authenticate.json?api_key=123456");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch,CURLOPT_CAINFO,'cert.embedapp.20191004.pem');
    curl_setopt($ch,CURLOPT_CAPATH,'./cert.embedapp.20191004.pem');
    

    尝试所有操作后,我已将卷曲请求更改为:

    curl_setopt($ch, CURLOPT_URL, "https://test.example.com/v1/authenticate.json?api_key=123456");
           curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    
    curl_setopt($ch, CURLOPT_SSLCERT,'cert.embedapp.20191004.pem');
    

    终于对我有用了:)

    推荐文章