2016-01-06 15 views
14

Tôi có thư PKCS7 được ký. Nó chứa dữ liệu và chứng chỉ ký (với toàn bộ chuỗi tin cậy).Nhận chuỗi ký hiệu PKCS7 trong python

Tôi có mã sử dụng m2crypto để lấy chứng chỉ.

bio = BIO.MemoryBuffer(pkcs7message) 
p7 = SMIME.PKCS7(m2.pkcs7_read_bio_der(bio._ptr())) 
sk = X509.X509_Stack() 
certStack = p7.get0_signers(sk) 

Nó hoạt động. Tuy nhiên, certStack trả về chỉ có một giấy chứng nhận (thay vì trả lại toàn bộ chuỗi chứng nhận

Hai câu hỏi:.

  • Tôi có thiếu một cái gì đó (có thể có một tùy chọn để cho nó biết rằng tôi cần toàn bộ chuỗi)
  • có các phương pháp khác như thế nào để có được toàn bộ chuỗi giá trị (có thể được sử dụng pyopenssl)?

Trả lời

5

tôi đoán bạn đang làm cho một sự nhầm lẫn giữa người ký tên và chuỗi chứng chỉ của một người ký. PKCS7_get0_signers trở lại danh sách các người ký tên

Để xây dựng một thông điệp PKCS7 với 2 người ký tên, bạn có thể sử dụng các bước sau:

  1. trọng xây dựng và giấy chứng nhận cho người ký đầu tiên:

    openssl genrsa -out key1.pem 
    openssl req -new -key key1.pem -subj "/CN=key1" | openssl x509 -req -signkey key1.pem -out cert1.pem 
    
  2. trọng xây dựng và giấy chứng nhận cho thứ hai người ký:

    openssl genrsa -out key2.pem 
    openssl req -new -key key2.pem -subj "/CN=key2" | openssl x509 -req -signkey key2.pem -out cert2.pem 
    
  3. Tạo thư PKCS7 bằng cả sig ners:

    echo "Hello" | openssl smime -sign -nodetach \ 
        -out signature.der -outform DER \ 
        -inkey key1.pem -signer cert1.pem -inkey key2.pem -signer cert2.pem 
    

Sau đó, những người ký tên có thể được in chạy script python của bạn:

from M2Crypto import * 

bio=BIO.File(open('signature.der')) 
smime_object = SMIME.PKCS7(m2.pkcs7_read_bio_der(bio._ptr()))  
signers = smime_object.get0_signers(X509.X509_Stack()) 

for cert in signers: 
    print(cert.get_issuer().as_text()) 

Nó cung cấp cho tổ chức phát hành của những người ký tên:

CN = key1
CN = khóa2

+0

Tôi biết sự khác biệt giữa người ký và chuỗi chứng chỉ người ký. Mã mà bạn có thường tương đương với mã của tôi (để trích xuất người ký). Tuy nhiên, nó không làm bất cứ điều gì để chứng nhận chuỗi. Tôi đã nhận PKCS7 của tôi và có thể trích xuất chuỗi bằng lệnh "openssl pkcs7 print_certs" (cho thấy chuỗi chứng chỉ được lưu trữ ở đâu đó). Nói chung câu hỏi của tôi là làm thế nào để trích xuất (trong mã python) các chuỗi chứng chỉ ra khỏi PKCS7 –

+1

@VictorRonin để có được chuỗi chứng chỉ 'openssl pkcs7 -print_certs' (xem [pkcs7.c] (https://github.com/ openssl/openssl/blob/master/apps/pkcs7.c)) sử dụng 'p7-> d.sign-> certs'. Điều này là không thể truy cập thông qua giao diện m2crypto trực tiếp, có lẽ nó có thể được lấy ra bằng cách sử dụng phân tích cú pháp asn1 ... – mpromonet

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