Cách thiết lập cơ chế trao đổi có chữ ký bằng Web Packager

Tìm hiểu cách dùng Web Packager để phân phát cơ chế trao đổi có chữ ký (SXGs).

Katie Hempenius
Katie Hempenius

Cơ chế trao đổi có chữ ký (SXG) là một cơ chế phân phối giúp có thể xác thực nguồn gốc của một tài nguyên mà không phụ thuộc vào cách tài nguyên đó được phân phối. Các hướng dẫn sau giải thích cách thiết lập Trao đổi có chữ ký bằng Trình đóng gói web. Hướng dẫn được bao gồm cho cả chứng chỉ CanSignHttpExchanges và chứng chỉ tự ký.

Phân phát SXG bằng chứng chỉ tự ký

Việc sử dụng chứng chỉ tự ký để phân phát SXG chủ yếu được dùng cho mục đích minh hoạ và kiểm thử. SXG được ký bằng chứng chỉ tự ký sẽ tạo thông báo lỗi trong trình duyệt khi được dùng ngoài mục đích thử nghiệm và không được phân phát cho các trình thu thập dữ liệu.

Điều kiện tiên quyết

Để làm theo các hướng dẫn này, bạn cần có opensslGo đã được cài đặt trong môi trường phát triển của bạn.

Tạo chứng chỉ tự ký

Phần này giải thích cách tạo chứng chỉ tự ký mà có thể được dùng với các sàn giao dịch có chữ ký.

Hướng dẫn

  1. Tạo một khoá riêng tư.

    openssl ecparam -out priv.key -name prime256v1 -genkey
    

    Khoá riêng tư sẽ được lưu dưới dạng tệp có tên priv.key.

  2. Tạo ký chứng chỉ yêu cầu (CSR).

    openssl req -new -sha256 -key priv.key -out cert.csr -subj '/O=Web Packager Demo/CN=example.com'
    

    Yêu cầu ký chứng chỉ là một khối văn bản được mã hoá để truyền tải thông tin cần thiết để yêu cầu chứng chỉ từ tổ chức phát hành chứng chỉ(CA). Mặc dù bạn sẽ không yêu cầu chứng chỉ từ CA, bạn vẫn cần tạo yêu cầu ký chứng chỉ.

    Lệnh ở trên sẽ tạo một yêu cầu ký chứng chỉ cho tổ chức có tên Web Packager Demo có chứa thông tin chung tên example.com. Chiến lược phát hành đĩa đơn tên thông thường phải là tên miền đủ điều kiện của trang web chứa nội dung mà bạn muốn đóng gói ở dạng SXG.

    Trong quá trình thiết lập SXG sản xuất, đây sẽ là một trang web mà bạn sở hữu. Tuy nhiên, theo một cách giống như môi trường được mô tả trong các hướng dẫn này, nó có thể là bất kỳ của bạn.

  3. Tạo chứng chỉ có đuôi CanSignHttpExchanges.

    openssl x509 -req -days 90 -in cert.csr -signkey priv.key -out cert.pem -extfile <(echo -e "1.3.6.1.4.1.11129.2.1.22 = ASN1:NULL\nsubjectAltName=DNS:example.com")
    

    Lệnh này sử dụng khoá cá nhân và CSR đã tạo ở bước 1 và 2 để tạo tệp chứng chỉ cert.pem. Cờ -extfile liên kết chứng chỉ với đuôi chứng chỉ CanSignHttpExchanges (1.3.6.1.4.1.11129.2.1.22đối tượng mã nhận dạng cho tiện ích CanSignHttpExchanges). Ngoài ra, cờ -extfile cũng định nghĩa example.com là một Tiêu đề thay thế Tên.

    Nếu muốn biết nội dung của cert.pem, bạn có thể xem bằng cách sử dụng sau đây:

    openssl x509 -in cert.pem -noout -text
    

    Bạn đã tạo xong khoá và chứng chỉ riêng tư. Bạn sẽ cần priv.keycert.pem trong phần tiếp theo.

Thiết lập máy chủ Web Packager để kiểm thử

