Làm cách nào tôi có thể xác minh / đọc CSR đổi mới IIS7 bằng OpenSSL


10

Tôi có đặc quyền xử lý ~ 5 CSR SSL mỗi tuần, kiểm tra tính hợp lệ của chúng trước khi chuyển chúng cho CA của chúng tôi để xử lý. Tôi sử dụng OpenSSL trên máy Ubuntu để kiểm tra xem chúng có hợp lệ không, kiểm tra những thứ như tên OU chính xác, CN hợp lý, kích thước khóa> = 2048 bit, v.v., vì yêu cầu của chúng tôi đôi khi không chính xác.

Hôm trước tôi nhận được yêu cầu gia hạn từ máy IIS7. Tôi không thể tìm ra cách đọc này, sử dụng OpenSSL. Nó là hợp lệ, vì CA của tôi đã chấp nhận nó ...

'file (1)' nói rằng đó là "văn bản yêu cầu ký chứng chỉ bảo mật RFC1421", đó là những gì nó nói với ~ 50% số CSR tôi có ở đây (phần còn lại là "yêu cầu chứng chỉ PEM").

$ head iis7rcsr
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIQsQYJKoZIhvcNAQcCoIIQojCCEJ4CAQExCzAJBgUrDgMCGgUAMIIJegYJKoZI
hvcNAQcBoIIJawSCCWcwggljMIIIzAIBADCB2zELMAkGA1UEBhMCTloxDTALBgNV
BBEMBDkwNTQxDjAMBgNVBAgMBU90YWdvMRAwDgYDVQQHDAdEdW5lZGluMRwwGgYD
...
...

openssl req, đọc CSR (PKCS # 10) không hiểu được ...

$ openssl req -in iis7rcsr -text
unable to load X509 request
5156:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
5156:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509_REQ_INFO
5156:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:748:Field=req_info, Type=X509_REQ
5156:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:

Bài viết này của Andreas Klein trên blog MSDN cho thấy rằng CSR đổi mới IIS7 là một thùng chứa PKCS # 7, với CSR và chữ ký dựa trên chứng chỉ hiện tại ... nhưng tôi vẫn không thể đọc được.

$ openssl pkcs7 -in iis7rcsr -text
unable to load PKCS7 object
6581:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: PKCS7

Tôi có thể sử dụng 'openssl base64' để giải mã tệp và trong tệp nhị phân kết quả, tôi có thể thấy các chuỗi trông giống như CSR và một số tham chiếu CA phải xuất phát từ chữ ký dựa trên chứng chỉ cũ. Vì vậy, ý tưởng về container (CSR, chữ ký) nghe có vẻ hợp lý.

Nhưng tôi vẫn không thể tìm ra cách đọc CSR trong đó! Tôi đã thử rất nhiều thứ, tôi sẽ không liệt kê chi tiết ở đây, nhưng đây là những điểm cao của các biến thể tôi đã thử: pkcs12 pkcs7 PEM DER req x509 xác minh ...

Tôi không thể đăng CSR ở đây không may. Bất cứ ai có thể giúp tôi tìm ra một cách đọc / xác minh tập tin này?


Tình cờ có yêu cầu chứa các thuộc tính tìm kiếm Tên thay thế chủ đề không?
Shane Madden

Tôi nghi ngờ điều đó - nó dành cho một máy chủ nội bộ có một tên duy nhất. Tất nhiên, các certs chúng tôi lấy lại thường có trường SAN với 'www.' buộc phải chèn, nhưng chúng ta sống với điều đó!
Jim Cheetham

certutil từ máy Windows sẽ đọc chứng chỉ này và mô tả là thông báo PKCS7, với Yêu cầu chứng chỉ PKCS10 (chứa chứng chỉ x509 từ CA cũ) và chuỗi chứng chỉ, chứa chứng chỉ x509 khác). 'certutil -split' phá vỡ các phần này và Blob0_1.p10 là CSR mà tôi hy vọng tìm thấy, ở định dạng DER. Vì vậy, tôi đang tiến gần hơn ... và vâng, có một trường SAN trong yêu cầu, có lẽ là kết quả của việc chèn 'www.' khi chúng tôi nhận được chứng chỉ gốc năm ngoái ...
Jim Cheetham

1
openssl asn1parsecó thể đọc yêu cầu và từ đó tôi có thể trích xuất CSR bình thường. Tôi chưa thể tự trả lời được (đã giải quyết quá nhanh) vì vậy tôi sẽ cập nhật câu hỏi bằng giải pháp và sau đó sửa vào ngày mai :-)
Jim Cheetham

Đẹp, tìm tốt!
Shane Madden

Câu trả lời:


8

Cấu trúc của yêu cầu gia hạn IIS7 này thực sự khá thanh lịch. Dường như bắt đầu từ tiền đề rằng vì đây là yêu cầu gia hạn chứng chỉ hiện tại , nên cần chứng minh rằng yêu cầu đến từ máy chủ chính xác - tức là máy chủ thực sự đang sử dụng chứng chỉ hiện tại & sở hữu quyền riêng tư được liên kết Chìa khóa. Trong thế giới Internet, bạn chứng minh rằng bạn được phép yêu cầu gia hạn chứng chỉ bằng cách xác thực với CA của bạn là người dùng ban đầu, thay vì tạo CSR đã ký.

