如何将签名证书添加到比特币bip70支付消息?python

如何将签名证书添加到比特币bip70支付消息?python,python,protocol-buffers,bitcoin,Python,Protocol Buffers,Bitcoin,参考资料: 前面有#的不是问题,我已经解决了 可选字节pki_数据需要“x509+sha256”的字节编码版本,因此 x509_bytes = open('/path/to/x509.der', 'rb').read() pki_data = hashib.sha256(x509_bytes) 以上是正确的吗 接下来是可选字节签名,“PaymentRequest消息的协议缓冲区序列化变体散列上的数字签名” 我不知道如何实现这一点,因此任何建议都将不胜感激 我终于 message X509C

参考资料:

前面有
#
的不是问题,我已经解决了

可选字节pki_数据
需要“x509+sha256”的字节编码版本,因此

x509_bytes = open('/path/to/x509.der', 'rb').read()
pki_data = hashib.sha256(x509_bytes)
以上是正确的吗

接下来是可选字节签名,“PaymentRequest消息的协议缓冲区序列化变体散列上的数字签名”

我不知道如何实现这一点,因此任何建议都将不胜感激

我终于

message X509Certificates {
        repeated bytes certificate = 1;
    }
重复字节证书
“每个证书都是一个DER[ITU.X690.1994]PKIX证书值。包含对PaymentRequest进行数字签名的实体的公钥的证书必须是第一个证书。”

我只有一个从comodo根权限获得的证书,因此我认为我只需要提供证书的原始字节数据,以满足这一个已经以
x509\u字节
的形式存在的证书,因此

repeated bytes certificate = x509_bytes
我接近了吗

我还注意到,
重复字节证书
出现在
可选字节签名
之后,但我不应该在
消息支付请求
之前处理它,以便以某种方式将其序列化到http响应中吗

编辑:

值得一提的是,我知道在将这些方法作为请求/响应发送之前,我需要导入、实例化并在某些情况下序列化这些方法,但我要寻找的是如何操作和提供所需信息的方法


谢谢:)

要将PKI数据添加到PaymentRequest对象:

pki_data = X509Certificates()
certificates = [your_cert_der_data, root_cert_der_data]
for cert in certificates:
    pki_data.certificate.append(cert)
request.pki_data = pki_data.SerializeToString()
要添加签名,请执行以下操作:


再次感谢您的帮助,我基本上已经完全按照上面所示模拟了您的代码,只是想知道您是否可以告诉我。。。我没有使用for循环添加每个证书,而是将它们连接到一个nginx的.der格式文件中,这是否意味着我可以一步添加捆绑包?我问这个问题的原因是因为btc客户端仍然报告付款请求未经验证:(我通过不尝试连接证书来修复它,而只是一次添加一个证书。非常感谢您解决了我的问题:)
pki_data = X509Certificates()
certificates = [your_cert_der_data, root_cert_der_data]
for cert in certificates:
    pki_data.certificate.append(cert)
request.pki_data = pki_data.SerializeToString()
from Crypto.Hash import SHA256
from Crypto.Signature import PKCS1_v1_5
from Crypto.PublicKey import RSA

# At this moment request object must contain serialized_payment_details, pki_type and pki_data
request.signature = ""  # Add empty signature
request_hash = SHA256.new(request.SerializeToString())
private_key = RSA.importKey(private_key_der_data)
signer = PKCS1_v1_5.new(private_key)
request.signature = signer.sign(request_hash)
result = request.SerializeToString()