뭔가 빠졌습니까? 이것이 자체 서명 된 인증서를 작성하는 올바른 방법입니까?
자체 서명 된 인증서를 쉽게 만들 수 있습니다. 당신은 openssl req
명령을 사용합니다 . 브라우저 및 명령 줄 도구와 같이 가장 다양한 클라이언트가 사용할 수있는 클라이언트를 만드는 것은 까다로울 수 있습니다.
브라우저에는 자체 요구 사항이 있으며 IETF 보다 제한적이므로 어렵습니다 . 브라우저가 사용하는 요구 사항은 CA / 브라우저 포럼에 설명되어 있습니다 (아래 참조 참조). 제한 사항은 (1) 트러스트 앵커 및 (2) DNS 이름의 두 가지 주요 영역에서 발생합니다.
최신 브라우저 (2014/2015에서 사용중인 warez와 같은)는 트러스트 앵커에 연결되는 인증서를 원하며 인증서에서 특정 방식으로 DNS 이름을 제시하기를 원합니다. 그리고 브라우저는 자체 서명 된 서버 인증서에 대해 적극적으로 움직이고 있습니다.
일부 브라우저에서는 자체 서명 된 서버 인증서를 쉽게 가져올 수 없습니다. 실제로 Android 브라우저와 같은 일부 브라우저에서는 사용할 수 없습니다. 따라서 완전한 해결책은 자신의 권한이되는 것입니다.
자신의 권한이없는 경우 인증서의 성공 가능성을 높이려면 DNS 이름을 가져와야합니다. 그러나 나는 당신이 당신의 자신의 권위가 되길 바랍니다. 자신의 권위가되기가 쉬우 며 모든 신뢰 문제를 회피 할 것입니다 (자신보다 신뢰하는 것이 더 나은가?).
이것은 아마도 당신이 찾고있는 사이트가 아닙니다!
사이트의 보안 인증서를 신뢰할 수 없습니다!
브라우저는 미리 정의 된 트러스트 앵커 목록을 사용하여 서버 인증서의 유효성을 검사하기 때문입니다. 자체 서명 된 인증서는 신뢰할 수있는 앵커에 다시 연결되지 않습니다.
이것을 피하는 가장 좋은 방법은 다음과 같습니다.
- 자신의 권한을 만듭니다 (즉, CA가 됨 )
- 서버에 대한 인증서 서명 요청 (CSR) 작성
- CA 키로 서버의 CSR에 서명
- 서버에 서버 인증서를 설치하십시오.
- 클라이언트에 CA 인증서 설치
1 단계- 자신의 권한 을 생성하는 것은 CA: true
적절한 키 사용과 자체 서명 된 인증서를 생성하는 것을 의미 합니다. 즉, 주체 와 발급자 가 동일한 엔터티이고 CA가 기본 제약 조건 에서 중요로 설정되어 있고 (중요로 표시되어야 함) 키 사용이 keyCertSign
있고 crlSign
(CRL을 사용하는 경우) 주체 키 식별자 (SKI)가 권한 키 식별자 (AKI) 와 동일합니다 .
자체 인증 기관이 되려면 * 인증 기관 에 인증서 서명 요청에 어떻게 서명합니까?를 참조하십시오. 스택 오버플로. 그런 다음 브라우저에서 사용하는 신뢰 저장소로 CA를 가져 오십시오.
2-4 단계는 Startcom 또는 CAcert 와 같은 CA의 서비스를 등록 할 때 공용 서버에 대해 대략 수행하는 작업 입니다. 1 단계와 5 단계를 사용하면 제 3 자 권한을 피하고 자신의 권한으로 행동 할 수 있습니다 (자신보다 신뢰하는 것이 더 낫습니까?).
브라우저 경고를 피하는 다음 가장 좋은 방법은 서버의 인증서를 신뢰하는 것입니다. 그러나 Android의 기본 브라우저와 같은 일부 브라우저는 허용하지 않습니다. 따라서 플랫폼에서 작동하지 않습니다.
자체 서명 된 인증서를 신뢰 하지 않는 브라우저 (및 기타 유사한 사용자 에이전트)의 문제는 사물 인터넷 (IoT)에서 큰 문제가 될 것입니다. 예를 들어 서모 스탯이나 냉장고에 연결하여 프로그래밍하면 어떻게됩니까? 대답은 사용자 경험에 관한 한 아무 것도 아닙니다.
W3C의 WebAppSec 실무 그룹이이 문제를 살펴보기 시작했습니다. 예를 들어 제안 : HTTP를 비보안으로 표시 를 참조하십시오 .
OpenSSL을 사용하여 자체 서명 된 인증서를 만드는 방법
아래 명령과 구성 파일은 자체 서명 인증서를 작성합니다 (서명 요청 작성 방법도 표시 함). 자체 서명 된 인증서에 사용 된 DNS 이름은 CN (일반 이름)이 아니라 SAN (주체 대체 이름 )에 있습니다.
DNS 이름은 구성 파일을 통해 SAN에 배치됩니다 subjectAltName = @alternate_names
(명령 행을 통해 수행 할 수있는 방법은 없습니다). 그런 다음 alternate_names
구성 파일에 섹션이 있습니다 (사용자의 취향에 맞게 조정해야 함).
[ 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
이 때문에 SAN이 아닌 CN에서 DNS 이름을 넣어하는 것이 중요 모두 는 IETF와 CA는 / 브라우저 포럼 연습을 지정합니다. 또한 CN의 DNS 이름은 더 이상 사용되지 않도록 지정하지만 금지되지는 않습니다. 경우 당신이 CN의 DNS 이름을 넣어, 다음은 해야한다 는 CA / B 정책 아래에있는 SAN에 포함. 따라서 주체 대체 이름 사용을 피할 수 없습니다.
SAN에 DNS 이름을 입력하지 않으면 CA / 브라우저 포럼 지침을 따르는 브라우저 및 기타 사용자 에이전트에서 인증서의 유효성이 검사되지 않습니다.
관련 : 브라우저는 CA / Browser Forum 정책을 따릅니다. IETF 정책이 아닙니다. 이것이 OpenSSL로 생성 된 인증서 (일반적으로 IETF를 따르는)가 때때로 브라우저에서 유효성을 검사하지 않는 이유 중 하나입니다 (브라우저는 CA / B를 따릅니다). 그들은 서로 다른 표준이며, 발행 정책과 검증 요구 사항이 다릅니다.
자체 서명 인증서를 작성하십시오 ( -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
서명 요청을 작성하십시오 ( -x509
옵션 이 없음에 유의하십시오).
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
자체 서명 인증서를 인쇄하십시오 .
openssl x509 -in example-com.cert.pem -text -noout
서명 요청을 인쇄하십시오 .
openssl req -in example-com.req.pem -text -noout
구성 파일 ( -config
옵션을 통해 전달 )
[ 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
Chrome에 대해 다음을 수행해야 할 수 있습니다. 그렇지 않으면 Chrome에서 일반 이름 이 잘못 되었다고 불평 할 수 있습니다 ( ERR_CERT_COMMON_NAME_INVALID
) . SAN의 IP 주소와이 인스턴스의 CN 사이의 관계가 무엇인지 잘 모르겠습니다.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
X.509 / PKIX 인증서의 DNS 이름 처리에 관한 다른 규칙이 있습니다. 규칙은 다음 문서를 참조하십시오.
RFC 6797 및 RFC 7469는 다른 RFC 및 CA / B 문서보다 제한적이므로 나열되어 있습니다. RFC 6797 및 7469 는 IP 주소도 허용 하지 않습니다 .