【问题标题】:ssl certificate authentication in pythonpython中的ssl证书认证
【发布时间】:2012-05-17 16:11:26
【问题描述】:

我得到了以下代码,应该执行 ssl 握手和证书身份验证:

1   s = socket.socket()
2   print "connecting..."
3   logging.debug("Connecting")
4   # Connect with SSL mutual authentication
5   # We only trust our server's CA, and it only trusts user certificates signed by it
6   c = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED,
7                       ssl_version=ssl.PROTOCOL_SSLv3, ca_certs='ca.crt',
8                       certfile='user.crt', keyfile='user.key')
9   c.connect((constants.server_addr, constants.port))

我对此有 2 个问题:

  1. 我们在哪里指定要连接的服务器/端口?这些参数是 socket.socket() 的吗?
  2. 我有一个 .p12,我从中提取了一个证书和一个 pem 格式的密钥(请参阅 this question),我假设它们分别对应于 user.crtuser.key(第 8 行)。但是,虽然我假设 ca.crt(第 7 行)是从证书颁发机构检索的,但如何检索它?

如果上述代码的任何部分或我对它的假设不正确,请告诉我。谢谢!

【问题讨论】:

  • 实际上 -- PKCS#12 文件(您的 .p12 文件)也可以并且通常确实包含相关的 CA 证书。
  • @CharlesDuffy,您自己的 PKCS#12 文件可能包含您自己的证书链,但不包含服务器(除非它们相同,但不一定如此)。
  • @CharlesDuffy 如何从 p12 检索 CA 证书?
  • @Bruno 很公平——我假设这里的两端都使用了一个私人(即公司)CA。
  • @ewok 请参阅 man pkcs12 -- 特别是 -cacerts-out。也就是说,Bruno 的警告适用——客户端和服务器证书可能由同一个 CA 签署,也可能不同。

标签: python ssl ssl-certificate


【解决方案1】:
  1. 服务器地址和端口被指定为第 9 行中套接字地址的一部分,指定为connect 的参数。

  2. 通常,您通过某种带外方法获取 CA 证书,然后将其保存在本地。 Linux 系统通常具有一系列证书,用于在 /etc/ssl/certs 或类似名称下提供的知名、受信任的 CA。

【讨论】:

  • 代码正在 Windows 上运行。知道它会存储在哪里吗?是否可以通过保存在 Firefox 中的安全异常来检索?
  • 您可以从 Firefox 导出 CA 证书,当然,如果您知道哪个 CA 签署了服务器的证书。使用 PEM 格式与ssl 库一起使用(请参阅docs.python.org/library/ssl.html#certificates)。但是,如果服务器没有由这些 CA 之一签名,您将需要向运行服务器的组织询问如何获取证书。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2018-12-25
  • 2010-11-08
  • 1970-01-01
  • 2021-02-14
  • 2017-06-14
相关资源
最近更新 更多