如何在 Scrapy 中使用 ssl 客户端证书(p12)?
How to use ssl client certificate (p12) with Scrapy?
我需要使用 p12(PKCS12) 格式的客户端证书文件与带有 scrapy 的网络服务器通信,有没有办法做到这一点?
我无法在这里为您提供经过测试的完整解决方案,但我知道一些地方,在这些地方进行一些调整可能会满足您的需求。
起点是 scrapy 的 ContextFactory
对象,它定义了 SSL/TLS 配置。标准实现 ScrapyClientContextFactory
不使用客户端证书,也不进行任何服务器证书验证,它只接受任何证书。 (More details)
在查看 source code 时,您会看到备选方案 BrowserLikeContextFactory
正在创建一个 optionsForClientTLS
对象。
此对象还可以使用 clientCertificate
参数对服务器进行身份验证。 (Details)
所以理论上你需要子类化 BrowserLikeContextFactory
,在那里写你自己的 creatorForNetloc
方法并让它创建 optionsForClientTLS
也有一个 clientCertificate
要点:
@implementer(IPolicyForHTTPS)
class ClientCertContextFactory(BrowserLikeContextFactory):
def creatorForNetloc(self, hostname, port):
with open('yourcert.pem') as keyAndCert:
myClientCert = twisted.internet.ssl.PrivateCertificate.load(keyAndCert.read())
return optionsForClientTLS(hostname.decode("ascii"),
trustRoot=platformTrust(),
clientCertificate=myClientCert,
extraCertificateOptions={
'method': self._ssl_method,
})
正在 settings.py
中激活上下文工厂:
DOWNLOADER_CLIENTCONTEXTFACTORY = 'your.package.ClientCertContextFactory'
根据文档 twisted.internet.ssl.PrivateCertificate
只能加载 pem 或 asn.1 格式的密钥,这意味着您必须将密钥转换为 pem 格式:
openssl pkcs12 -in client_ssl.pfx -out client_ssl.pem -clcerts
(借自Converting pfx to pem using openssl)
更新 p12 格式的 PKCS12 文件转换:
openssl pkcs12 -in client_cert.p12 -out client_cert.pem -clcerts
我需要使用 p12(PKCS12) 格式的客户端证书文件与带有 scrapy 的网络服务器通信,有没有办法做到这一点?
我无法在这里为您提供经过测试的完整解决方案,但我知道一些地方,在这些地方进行一些调整可能会满足您的需求。
起点是 scrapy 的 ContextFactory
对象,它定义了 SSL/TLS 配置。标准实现 ScrapyClientContextFactory
不使用客户端证书,也不进行任何服务器证书验证,它只接受任何证书。 (More details)
在查看 source code 时,您会看到备选方案 BrowserLikeContextFactory
正在创建一个 optionsForClientTLS
对象。
此对象还可以使用 clientCertificate
参数对服务器进行身份验证。 (Details)
所以理论上你需要子类化 BrowserLikeContextFactory
,在那里写你自己的 creatorForNetloc
方法并让它创建 optionsForClientTLS
也有一个 clientCertificate
要点:
@implementer(IPolicyForHTTPS)
class ClientCertContextFactory(BrowserLikeContextFactory):
def creatorForNetloc(self, hostname, port):
with open('yourcert.pem') as keyAndCert:
myClientCert = twisted.internet.ssl.PrivateCertificate.load(keyAndCert.read())
return optionsForClientTLS(hostname.decode("ascii"),
trustRoot=platformTrust(),
clientCertificate=myClientCert,
extraCertificateOptions={
'method': self._ssl_method,
})
正在 settings.py
中激活上下文工厂:
DOWNLOADER_CLIENTCONTEXTFACTORY = 'your.package.ClientCertContextFactory'
根据文档 twisted.internet.ssl.PrivateCertificate
只能加载 pem 或 asn.1 格式的密钥,这意味着您必须将密钥转换为 pem 格式:
openssl pkcs12 -in client_ssl.pfx -out client_ssl.pem -clcerts
(借自Converting pfx to pem using openssl)
更新 p12 格式的 PKCS12 文件转换:
openssl pkcs12 -in client_cert.p12 -out client_cert.pem -clcerts