openssl req -x509 -ngày 365 -newkey rsa: 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt
Bạn không thể sử dụng lệnh này để tạo chứng chỉ X.509 được hình thành tốt. Nó sẽ không đúng định dạng vì tên máy chủ được đặt trong Tên chung (CN) . Việc đặt tên máy chủ hoặc Địa chỉ IP trong CN không được chấp nhận bởi cả IETF (hầu hết các công cụ, như wget
và curl
) và Diễn đàn CA / B (CA và Trình duyệt).
Theo cả Diễn đàn IETF và CA / B, Tên máy chủ và Địa chỉ IP luôn đi trong Tên thay thế chủ đề (SAN) . Để biết các quy tắc, hãy xem RFC 5280, Internet X.509 Chứng chỉ cơ sở hạ tầng khóa công khai và danh sách thu hồi chứng chỉ (CRL) và các yêu cầu cơ bản của diễn đàn CA / Trình duyệt .
Bạn chủ yếu cần sử dụng tệp cấu hình OpenSSL và điều chỉnh nó cho phù hợp với nhu cầu của bạn. Dưới đây là một ví dụ về một cái tôi sử dụng. Nó được gọi example-com.conf
và được chuyển đến lệnh OpenSSL thông qua -config example-com.conf
.
Cũng thế lưu ý tốt : tất cả các máy tự xưng là localhost
, localhost.localdomain
vv Hãy cẩn thận về cấp giấy chứng nhận cho localhost
. Tôi không nói đừng làm điều đó; chỉ cần hiểu có một số rủi ro liên quan.
Các lựa chọn thay thế localhost
là: (1) chạy DNS và cấp chứng chỉ cho tên DNS của máy. Hoặc, (2) sử dụng IP tĩnh và bao gồm địa chỉ IP tĩnh.
Các trình duyệt vẫn sẽ cung cấp cho bạn các cảnh báo về chứng chỉ tự ký không nối lại với một gốc đáng tin cậy. Các công cụ thích curl
và wget
sẽ không phàn nàn, nhưng bạn vẫn cần tin tưởng vào bản thân mình đã ký với một tùy chọn như cURL --cafile
. Để khắc phục vấn đề tin cậy Trình duyệt, bạn phải trở thành CA của chính mình.
"Trở thành CA của riêng bạn" được gọi là chạy PKI riêng. Không có gì nhiều cho nó. Bạn có thể làm mọi thứ mà CA công cộng có thể làm. Điều duy nhất khác nhau là bạn sẽ cần phải cài đặt của bạn Certificate Root CA trong các cửa hàng khác nhau. Nó không khác gì, nói, sử dụng cURL cacerts.pm
. cacerts.pm
chỉ là một bộ sưu tập của Root CA, và bây giờ bạn đã tham gia câu lạc bộ.
Nếu bạn trở thành CA của riêng bạn, thì hãy chắc chắn ghi khóa riêng của Root CA vào đĩa và giữ nó ngoại tuyến. Sau đó bật nó vào ổ đĩa CD / DVD khi bạn cần ký yêu cầu ký. Bây giờ bạn đang cấp chứng chỉ giống như CA công cộng.
Không có gì trong số này là cực kỳ khó khăn khi bạn ký một hoặc hai yêu cầu ký. Tôi đã điều hành PKI tư nhân trong nhiều năm tại nhà. Tất cả các thiết bị và tiện ích của tôi tin tưởng CA.
Để biết thêm thông tin về việc trở thành CA của riêng bạn, hãy xem Cách bạn ký Yêu cầu ký chứng chỉ với Cơ quan chứng nhận của bạn và Cách tạo chứng chỉ tự ký với openssl? .
Từ các ý kiến trong tập tin cấu hình bên dưới ...
Tự ký (lưu ý thêm -x509)
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
Yêu cầu ký tên (lưu ý thiếu -x509)
openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
In một bản 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
# Self Signed (note the addition of -x509):
# 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
# Signing Request (note the lack of -x509):
# openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
# Print it:
# openssl x509 -in example-com.cert.pem -text -noout
# openssl req -in example-com.req.pem -text -noout
[ 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).
# It's 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
# If RSA Key Transport bothers you, then remove keyEncipherment. TLS 1.3 is removing RSA
# Key Transport in favor of exchanges with Forward Secrecy, like DHE and ECDHE.
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
# 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
# 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
# DNS.9 = fe80::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
Centos 7 / Vagrant / Chrome Browser
.