Điều kiện tiên quyết

  1. Cài đặt Web Packager.

    git clone https://github.com/google/webpackager.git
    
  2. Bản dựng webpkgserver.

    cd webpackager/cmd/webpkgserver
    go build .
    

    webpkgserver là một tệp nhị phân cụ thể trong dự án Web Packager.

  3. Xác minh rằng webpkgserver đã được cài đặt đúng cách.

    ./webpkgserver --help
    

    Lệnh này sẽ trả về thông tin về việc sử dụng webpkgserver. Nếu điều này không có tác dụng, bước khắc phục sự cố đầu tiên là xác minh rằng Đã định cấu hình GOPATH chính xác.

Hướng dẫn

  1. Chuyển đến thư mục webpkgserver (có thể bạn đã ở trong thư mục này thư mục).

    cd /path/to/cmd/webpkgserver
    
  2. Tạo tệp webpkgsever.toml bằng cách sao chép ví dụ.

    cp ./webpkgserver.example.toml ./webpkgserver.toml
    

    Tệp này chứa các lựa chọn cấu hình cho webpkgserver.

  3. Mở webpkgserver.toml bằng trình chỉnh sửa mà bạn chọn và thực hiện như sau các thay đổi:

    • Thay đổi dòng #AllowTestCert = false thành AllowTestCert = true.
    • Thay đổi dòng PEMFile = 'path/to/your.pem' để phản ánh đường dẫn đến chứng chỉ PEM, cert.pem, mà bạn đã tạo. Không thay đổi dòng đề cập đến TLS.PEMFile – đây là một tuỳ chọn cấu hình khác.
    • Thay đổi dòng KeyFile = 'priv.key' để phản ánh đường dẫn của khoá riêng tư priv.key mà bạn đã tạo. Không thay đổi đường kẻ đề cập đến TLS.KeyFile – đây là một tuỳ chọn cấu hình khác.
    • Thay đổi dòng #CertURLBase = '/webpkg/cert' thành CertURLBase = 'data:'. CertURLBase cho biết vị trí phân phát của SXG chứng chỉ. Thông tin này được dùng để đặt tham số cert-url trong thời gian Signature tiêu đề của SXG. Trong môi trường phát hành chính thức, CertURLBase được dùng như sau: CertURLBase = 'https://mysite.com/'. Tuy nhiên, đối với chiến dịch địa phương kiểm thử, CertURLBase = 'data:' có thể được dùng để hướng dẫn webpkgserver để sử dụng một dữ liệu URL để đưa chứng chỉ này vào cùng dòng trong trường cert-url. Đối với kiểm thử cục bộ, đây là cách hiệu quả nhất để phân phát chứng chỉ SXG.
    • Thay đổi dòng Domain = 'example.org' để phản ánh miền mà bạn đã tạo chứng chỉ cho. Nếu bạn đã làm theo các hướng dẫn trong nguyên văn bài viết, nên thay đổi thành example.com. webpkgserver sẽ chỉ tìm nạp nội dung từ miền được chỉ định bởi webpkgserver.toml. Nếu bạn cố tìm nạp các trang từ một miền khác nếu bạn không cập nhật webpkgserver.toml, nhật ký webpkgserver sẽ hiển thị thông báo lỗi URL doesn't match the fetch targets.

    Không bắt buộc

    Nếu bạn muốn bật hoặc tắt tài nguyên phụ tải trước, các lựa chọn cấu hình webpkgserver.toml sau đây có liên quan:

    • Để có webpkgserver lệnh chèn cho biểu định kiểu tải trước và tập lệnh cho các nguồn phụ dưới dạng SXG, hãy thay đổi dòng #PreloadCSS = false đến PreloadCSS = true. Ngoài ra, hãy thay đổi dòng #PreloadJS = false thành PreloadJS = true.

      Thay vì sử dụng tuỳ chọn cấu hình này, bạn có thể thêm tiêu đề Link: rel="preload" và thẻ <link rel="preload"> vào HTML của trang.

    • Theo mặc định, webpkgserver sẽ thay thế các thẻ <link rel="preload"> hiện có với các thẻ <link> tương đương cần thiết để tìm nạp nội dung này dưới Cơ chế SXG. Khi làm như vậy, webpkgserver sẽ đặt giá trị allowed-alt-sxgheader-integrity khi cần—Tác giả HTML không cần thêm các lệnh này theo cách thủ công. Người nhận ghi đè hành vi này và tiếp tục tải trước hiện có không phải SXG, thay đổi #KeepNonSXGPreloads (default = false) thành KeepNonSXGPreloads = true. Xin lưu ý rằng việc bật tuỳ chọn này có thể khiến SXG không đủ điều kiện để bộ nhớ đệm SXG của Google theo yêu cầu.

  4. Bắt đầu webpkgserver.

    ./webpkgserver
    

    Nếu máy chủ đã khởi động thành công, bạn sẽ thấy thông báo nhật ký sau: shell Listening at 127.0.0.1:8080 Successfully retrieved valid OCSP. Writing to cache in /private/tmp/webpkg

    Thông điệp nhật ký của bạn có thể trông hơi khác. Cụ thể, thư mục mà webpkgserver dùng để lưu các chứng chỉ vào bộ nhớ đệm sẽ khác nhau tuỳ theo hệ điều hành.

    Nếu bạn không thấy những thông báo này, hãy khắc phục sự cố đầu tiên bước đầu tiên là kiểm tra kỹ webpkgserver.toml.

    Nếu cập nhật webpkgserver.toml, bạn nên khởi động lại webpkgserver.

  5. Khởi chạy Chrome bằng lệnh sau đây: shell /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --user-data-dir=/tmp/udd \ --ignore-certificate-errors-spki-list=`openssl x509 -noout -pubkey -in cert.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64`

    Lệnh này hướng dẫn Chrome bỏ qua các lỗi chứng chỉ liên quan cùng với cert.pem. Điều này giúp bạn có thể thử nghiệm SXG thông qua một quy trình kiểm thử chứng chỉ. Nếu Chrome khởi chạy mà không có lệnh này, hãy kiểm tra cơ chế SXG trong Công cụ cho nhà phát triển sẽ hiển thị lỗi Certificate verification error: ERR_CERT_INVALID.

    Lưu ý:

    Bạn có thể cần điều chỉnh lệnh này để phản ánh vị trí của Chrome trên máy của bạn cũng như vị trí của cert.pem. Nếu bạn đã thực hiện việc này Nếu bạn chính xác, bạn sẽ thấy một cảnh báo hiển thị bên dưới thanh địa chỉ. Chiến lược phát hành đĩa đơn cảnh báo sẽ tương tự như sau: You are using an unsupported command-line flag: --ignore-certificate-errors-spki-list=9uxADcgc6/ho0mJLRMBcOjfBaN21k0sOInoMchr9CMY=.

    Nếu cảnh báo không bao gồm chuỗi băm, thì bạn đã đặt sai cho biết vị trí của chứng chỉ SXG.

  6. Mở thẻ Mạng trong Công cụ cho nhà phát triển, sau đó truy cập vào URL sau: http://localhost:8080/priv/doc/https://example.com.

    Thao tác này sẽ gửi yêu cầu đến thực thể webpackager đang chạy lúc http://localhost:8080 cho SXG có chứa nội dung của https://example.com. /priv/doc/ là điểm cuối API mặc định được sử dụng bởi webpackager.

    Ảnh chụp màn hình thẻ Mạng trong Công cụ cho nhà phát triển, trong đó cho thấy một cơ chế SXG và chứng chỉ tương ứng.

    Các tài nguyên sau được liệt kê trong thẻ Mạng:

    • Tài nguyên có kiểu signed-exchange. Đây là cơ chế SXG.
    • Tài nguyên có kiểu cert-chain+cbor. Đây là chứng chỉ SXG. Chứng chỉ SXG phải dùng định dạng application/cert-chain+cbor.
    • Tài nguyên có kiểu document. Đây là nội dung được phân phối qua SXG.

    Nếu bạn không thấy các tài nguyên này, hãy thử xoá bộ nhớ đệm của trình duyệt, sau đó đang tải lại http://localhost:8080/priv/doc/https://example.com.

    Nhấp vào thẻ Xem trước để xem thêm thông tin về Trao đổi có chữ ký và chữ ký của tài khoản đó.

    Ảnh chụp màn hình thẻ Xem trước cho thấy cơ chế SXG

