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

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

Katie Hempenius
Katie Hempenius

Cơ chế trao đổi có chữ ký (SXG) là một cơ chế phân phối giúp xác thực nguồn gốc của một tài nguyên độc lập với cách tài nguyên đó được phân phối. Các hướng dẫn sau đây giải thích cách thiết lập cơ chế Trao đổi có chữ ký bằng Web Packager. Chúng tôi đưa ra hướng dẫn cho cả chứng chỉ tự ký và chứng chỉ CanSignHttpExchanges.

Dùng chứng chỉ tự ký để phân phát nội dung cho SXG

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ử. Những SXG ký bằng một chứng chỉ tự ký sẽ tạo ra thông báo lỗi trong trình duyệt khi được dùng bên ngoài môi trường thử nghiệm và sẽ 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ài đặt opensslGo trong môi trường phát triển của mình.

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

Phần này giải thích cách tạo chứng chỉ tự ký có thể dùng với cơ chế trao đổi có chữ ký.

Hướng dẫn

  1. Tạo 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 yêu cầu ký chứng chỉ (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 mã hoá, truyền tải thông tin cần thiết để yêu cầu chứng chỉ từ mộ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ừ một CA, nhưng bạn vẫn cần tạo một 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 một tổ chức tên là Web Packager Demotên chung example.com. 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ưới dạng SXG.

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

  3. Tạo một 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á riêng tư và CSR đã tạo trong 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 phần mở rộng chứng chỉ CanSignHttpExchanges (1.3.6.1.4.1.11129.2.1.22giá trị nhận dạng đối tượng cho phần mở rộng CanSignHttpExchanges). Ngoài ra, cờ -extfile cũng xác định example.comSubject Alternative Name (Tên thay thế cho chủ đề).

    Nếu muốn tìm hiểu về nội dung của cert.pem, bạn có thể xem nội dung đó bằng cách sử dụng lệnh sau:

    openssl x509 -in cert.pem -noout -text
    

    Bạn đã hoàn tất việc tạo khóa riêng tư và chứng chỉ. Bạn sẽ cần có các tệp 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. Tạo 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 bạn đã cài đặt webpkgserver đúng cách.

    ./webpkgserver --help
    

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

Hướng dẫn

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

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

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

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

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

    • 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. Đừ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 dòng đề 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 chứng chỉ SXG. Thông tin này được dùng để đặt tham số cert-url trong tiêu đề Signature của SXG. Trong môi trường thực tế, CertURLBase được sử dụng như sau: CertURLBase = 'https://mysite.com/'. Tuy nhiên, đối với kiểm thử cục bộ, bạn có thể sử dụng CertURLBase = 'data:' để hướng dẫn webpkgserver sử dụng một URL dữ liệu để cùng dòng chứng chỉ trong trường cert-url. Đối với quy trình kiểm thử cục bộ, đây là cách phù hợp 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ỉ. Nếu bạn đã làm theo đúng hướng dẫn trong bài viết này, thì mã này sẽ được đổi thành example.com. webpkgserver sẽ chỉ tìm nạp nội dung từ miền mà webpkgserver.toml chỉ định. Nếu bạn cố gắng tìm nạp các trang từ một miền khác mà không cập nhật webpkgserver.toml, thì nhật ký webpkgserver sẽ cho thấy 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ính năng tải trước tài nguyên phụ, các tuỳ chọn cấu hình webpkgserver.toml sau đây là có liên quan:

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

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

    • Theo mặc định, webpkgserver sẽ thay thế các thẻ <link rel="preload"> hiện có bằng các thẻ <link> tương đương cần thiết để tìm nạp nội dung này dưới dạng SXG. Để làm như vậy, webpkgserver sẽ thiết lập lệnh allowed-alt-sxgheader-integrity nếu cần – tác giả HTML không cần thêm các lệnh này theo cách thủ công. Để ghi đè hành vi này và giữ lại các nội dung tải trước hiện có không phải SXG, hãy 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 dùng bộ nhớ đệm cho SXG của Google theo các yêu cầu này.

  4. Bắt đầu webpkgserver.

    ./webpkgserver
    

    Nếu máy chủ đã khởi động thành công, bạn sẽ thấy các thông điệp 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 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, thì bước khắc phục sự 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. Chạy Chrome bằng lệnh sau: 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 kết với cert.pem. Nhờ vậy, bạn có thể kiểm thử SXG bằng cách sử dụng chứng chỉ kiểm thử. Nếu bạn chạy Chrome mà không có lệnh này, thì việc kiểm tra SXG trong Công cụ cho nhà phát triển sẽ cho thấy lỗi Certificate verification error: ERR_CERT_INVALID.

    Lưu ý:

    Bạn có thể cần phải điều chỉnh lệnh này để phản ánh vị trí của Chrome trên máy của mình, cũng như vị trí của cert.pem. Nếu đã thực hiện đúng cách, bạn sẽ thấy một cảnh báo xuất hiện bên dưới thanh địa chỉ. 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 có chuỗi băm, tức là bạn chưa chỉ báo chính xác vị trí của chứng chỉ SXG.

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

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

    Ảnh chụp màn hình thẻ Mạng cho nhà phát triển cho thấy một SXG và chứng chỉ của SXG.

    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à 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 cơ chế 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 đó 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 cơ chế này.

    Ảnh chụp màn hình thẻ Preview (Xem trước) cho thấy một SXG

Phân phát cơ chế trao đổi có chữ ký bằng chứng chỉ CanSignHttpExchanges

Hướng dẫn trong phần này giải thích cách phân phát cơ chế SXG bằng chứng chỉ CanSignHttpExchanges. Để sử dụng SXG thì bạn phải có chứng chỉ CanSignHttpExchanges thì mới dùng được.

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

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

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

  • Nếu không 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 mình. Bạn có thể làm theo hướng dẫn cho chuyến đi đến webpkgserver.toml trên trang này.

  • Mặc dù không bắt buộc, nhưng bạn nên chạy webpkgserver phía sau một máy chủ cạnh. Nếu không sử dụng máy chủ cạnh, bạn 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 qua HTTP. Tuy nhiên, chứng chỉ SXG phải được phân phát qua HTTPS thì mới được trình duyệt coi là hợp lệ. Việc định cấu hình TLS.PEMFileTLS.KeyFile cho phép webpkgserver sử dụng HTTPS, do đó, sẽ trực tiếp phân phát chứng chỉ SXG đến trình duyệt.

Hướng dẫn

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

    PEM là một định dạng tệp thường 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 các thay đổi sau:

    • Thay đổi dòng PEMFile = cert.pem để phản ánh vị trí của tệp PEM chứa chuỗi chứng chỉ đầy đủ của bạn.
    • 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.
    • 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 90 ngày một lần (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ó chế độ thiết lập tài khoản DigiCert hoặc tài khoản Google ACME của Google.
  4. Định cấu hình máy chủ cạnh của bạn để chuyển tiếp lưu lượng truy cập đến thực thể webpkgserver.

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

    Lưu ý:

    Theo mặc định, webpkgserver sẽ phân phát chứng chỉ SXG tại /webpkg/cert/$CERT_HASH, chẳng hạn như /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 =