1

在此代码中,我尝试将证书 .key 和 .pem 文件用于我有权使用的私有页面。

from OpenSSL import SSL
from twisted.internet import ssl

class BrowserLikeContextFactory(ScrapyClientContextFactory):


        def creatorForNetloc(self, hostname, port):


            certificate = ssl.DefaultOpenSSLContextFactory('path\\sample.key','path\\sample.pem')

            return optionsForClientTLS(hostname.decode("ascii"),
                trustRoot=platformTrust(),
                clientCertificate=certificate,
                extraCertificateOptions={
                'method': self._ssl_method,
                    })

这两个文件存在于指定的路径中。我在 Scrapy 中尝试了一个 fetch 命令,这是第一个结果。

在此处输入图像描述

但是,在输入 PEM 密码后,遇到了这个错误?我该如何解决这个问题?

在此处输入图像描述

4

2 回答 2

1

证书 = ssl.DefaultOpenSSLContextFactory('path\sample.key','path\sample.pem')

这不是证书。后来,有些东西试图像使用它一样使用它并得到一个属性错误,因为它没有privateKey证书应该/应该的属性。

尝试类似的东西

with open("path/sample.key") as k:
    with open("path/sample.pem") as p:
        certificate = ssl.PrivateCertificate.loadPEM(k.read() + p.read())

反而。

于 2020-05-29T12:08:13.197 回答
0

这不完全是您问题的答案,但评论太长了。我发现不处理一次性证书(如自签名证书或本地/私有服务器的证书)更容易。我在这样的事情上取得了成功(取自一个treq项目,但也应该适用scrapy,并进行一些调整):

import re

from twisted.internet import ssl
from twisted.web.iweb import IPolicyForHTTPS
from twisted.web.client import BrowserLikePolicyForHTTPS, Agent
from zope.interface import implementer

@implementer(IPolicyForHTTPS)
class RegexContextFactory:

    defaultPolicy = BrowserLikePolicyForHTTPS()

    def __init__(self, re_domains):
        self.re_domains = re.compile(re_domains)

    def creatorForNetloc(self, hostname, port):
        if self.re_domains.match(hostname) != None:
            return ssl.CertificateOptions(verify=False)
        return self.defaultPolicy.creatorForNetloc(hostname, port)

# Replace regex with one that will match your private domains
regex_factory = RegexContextFactory(b"^(dev|test|stage)-api\.private.net")

接受一个正RegexContextFactory则表达式(确保它是bytes类型)并忽略所有与该正则表达式匹配的 TLS URL 的安全措施。所有其他 URL 都以默认方式运行。

于 2020-05-28T17:34:40.657 回答