Để chứng minh quyền đưa ra yêu cầu gia hạn, IIS7 tạo CSR bình thường (đối tượng PKCS # 10), sau đó ký tên và cung cấp chứng chỉ của khóa đã ký.

  • Đổi mới IIS7 CSR
    • Dữ liệu PKCS # 7
      • Dữ liệu PKCS # 10 (CSR thông thường)
    • Chứng chỉ máy chủ bình thường
    • Phát hành dữ liệu CA
    • Chữ ký RSA (tôi giả sử)

Sử dụng openssl asn1parse -in iis7rcsr -iđể xem cấu trúc của tệp và so sánh tệp này với các CSR thông thường. Bạn sẽ thấy một chuỗi OCTET gần đầu, trong một đối tượng có nhãn ": pkcs7-data", đó là những gì bạn cần trích xuất để có được CSR.

$ openssl asn1parse -in iis7rcsr -i
0:d=0  hl=4 l=4273 cons: SEQUENCE          
4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
15:d=1  hl=4 l=4258 cons:  cont [ 0 ]        
19:d=2  hl=4 l=4254 cons:   SEQUENCE          
23:d=3  hl=2 l=   1 prim:    INTEGER           :01
26:d=3  hl=2 l=  11 cons:    SET               
28:d=4  hl=2 l=   9 cons:     SEQUENCE          
30:d=5  hl=2 l=   5 prim:      OBJECT            :sha1
37:d=5  hl=2 l=   0 prim:      NULL              
39:d=3  hl=4 l=2426 cons:    SEQUENCE          
43:d=4  hl=2 l=   9 prim:     OBJECT            :pkcs7-data
54:d=4  hl=4 l=2411 cons:     cont [ 0 ]        
58:d=5  hl=4 l=2407 prim:      OCTET STRING      [HEX DUMP]:3082096330820...

Để đưa PKCS # 10 CSR thực tế ra khỏi đây, chúng tôi cần số bù đó, "58" trong ví dụ này. Sau đó, chúng ta có thể sử dụng phần bù đó để trích xuất phiên bản nhị phân của đối tượng đó: -

$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout

Tiếp theo chúng ta có thể đọc tệp đầu ra 'thecsr' với openssl req, nhớ ghi rõ định dạng đầu vào DER.

$ openssl req -in thecsr -inform DER -text -noout
Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (normal CSR Subject: line, censored)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
...

Tôi có thể gói tất cả những thứ này thành một dòng lệnh mà không có tệp tạm thời (nhưng đáng buồn là 2 lần đọc chứng chỉ gốc), miễn là tôi có thể sử dụng Linux /proc/self/fd/để đánh lừa openssl (nó sẽ thực hiện các thủ thuật gốc với bộ mô tả tệp để xử lý mật khẩu, nhưng không đầu ra bình thường).

$ openssl asn1parse -in iis7rcsr -strparse $(openssl asn1parse -in iis7rcsr | grep -A2 ':pkcs7-data'|tail -1|cut -d: -f1) -out /dev/stdout -noout | openssl req -inform DER -noout -text

Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (Subject: line censored again)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
        RSA Public Key: (1024 bit)
            Modulus (1024 bit):
...

Dòng lệnh dài này tương đương trực tiếp với đơn giản openssl req -in non-iis7rcsr -noout -textmà tôi thường sử dụng :-)



2

Cảm ơn Jim vì thông tin tuyệt vời này rất hữu ích, tôi đã gặp vấn đề chính xác tương tự khi cố gắng gia hạn chứng chỉ máy chủ w2008 / IIS7.

Tôi sẽ chỉ thêm một điều. Bạn có thể trích xuất CSR trực tiếp ở định dạng P10 bằng lệnh sau: certutil -split iis7rcsr (iis7rcsr là .csr bạn nhận được thông qua trình quản lý IIS). Sau đó, csr sẽ được trích xuất trong một tệp có tên blob0_1.p10 Nó ở định dạng nhị phân (DER), bạn có thể phải mã hóa nó trong cơ sở64 bằng lệnh sau: certutil -encode blob0_1.p10 finalcsr.csr

Có một vấn đề cuối cùng, mặc dù. Sau đó, tôi đã phát hiện ra, bỏ nội dung .csr với openssl rằng quá trình gia hạn tự động buộc sử dụng khóa 1024 bit (mặc dù khóa riêng ban đầu được tạo trên máy chủ cho chứng chỉ máy chủ có độ dài 2048 bit). Dường như sau đó bạn không thể buộc sử dụng các khóa 2048 bit bằng quy trình gia hạn IIS7.

Tùy chọn tốt duy nhất dường như là tạo khóa / chứng chỉ mới và không sử dụng quy trình gia hạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.