2014-07-23 31 views
8

Có thể xác thực chữ ký chỉ có chứng chỉ tổ tiên hoặc chứng chỉ gốc trong cấu trúc phân cấp không?Xác nhận chữ ký không có chứng chỉ trung gian

Tuyên bố từ chối trách nhiệm: Tôi là người mới tham gia xử lý chứng chỉ vì vậy hãy tha thứ cho thuật ngữ ngây thơ.

Cân nhắc tình huống sau.

  • Chúng tôi có hai bên (chúng ta hãy gọi chúng IdP cho nhà cung cấp nhận dạng và SP cho nhà cung cấp dịch vụ) và một số cơ quan chứng nhận trung tâm CA mà chắc chắn là đáng tin cậy bởi cả IdP và SP.
  • CA có nó chứng chỉ cho riêng CertCA biết đến cả IdP và SP (nhập khẩu vào IdP và keystore SP dưới một số bí danh)
  • Out CA phát hành một chứng chỉ cho IdP (CertIdP) và một cho SP (CertSP).
  • IdP có CertIdP trong keystore của nó và biết mật khẩu cho nó để IdP có thể đăng tin nhắn với CertIdP
  • Tương tự cho SP/CertSP
  • Bây giờ chúng ta hãy giả SP mà không biết CertIdP và IdP không biết CertSP. Họ chỉ biết CertCA được sử dụng để ký CertIdP và CertSP. (Theo tôi hiểu, chúng tôi có một hệ thống phân cấp chứng chỉ CertIdP -> CertCA < - CertSP tại đây)
  • IdP muốn gửi thư đã ký đến SP. Nó tạo ra một tin nhắn và sau đó sử dụng CertIdP để ký tên.
  • SP nhận được thông báo được IDP ký bằng cách sử dụng CertIdP. Như đã lưu ý ở trên, SP không có CertIdP, chỉ có chứng nhận của cha mẹ là CertCA.

Câu hỏi của tôi là: SP có thể xác thực chữ ký của thư được CertIdP xác nhận chỉ có chứng chỉ gốc CertCA?

Backstory, tại sao lại muốn.

Chúng tôi đang triển khai SSO dựa trên SAML với PicketLink. Chúng tôi đang sử dụng số SAML2SignatureValidationHandler của PicketLink để xác thực chữ ký. Để đạt được điều này, nhà cung cấp dịch vụ (SP) cần phải có chứng chỉ của IdP trong kho khóa của nó. Khi xác nhận SAML đã ký được chuyển tới SP, trình xử lý này sử dụng chứng chỉ của IdP để xác thực chữ ký.

Quy trình trên hoạt động tốt nhưng chúng tôi có một số mối quan ngại về tổ chức. Quá trình này giả định rằng SP có chứng chỉ của IdP để xác thực. Trong trường hợp có thay đổi, chứng chỉ của IdP phải được thay thế ở phía SP. Chúng tôi có thể có một số lượng lớn SP (hunreds khi không phải hàng ngàn) vì vậy đây là một nỗ lực khá lớn.

Vì cả CertIdP và CertSP được cấp bởi cùng một cơ quan (CA), chắc chắn được cả IDP và SP tin cậy, chúng tôi có ý tưởng rằng chúng tôi có thể sử dụng chứng chỉ CA để xác thực chữ ký. Nếu điều này làm việc, điều này có thể loại bỏ sự cần thiết phải trao đổi chứng chỉ giữa IdP và SP. Giấy chứng nhận của CA cũng rất "sống lâu" vì vậy nếu chỉ phải được trao đổi một lần trong đời đời (vĩnh cửu, trong trường hợp của chúng tôi là khoảng 10-20 năm).

Tuy nhiên tôi không chắc chắn về mặt kỹ thuật có thể xác thực chữ ký được ký với CertIdP chỉ có chứng chỉ gốc của CertCA hay không. Có thể không? Hay chúng ta đang theo dõi sai hoàn toàn ở đây?

