Python M2Crypto SSL:无法获得本地颁发者证书

时间:2012-03-12 05:40:22

标签: python ssl openssl x509 m2crypto

我正在尝试使用X509证书/ M2Crypto.SSL进行对等身份验证

  1. 我在客户端(hostC)上生成根CA(issuer& subject = ca_hostC)

  2. 我在本地使用此CA签署客户端证书(发行人:ca_hostC,主题:hostC)

  3. 我在hostS上生成CSR,将其复制到hostC,使用步骤1中的根CA对其进行签名,然后将ca_cert和签名的证书移动到hostS。

  4. 我生成上下文:

    import M2Crypto.SSL as SSL
    ctx = SSL.Context('tlsv1')
    ctx.load_cert('x.crt', 'private/x.key')
    ctx.load_verify_locations(cafile='ca.crt')
    ctx.set_verify ( SSL.verify_peer | SSL.verify_fail_if_no_peer_cert , 0, verify_callback)
    

    我连接:

    s = SSL.Connection(ctx)
    s.connect(server_address)
    

    但在客户端我得到了

    ERROR: 20
    unable to get local issuer certificate
    

    然而,当我打印从服务器收到的证书的主题和发行者时,我看到了正确的信息。此外,证书可以从openssl命令行util验证。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

想通了 - 不知怎的,我认为深度= 0意味着无限深度。 来自openssl documentation

depth:设置在验证过程中使用链中深度证书的限制。如果证书链超过允许范围,则忽略超出限制的证书。生成错误消息,就好像这些证书不存在一样,很可能会发出 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 。深度计数为

level 0: peer certificate, 
level 1: CA certificate, 
level 2: higher level CA certificate, 

等等。将最大深度设置为2允许级别0,1和2.默认深度限制为9,允许对等证书和其他9个CA证书。