Phân phát các sàn giao dịch có chữ ký bằng chứng chỉ CanSignHttpExchanges

Các hướng dẫn trong phần này giải thích cách phân phát SXG thông qua Chứng chỉ CanSignHttpExchanges. Để sử dụng SXGs chính thức, bạn phải có Chứng chỉ CanSignHttpExchanges.

Để ngắn gọn, những hướng dẫn này được viết với giả định bạn hiểu các khái niệm được thảo luận trong bài viết Thiết lập cơ chế trao đổi có chữ ký bằng cách tự ký chứng chỉ .

Điều kiện tiên quyết

  • Bạn có chứng chỉ CanSignHttpExchanges. Chiến dịch này trang liệt kê các CA cung cấp loại chứng chỉ này.

  • Nếu chưa có chứng chỉ, bạn có thể định cấu hình webpkgserver để tự động truy xuất chứng chỉ từ CA của bạn. Bạn có thể làm theo hướng dẫn cho những gì diễn ra trong webpkgserver.toml trong này trang.

  • Mặc dù không bắt buộc nhưng chúng tôi đặc biệt khuyên bạn nên chạy webpkgserver sau một máy chủ cạnh. Nếu không sử dụng máy chủ biên, bạn sẽ cần định cấu hình các tuỳ chọn TLS.PEMFileTLS.KeyFile trong webpkgserver.toml. Theo mặc định, webpkgserver chạy trên HTTP. Tuy nhiên, SXG chứng chỉ phải được phân phối qua HTTPS để được trình duyệt coi là hợp lệ. Việc định cấu hình TLS.PEMFileTLS.KeyFile sẽ cho phép webpkgserver sử dụng HTTPS rồi phân phát chứng chỉ SXG trực tiếp cho trình duyệt.