Nếu có liên quan, chúng tôi đang ở trên nền tảng Java/JBoss ở phía SP, IdP là phần mềm của bên thứ ba.

Cập nhật:

Đây là chữ ký tôi nhận được vào lúc này từ IdP:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
     <ds:SignedInfo> 
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
      <ds:Reference URI="#_..."> 
       <ds:Transforms> 
        <ds:Transform 
         Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
         <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" 
          PrefixList="ds saml samlp" /> 
        </ds:Transform> 
       </ds:Transforms> 
       <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
       <ds:DigestValue>r...=</ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue>X...==</ds:SignatureValue> 
    </ds:Signature> 

Trả lời

5

nó phụ thuộc vào việc hồi đáp SAML của bạn có chứa các ký giấy chứng nhận <ds:X509Data>...</ds:X509Data> hay chỉ là công chính <ds:KeyValue>...</ds:KeyValue> của nó .

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ...> 
    ... 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ds:SignedInfo>...</ds:SignedInfo 
    <ds:SignatureValue>...</ds:SignatureValue> 
    <ds:KeyInfo> 
     <ds:X509Data> 
     <ds:X509Certificate>...</ds:X509Certificate> 
     </ds:X509Data> 
    </ds:KeyInfo> 
    </ds:Signature> 
</saml2p:Response> 

vs

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ...> 
    ... 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ds:SignedInfo>...</ds:SignedInfo 
    <ds:SignatureValue>...</ds:SignatureValue> 
    <ds:KeyInfo> 
     <ds:KeyValue> 
     <ds:RSAKeyValue> 
      <ds:Modulus>...</ds:Modulus> 
      <ds:Exponent>...</ds:Exponent> 
     </ds:RSAKeyValue> 
     </ds:KeyValue> 
    </ds:KeyInfo> 
    </ds:Signature> 
</saml2p:Response> 

Nếu giấy chứng nhận ký được nhúng vào, nó có thể chứa phần mở rộng AuthorityInfoAccess, thường chứa một hoặc http ldap URL để Giấy chứng nhận phát hành CA. Sử dụng các phần mở rộng này từ chứng chỉ ký kết đến chứng chỉ CA đáng tin cậy, bạn sẽ có thể xây dựng chuỗi chứng chỉ đáng tin cậy. (Lưu ý: Nếu CertCA thực sự là công ty phát hành trực tiếp CertIdP và CertSP, bạn đã có chuỗi chứng chỉ được tin cậy bắt buộc.)

Tuy nhiên, nếu bạn chỉ có khóa công khai, bạn cần phải có chứng chỉ ký kết để khớp với chìa khóa công cộng chống lại. Vì vậy, sau đó nó đi xuống đến một vấn đề cung cấp/phân phối. Bạn có thể cung cấp dịch vụ web trả về chứng chỉ ký tương ứng cho khóa công khai được yêu cầu. Nếu chứng chỉ ký không được tìm thấy trong kho khóa cục bộ của SP, nó sẽ liên lạc với dịch vụ web để lấy CertIdP mới và thêm nó vào kho khóa cục bộ. Việc giữ kho khóa cục bộ là hiệu suất, tính khả dụng và quyền riêng tư có liên quan.

+0

Hiện tại tôi chỉ nhận được SignedInfo và SignedValue (vui lòng xem cập nhật trong câu hỏi). Nhưng những gì bạn đang nói là nếu tôi có X509Data với chứng chỉ thì tôi có thể xác nhận nó bằng chứng chỉ CA, đúng không? – lexicore

+1

Tôi vừa mới biết rằng phần tử '' là tùy chọn trong lược đồ xmldsig cũng như trong tiêu chuẩn cốt lõi SAML 2.0. Có, bạn chỉ cần có để có được giấy chứng nhận ký kết, cho dù thông qua '' hoặc thông qua các phương tiện khác phụ thuộc vào trường hợp sử dụng. Cách tiếp cận với cơ chế cấp phép tập trung cũng hoạt động với thông tin khóa công khai, ví dụ: thông qua một URL nổi tiếng cung cấp chứng chỉ xác thực hiện tại. –

