Tìm hiểu cách phân phát cơ chế trao đổi có chữ ký (SXG) bằng Trình đóng gói web.
Trao đổi có chữ ký (SXG) là một cơ chế phân phối cho phép xác thực nguồn gốc của tài nguyên một cách độc lập với cách phân phối tài nguyên đó.
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. Hướng dẫn được cung cấp cho cả chứng chỉ tự ký và chứng chỉ CanSignHttpExchanges
.
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 dùng cho mục đích minh hoạ và kiểm thử. Các tệp 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 sử dụng bên ngoài môi trường kiểm thử và không được phân phát cho trình thu thập thông tin.
Đ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 openssl và Go trong môi trường phát triể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ý có thể được sử dụng với các giao dịch ký.
Hướng dẫn
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
.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 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 có tên là
Web Packager Demo
và có tên chung làexample.com
. Tên chung 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 chế độ thiết lập SXG chính thức, đây sẽ là trang web do bạn sở hữu. Tuy nhiên, trong môi trường thử nghiệm như mô tả trong các hướng dẫn này, đó có thể là bất kỳ trang web nào.
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 được 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 tiện ích chứng chỉCanSignHttpExchanges
(1.3.6.1.4.1.11129.2.1.22
là mã nhận dạng đối tượng cho tiện íchCanSignHttpExchanges
). Ngoài ra, cờ-extfile
cũng xác địnhexample.com
là Tên thay thế của chủ đề.Nếu tò mò về nội dung của
cert.pem
, bạn có thể xem nội dung đó bằng lệnh sau:openssl x509 -in cert.pem -noout -text
Bạn đã tạo xong khoá riêng tư và chứng chỉ. Bạn sẽ cần các tệp
priv.key
vàcert.pem
trong phần tiếp theo.
Thiết lập máy chủ Trình đóng gói web để kiểm thử
Điều kiện tiên quyết
Cài đặt Web Packager (Trình đóng gói web).
git clone https://github.com/google/webpackager.git
Tạo
webpkgserver
.cd webpackager/cmd/webpkgserver go build .
webpkgserver
là một tệp nhị phân cụ thể trong dự án Trình đóng gói web.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ề cách sử dụng
webpkgserver
. Nếu cách này không hiệu quả, bước khắc phục sự cố đầu tiên nên làm là xác minh rằng GOPATH của bạn đã được định cấu hình chính xác.
Hướng dẫn
Chuyển đến thư mục
webpkgserver
(có thể bạn đã ở trong thư mục này).cd /path/to/cmd/webpkgserver
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 tuỳ chọn cấu hình cho
webpkgserver
.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
#AllowTestCert = false
thànhAllowTestCert = 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 đếnTLS.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 đếnTLS.KeyFile
– đây là một tuỳ chọn cấu hình khác. - Thay đổi dòng
#CertURLBase = '/webpkg/cert'
thànhCertURLBase = '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 phát hành công khai,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ụngCertURLBase = 'data:'
để hướng dẫnwebpkgserver
sử dụng URL dữ liệu để nội tuyến chứng chỉ trong trườngcert-url
. Đối với kiểm thử cục bộ, đây là cách thuận tiện 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 hướng dẫn trong bài viết này một cách chính xác, thì bạn nên thay đổi thànhexample.com
.webpkgserver
sẽ chỉ tìm nạp nội dung từ miền dowebpkgserver.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ậtwebpkgserver.toml
, thì nhật kýwebpkgserver
sẽ hiển thị thông báo lỗiURL 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ụ, thì các tuỳ chọn cấu hình
webpkgserver.toml
sau đây sẽ phù hợp:Để
webpkgserver
chèn các lệnh để tải trước tệp kiểu và tài nguyên phụ tập lệnh dưới dạng SXG, hãy thay đổi dòng#PreloadCSS = false
thànhPreloadCSS = true
. Ngoài ra, hãy thay đổi dòng#PreloadJS = false
thànhPreloadJS = 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 cách thủ công.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. Khi đó,webpkgserver
sẽ đặt các lệnhallowed-alt-sxg
vàheader-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 tệp tải trước không phải SXG hiện có, hãy thay đổi#KeepNonSXGPreloads (default = false)
thànhKeepNonSXGPreloads = 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 sử dụng bộ nhớ đệm SXG của Google theo các yêu cầu này.
- Thay đổi dòng
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ể hơi khác. Cụ thể, thư mục mà
webpkgserver
sử dụng để lưu chứng chỉ vào bộ nhớ đệm thay đổi tuỳ theo hệ điều hành.Nếu bạn không thấy các thông báo này, bước khắc phục sự cố đầu tiên nên làm là kiểm tra lại
webpkgserver.toml
.Nếu cập nhật
webpkgserver.toml
, bạn nên khởi động lạiwebpkgserver
.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
. Điều này cho phép bạn kiểm thử SXG bằng chứng chỉ kiểm thử. Nếu Chrome được khởi chạy mà không có lệnh này, thì việc kiểm tra SXG trong DevTools sẽ hiển thị lỗiCertificate 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ũ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ẽ có dạng 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 đã không chỉ định chính xác vị trí của chứng chỉ SXG.
Mở thẻ Mạng trong DevTools, 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 tạihttp://localhost:8080
cho một SXG chứa nội dung củahttps://example.com
./priv/doc/
là điểm cuối API mặc định màwebpackager
sử dụng.Các tài nguyên sau đây được liệt kê trong thẻ Mạng:
- Một tài nguyên có loại
signed-exchange
. Đây là SXG. - Một tài nguyên có loại
cert-chain+cbor
. Đây là chứng chỉ SXG. Chứng chỉ SXG phải sử dụng định dạngapplication/cert-chain+cbor
. - Một tài nguyên có loại
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 đó 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ề Giao dịch hoán đổi đã ký và chữ ký của giao dịch đó.
- Một tài nguyên có loại
Phân phát các giao dịch trao đổi đã 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 SXG bằng chứng chỉ CanSignHttpExchanges
. Để sử dụng SXG trong phiên bản chính thức, bạn cần có chứng chỉ CanSignHttpExchanges
.
Để ngắn gọn, 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 giao dị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. Bạn có thể làm theo hướng dẫn về nội dung cần đưa vào
webpkgserver.toml
trong 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ủ biên. 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ọnTLS.PEMFile
vàTLS.KeyFile
trongwebpkgserver.toml
. Theo mặc định,webpkgserver
chạy qua HTTP. Tuy nhiên, trình duyệt phải xem chứng chỉ SXG là hợp lệ thì mới phân phát qua HTTPS. Việc định cấu hìnhTLS.PEMFile
vàTLS.KeyFile
cho phépwebpkgserver
sử dụng HTTPS và do đó phân phát trực tiếp chứng chỉ SXG cho trình duyệt.
Hướng dẫn
Tạo tệp PEM bằng cách nối chứng chỉ SXG của trang web, theo sau là chứng chỉ CA của trang web. Bạn có thể xem thêm hướng dẫn về việc này tại đây.
PEM là một định dạng tệp thường được dùng làm "vùng chứa" để lưu trữ nhiều chứng chỉ.
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
Mở
webpkgserver.toml
bằng trình chỉnh sửa mà bạn chọn rồi 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 đủ. - 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 mỗi 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ủawebpkgserver.toml
. Lựa chọn này chỉ áp dụng cho những trang web đã thiết lập tài khoản DigiCert hoặc Google ACME.
- Thay đổi dòng
Định cấu hình máy chủ biên để chuyển tiếp lưu lượng truy cập đến thực thể
webpkgserver
.Có hai 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 sẽ khác nhau một 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
phân phát 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 =