2012-08-27 48 views
6

Tôi tin rằng kể từ question này, pyOpenSSL đã bắt đầu hỗ trợ việc xác minh chữ ký (tính đến pyOpenSSL 0.11.Xác nhận chữ ký với pyopenssl

tôi đang làm việc trên một dự án được bắt đầu bởi một người nào khác sử dụng M2Crypto. M2Crypto thực sự đau đớn để bao gồm trên các nền tảng như Heroku vì nó yêu cầu sử dụng SWIG. Do đó tôi đang cố gắng loại bỏ sự phụ thuộc vào M2Crypto và thay thế bằng pyOpenSSL dễ cài đặt qua Pip, và không yêu cầu buildpacks tùy chỉnh và nhiều thứ khác liên quan đến SWIG

Vấn đề tôi đang gặp đang thay thế một chút mã:

key = cert.get_pubkey() # Cert is an M2Crypto X509 object 
key = key.get_rsa() 
ret = key.verify(hashed, self.sig) 
if ret != 1: 
    # Cert invalid ... etc. 

Lý tưởng nhất là tôi muốn thực hiện các chức năng tương tự qua pyOpenSSL, nhưng cảm thấy tôi có thể có được khi kết thúc sai trái của thanh - Tôi đã cố gắng sử dụng:

crypto.verify(cert, self.sig, hashed, 'sha1') 

Nhưng này không thành công -

[('rsa routines', 'RSA_verify', 'bad signature')] 

tôi không thể làm việc ra cho dù đó là thất bại vì chữ ký là thực sự xấu, hoặc vì các giá trị tôi cung cấp crypto.verify thực sự không phải những gì nó là vụ phải được sử dụng cho!

Mã ban đầu tôi đã chơi với là here và cần một chút công việc để dọn dẹp, nhưng đã cố gắng thực hiện từng bước một thay thế chức năng trước khi tổng kết cấu trúc lại. Bất kỳ con trỏ nào cũng sẽ được đánh giá cao! Có pyOpenSSL có khả năng thay thế các chức năng M2Crypto ở đây, và tôi đang đi về nó đúng cách?

Trả lời

7

Vì vậy, câu trả lời đến từ việc đọc thêm một chút nguồn pyOpenSSL, với con trỏ từ exarkun. pyOpenSSL thực sự có thể thay thế phụ thuộc M2Crypto ở đây, với những thay đổi rất nhỏ đối với mã cơ bản.

Các unittest cho crypto.verify() chức năng here cho thấy việc lấy cuộc gọi:

verify(good_cert, sig, content, digest) 

Do đó đã có một lỗi trong mã trên tôi:

crypto.verify(cert, self.sig, hashed, 'sha1') 

nào nên đã chỉ đơn giản là lấy ' dữ liệu ', thay vì được băm, vì chữ ký được áp dụng cho chuỗi dữ liệu thô:

# N.B. cert = X509 object (from crypto.load_certificate()) 
crypto.verify(cert, self.sig, data, 'sha1') 

Hành vi này xuất hiện khác với hành vi xác minh của M2Crypto, chuỗi dữ liệu được băm để thực hiện xác minh của nó. Lưu ý tôi đã không đào sâu đặc biệt vào các chức năng của M2Crypto để tìm ra những gì đang diễn ra.

Cảm ơn exarkun vì phản hồi của anh ấy trên pyOpenSSL mailing list đã chỉ cho tôi lỗi trong cuộc gọi của tôi để xác minh(), thay vì hiểu biết của tôi về những gì xác minh() đang thực hiện.

Các vấn đề liên quan