Tui bỏ lỡ điều gì vậy? Đây có phải là cách chính xác để xây dựng một chứng chỉ tự ký?
Thật dễ dàng để tạo một chứng chỉ tự ký. Bạn chỉ cần sử dụng openssl req
lệnh. Thật khó để tạo ra một thứ có thể được sử dụng bởi sự lựa chọn lớn nhất của các máy khách, như các trình duyệt và các công cụ dòng lệnh.
Điều này thật khó khăn vì các trình duyệt có các yêu cầu riêng và chúng hạn chế hơn IETF . Các yêu cầu được sử dụng bởi các trình duyệt được ghi lại tại Diễn đàn CA / Trình duyệt (xem tài liệu tham khảo bên dưới). Các hạn chế phát sinh trong hai lĩnh vực chính: (1) neo tin cậy và (2) tên DNS.
Các trình duyệt hiện đại (như warez chúng tôi đang sử dụng vào năm 2014/2015) muốn có một chứng chỉ gắn lại với một neo tin cậy và họ muốn các tên DNS được trình bày theo những cách cụ thể trong chứng chỉ. Và các trình duyệt đang tích cực di chuyển chống lại chứng chỉ máy chủ tự ký.
Một số trình duyệt không chính xác giúp bạn dễ dàng nhập chứng chỉ máy chủ tự ký. Thực tế, bạn không thể với một số trình duyệt, như trình duyệt của Android. Vì vậy, giải pháp hoàn chỉnh là trở thành chính quyền của bạn.
Trong trường hợp không trở thành chính quyền của bạn, bạn phải có được tên DNS để cung cấp cho chứng chỉ cơ hội thành công lớn nhất. Nhưng tôi sẽ khuyến khích bạn trở thành chính quyền của bạn. Thật dễ dàng để trở thành chính quyền của bạn, và nó sẽ vượt qua tất cả các vấn đề về niềm tin (ai tin tưởng hơn chính bạn?).
Đây có lẽ không phải là trang web bạn đang tìm kiếm!
Chứng chỉ an toàn của trang web không đáng tin cậy!
Điều này là do các trình duyệt sử dụng danh sách các neo tin cậy được xác định trước để xác thực chứng chỉ máy chủ. Chứng chỉ tự ký không xâu chuỗi trở lại một mỏ neo đáng tin cậy.
Cách tốt nhất để tránh điều này là:
- Tạo thẩm quyền của riêng bạn (nghĩa là trở thành CA )
- Tạo yêu cầu ký chứng chỉ (CSR) cho máy chủ
- Ký CSR của máy chủ bằng khóa CA của bạn
- Cài đặt chứng chỉ máy chủ trên máy chủ
- Cài đặt chứng chỉ CA trên máy khách
Bước 1 - Tạo thẩm quyền của riêng bạn chỉ có nghĩa là tạo chứng chỉ tự ký với CA: true
và sử dụng khóa thích hợp. Điều đó có nghĩa là Chủ thể và Nhà phát hành là cùng một thực thể, CA được đặt thành đúng trong các ràng buộc cơ bản (nó cũng phải được đánh dấu là quan trọng), việc sử dụng khóa là keyCertSign
và crlSign
(nếu bạn đang sử dụng CRL) và Mã định danh khóa chủ đề (SKI) là giống như Mã định danh khóa thẩm quyền (AKI).
Để trở thành cơ quan cấp chứng chỉ của riêng bạn, hãy xem * Làm thế nào để bạn ký yêu cầu ký chứng chỉ với cơ quan chứng nhận của bạn? trên Stack Overflow. Sau đó, nhập CA của bạn vào Cửa hàng ủy thác được trình duyệt sử dụng.
Bước 2 - 4 gần như là những gì bạn làm bây giờ cho một máy chủ đối mặt công khai khi bạn tranh thủ các dịch vụ của CA như Startcom hoặc CAcert . Bước 1 và 5 cho phép bạn tránh quyền hạn của bên thứ ba và đóng vai trò là người có thẩm quyền của riêng bạn (ai tin tưởng hơn chính bạn?).
Cách tốt nhất tiếp theo để tránh cảnh báo của trình duyệt là tin tưởng vào chứng chỉ của máy chủ. Nhưng một số trình duyệt, như trình duyệt mặc định của Android, không cho phép bạn làm điều đó. Vì vậy, nó sẽ không bao giờ hoạt động trên nền tảng.
Vấn đề trình duyệt (và các tác nhân người dùng tương tự khác) không tin tưởng các chứng chỉ tự ký sẽ là một vấn đề lớn trong Internet of Things (IoT). Ví dụ, điều gì sẽ xảy ra khi bạn kết nối với bộ điều chỉnh nhiệt hoặc tủ lạnh để lập trình nó? Câu trả lời là, không có gì tốt khi có liên quan đến trải nghiệm người dùng.
Nhóm làm việc WebAppSec của W3C đang bắt đầu xem xét vấn đề. Xem, ví dụ : Đề xuất: Đánh dấu HTTP là không an toàn .
Cách tạo chứng chỉ tự ký với OpenSSL
Các lệnh bên dưới và tệp cấu hình tạo chứng chỉ tự ký (nó cũng chỉ cho bạn cách tạo yêu cầu ký). Chúng khác với các câu trả lời khác ở một khía cạnh: tên DNS được sử dụng cho chứng chỉ tự ký có trong Tên thay thế chủ đề (SAN) và không phải là Tên chung (CN) .
Tên DNS được đặt trong SAN thông qua tệp cấu hình với dòng subjectAltName = @alternate_names
(không có cách nào để thực hiện thông qua dòng lệnh). Sau đó, có một alternate_names
phần trong tệp cấu hình (bạn nên điều chỉnh phần này cho phù hợp với sở thích của bạn):
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# IP.1 = 127.0.0.1
# IP.2 = ::1
Điều quan trọng là phải đặt tên DNS trong SAN chứ không phải CN, bởi vì cả IETF và Diễn đàn CA / Trình duyệt đều chỉ định thực tiễn. Họ cũng chỉ định rằng tên DNS trong CN không được chấp nhận (nhưng không bị cấm). Nếu bạn đặt tên DNS trong CN, thì nó phải được đưa vào SAN theo chính sách CA / B. Vì vậy, bạn không thể tránh sử dụng Tên thay thế chủ đề.
Nếu bạn không đặt tên DNS trong SAN, thì chứng chỉ sẽ không thể xác thực theo trình duyệt và các tác nhân người dùng khác tuân theo hướng dẫn của Diễn đàn CA / Trình duyệt.
Liên quan: các trình duyệt tuân theo các chính sách của CA / Browser Forum; và không phải là chính sách của IETF. Đó là một trong những lý do chứng chỉ được tạo bằng OpenSSL (thường đi theo IETF) đôi khi không xác thực theo trình duyệt (trình duyệt tuân theo CA / B). Chúng là các tiêu chuẩn khác nhau, chúng có các chính sách ban hành khác nhau và các yêu cầu xác nhận khác nhau.
Tạo chứng chỉ tự ký (chú ý thêm -x509
tùy chọn):
openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.cert.pem
Tạo một yêu cầu ký (lưu ý thiếu -x509
tùy chọn):
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
In chứng chỉ tự ký :
openssl x509 -in example-com.cert.pem -text -noout
In một yêu cầu ký :
openssl req -in example-com.req.pem -text -noout
Tập tin cấu hình (thông qua -config
tùy chọn)
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
# Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
# IPv6 localhost
# DNS.8 = ::1
Bạn có thể cần thực hiện các thao tác sau cho Chrome. Nếu không, Chrome có thể khiếu nại Tên chung không hợp lệ ( ERR_CERT_COMMON_NAME_INVALID
) . Tôi không chắc mối quan hệ giữa địa chỉ IP trong SAN và CN trong trường hợp này là gì.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
Có các quy tắc khác liên quan đến việc xử lý tên DNS trong chứng chỉ X.509 / PKIX. Tham khảo các tài liệu này cho các quy tắc:
RFC 6797 và RFC 7469 được liệt kê, vì chúng hạn chế hơn các tài liệu RFC và CA / B khác. RFC 6797 và 7469 cũng không cho phép địa chỉ IP.