+1

@lexicore bạn sẽ luôn cần chứng chỉ được sử dụng để làm chữ ký để xác minh. Việc xác minh không thể được thực hiện chỉ với chứng chỉ CA vì bạn không biết chữ ký đã được thực hiện bằng chứng chỉ do CA này hay bất kỳ CA nào khác đưa ra. Nếu bạn có thể, hãy đặt IdP của bạn để đặt chứng chỉ IdP ký vào SAML trong phần tử ''. – pepo

3

Tôi sẽ bắt đầu với một số giới thiệu nhỏ - việc xác minh chữ ký số được thực hiện trong hai giai đoạn

  • xác minh chữ ký đầu tiên - mà kiểm tra rằng giá trị chữ ký là thực sự tương ứng với nội dung nó bảo vệ và rằng do đó, nội dung không bị giả mạo với số
  • xác minh tin cậy - hãy kiểm tra xem chữ ký đã được thực hiện bởi ai đó được người xác minh tin cậy).

Xác minh chữ ký số yêu cầu áp dụng khóa công khai có khóa riêng tương ứng được sử dụng để tạo chữ ký. Không có cách nào xung quanh chuyện này.

Nhưng có một trường hợp sử dụng để xác minh sự tin cậy cho phép sử dụng chứng chỉ CA - và nó sẽ hữu ích cho trường hợp của bạn.

Nó hoạt động để bạn chỉ bao gồm chứng chỉ ký CA (và có thể là CA trung gian) trong siêu dữ liệu được tạo cho SP và IDP của bạn. Sau đó, bạn đưa khóa lá chính xác (do CA cấp) được sử dụng để tạo chữ ký như một phần của thông điệp SAML (trong phần tử KeyInfo bên trong Chữ ký). SP/IDP sau đó có thể xác minh rằng phím lá (chưa được biết trước) được tin cậy bằng cách xây dựng và xác minh Đường dẫn chứng nhận bằng các chứng chỉ CA mà nó đã có.

Tính năng này hữu ích cho việc di chuột qua các phím (ví dụ:khi hết hạn) - vì SP và IDP có thể thay đổi khóa ký của họ mà không cần phải thông báo cho bên kia. Các sản phẩm SAML đôi khi gọi tính năng này được neo hoặc chế độ tin cậy PKIX.

Xin lưu ý rằng cách tiếp cận này không hoạt động đối với mã hóa kỹ thuật số, vì mã hóa đòi hỏi phải biết trước về khóa chính xác của lá bên kia.

2

Câu trả lời ngắn gọn là "Không". Nếu bạn chỉ có chứng chỉ của CA nhưng không phải chứng chỉ của IdP hoặc SP, bạn không thể xác thực chữ ký của IdP hoặc SP.

Câu trả lời dài hơn: Để xác thực chữ ký của IdP của SP, SP trước tiên phải xác định khóa công khai chính xác được liên kết với IdP. Xác nhận hợp lệ bao gồm việc so sánh giá trị chữ ký mã hóa khóa công khai với hàm băm của nội dung và kiểm tra xem chúng có giống nhau hay không. Nếu không có khóa công khai của IdP thì SP không thể thực hiện thao tác này.

Giả sử SP có khóa công khai để xác thực ở trên hoạt động và giờ đây nó muốn xác thực rằng khóa công khai này thực tế thuộc về IdP. Để thực hiện điều này, nó cần một chứng chỉ có chứa khóa công khai và tên của IdP, với một chữ ký từ một thực thể đáng tin cậy, trong trường hợp này là CA. Vì bạn không có điều này, bạn không thể xác nhận rằng chữ ký được thực hiện bởi IdP.

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