Hướng dẫn

  1. Tạo tệp PEM bằng cách nối chứng chỉ SXG của trang web, sau đó là chứng chỉ CA trang web của bạn. Bạn có thể xem thêm hướng dẫn về vấn đề này tại đây.

    PEM là định dạng tệp thường được dùng làm "vùng chứa" để lưu trữ nhiều chứng chỉ.

  2. Tạo một tệp webpkgsever.toml mới bằng cách sao chép ví dụ.

    cp ./webpkgserver.example.toml ./webpkgserver.toml
    
  3. Mở webpkgserver.toml bằng trình chỉnh sửa mà bạn chọn và thực hiện những thay đổi sau:

    • Thay đổi dòng PEMFile = cert.pem để phản ánh vị trí của PEM chứa chuỗi chứng chỉ đầy đủ của mình.
    • Thay đổi dòng KeyFile = 'priv.key' để phản ánh vị trí của khoá riêng tư tương ứng với Tệp PEM của bạn.
    • Thay đổi dòng Domain = 'example.org' để phản ánh trang web của bạn.
    • (Không bắt buộc) Để webpkgserver tự động gia hạn chứng chỉ SXG mỗi lần 90 ngày (45 ngày đối với Google), hãy định cấu hình các tuỳ chọn trong phần [SXG.ACME] của webpkgserver.toml. Tuỳ chọn này chỉ áp dụng cho các trang web có DigiCert hoặc Google ACME thiết lập tài khoản.
  4. Định cấu hình máy chủ biên để chuyển tiếp lưu lượng truy cập đến webpkgserver thực thể.

    Có hai loại yêu cầu chính được webpkgserver xử lý: yêu cầu cho SXG (được phân phát bởi điểm cuối /priv/doc/) và các yêu cầu cho chứng chỉ SXG (được điểm cuối /webpkg/cert/ phân phát). Chiến lược phát hành đĩa đơn Quy tắc viết lại URL cho từng loại yêu cầu này có thể khác nhau đôi chút. Cho để biết thêm thông tin, hãy xem bài viết Chạy phía sau cạnh giao diện người dùng máy chủ.

    Lưu ý:

    Theo mặc định, webpkgserver cung cấp chứng chỉ SXG tại /webpkg/cert/$CERT_HASH (ví dụ: /webpkg/cert/-0QmE0gvoedn92gtwI3s7On9zPevJGm5pn2RYhpZxgY. Để tạo $CERT_HASH, hãy chạy lệnh sau: shell openssl base64 -in cert.pem -d | openssl dgst -sha256 -binary | base64 | tr /+ _- | tr -d =