localhost에 대한 자체 서명 인증서를 작성하는 방법은 무엇입니까?


23

비밀번호로 다음 필드를 루트로 사용했습니다.

openssl req -x509 -days 365 -newkey rsa:2048 -keyout /etc/ssl/apache.key \
    -out /etc/ssl/apache.crt

전지

Country: FI
State: Pirkanmaa
Locality: Tampere
Organization: masi
Organizational Unit Name: SSL Certificate Test
CommonName: 192.168.1.107/owncloud
EmailAddress: masi@gmail.com

출력 : HTTPS에서 SSL 핸드 셰이크 오류. 예상 출력 : HTTPS 연결. HTTP가 작동합니다.

CommonName에는 가고자하는 URL, owncloud의 스레드 here 이 포함되어야 합니다 . 나는 commonname에서 실패했습니다

  • 192.168.1.107/owncloud
  • 192.168.1.107/

서버용 테스트 OS : Debian 8.5.
서버 : Raspberry Pi 3b. 자체 클라우드 서버 : 8.2.5. 자체 클라우드 클라이언트 : 2.1.1. 시스템 클라이언트 : 데비안 8.5.


localhost에 SAN을 사용하여 새 SSL 인증서를 생성하려는 경우이 게시물의 단계가 도움 되었습니다 Centos 7 / Vagrant / Chrome Browser.
Damodar Bashyal

@DamodarBashyal 링크 전용 답변을 제공하지 말고 일부 설명도 답변으로 제공하십시오.
Léo Léopold Hertz 준영

답변:


11

openssl req -x509 -days 365 -newkey rsa : 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt

이 명령을 사용하여 올바른 형식의 X.509 인증서를 생성 할 수 없습니다. 호스트 이름이 CN (공통 이름 )에 배치 되었기 때문에 형식이 잘못되었습니다 . CN의 호스트 이름 또는 IP 주소를 배치하면 (같은 대부분의 도구를 IETF 모두에 의해 사용되지 않습니다 wgetcurl)과 CA / B 포럼 (CA의 및 브라우저).

IETF 및 CA / B 포럼에 따르면 서버 이름과 IP 주소는 항상 주체 대체 이름 (SAN)에 있습니다. 규칙은 RFC 5280, Internet X.509 공개 키 인프라 인증서 및 CRL (인증서 해지 목록) 프로필CA / 브라우저 포럼 기준 요구 사항을 참조하십시오 .

대부분 OpenSSL 구성 파일을 사용하고 필요에 맞게 조정해야합니다. 아래는 내가 사용하는 예입니다. 이라고 example-com.conf하며을 통해 OpenSSL 명령으로 전달됩니다 -config example-com.conf.


또한 충분히주의 : 모든 기계는 주장 localhost, localhost.localdomain등, 인증서를 발행에주의 localhost. 나는 하지 말라고 말하는 것이 아닙니다 . 관련된 위험이 있음을 이해하십시오.

대안은 localhost다음과 같습니다 컴퓨터의 DNS 이름 (1) 실행 DNS 인증서를 발급. 또는 (2) 고정 IP를 사용하고 고정 IP 주소를 포함하십시오.


브라우저는 여전히 신뢰할 수있는 루트로 다시 연결 되지 않는 자체 서명 된 인증서에 대한 경고를 표시 합니다. 도구처럼 curl하고 wget불평하지 않습니다,하지만 당신은 여전히 자기 컬의 같은 옵션 서명 당신을 신뢰해야합니다 --cafile. 브라우저 신뢰 문제를 극복하려면 자신의 CA가되어야합니다.

"자신의 CA되기" 는 개인 PKI를 실행하는 것으로 알려져 있습니다. 그다지 많지 않습니다. 공공 CA가 할 수있는 모든 것을 할 수 있습니다. 유일한의 다른는 설치해야합니다 것입니다 귀하의 다양한 상점에서 루트 CA 인증서를. 예를 들어 cURL을 사용하는 것과 다르지 않습니다 cacerts.pm. cacerts.pm루트 CA의 모음 일뿐입니다. 이제 클럽에 가입했습니다.

자신의 CA가되면 루트 CA 개인 키를 디스크에 굽고 오프라인 상태로 유지하십시오. 그런 다음 서명 요청에 서명해야 할 때 CD / DVD 드라이브에 넣으십시오. 이제 공용 CA처럼 인증서를 발급합니다.

하나 또는 두 개의 서명 요청에 서명하면이 중 어느 것도 매우 어렵지 않습니다. 집에서 몇 년 동안 개인 PKI를 운영해 왔습니다. 모든 장치 및 가젯은 내 CA를 신뢰합니다.

자체 CA가되는 방법에 대한 자세한 내용은 인증 기관에서 인증서 서명 요청에 서명 하는 방법openssl을 사용하여 자체 서명 된 인증서를 만드는 방법을 참조하십시오 . .


아래 구성 파일의 주석에서 ...

자체 서명 (-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 -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

구성 파일

# 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

Chrome에 대해 다음을 수행해야 할 수 있습니다. 그렇지 않으면 Chrome에서 일반 이름 이 잘못 되었다고 불평 할 수 있습니다 ( ERR_CERT_COMMON_NAME_INVALID) . SAN의 IP 주소와이 인스턴스의 CN 사이의 관계가 무엇인지 잘 모르겠습니다.

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1

구성 파일에 기본 경로를 추가 할 수 있습니까? --당신은 완전한 작업 흐름을 보여줄 수 있습니까? openssl 명령 등으로 파일을 전달하는 방법--이전 답변으로 성공하지 못하여 필요한 모든 정보를 얻을 수 있습니다.
Léo Léopold Hertz 준영

@Masi- "구성 파일에 기본 경로를 추가 할 수 있습니까?" - 당신이 무슨 뜻인지 확실하지. 원하는 곳에 저장할 수 있습니다. 많은 컴퓨터의 데스크탑과 다른 홈 디렉토리에서 실행합니다. 나는 당신이 사용하는 것으로 나타났습니다 sudo. .rnd파일이의 소유 일 수 있습니다 root. 그렇다면을 사용해보십시오 sudo chown -R masi:masi /home/masi. 그러면 당신은 그것을 읽고 쓸 수있을 것입니다.

나는 우분투가 아닌 데비안 만 사용하고 있으므로 루트 만 사용합니다. 데스크톱에서 keepinv 파일에 대한 예제로 작업 흐름을 추가하고 전달하십시오. 시스템에 대한 명확한 그림이 없습니다.
Léo Léopold Hertz 준영

1
파일 헤드에 나열된 명령 중 하나를 실행하십시오. 복사 / 붙여 넣기에 대한 설명이 있습니다. 취향에 맞는 것을 선택하십시오. 여전히 자체 서명을 생성하려고 시도하는 x509경우 주석에 표시된대로 명령을 실행하십시오 .

저자는 "CA / B 변경으로 인해"이 게시물의 삭제를 요청했지만, 투표 수와 수년 동안 제공된 잠재적 인 도움으로 인해이 게시물을 복원했습니다. 주어진대로 게시물에 조언을 따르십시오.
Jeff Schaller

1

CommonName로 전송됩니다 무엇과 일치해야 Host: HTTP 요청에서 헤더입니다. 귀하의 경우에는 192.168.1.107 (슬래시가 없음)입니다.

웹 서버의 호스트 이름 구성

개인적으로 웹 서버에 친숙한 호스트 이름을 구성했습니다. 메일 Apache 구성 또는 가상 호스트 구성 ( /etc/apache2/sites-enabled/000-default.conf데비안 기반 배포판에 있을 가능성이있는 경우)에서 ServerName또는 ServerAlias지시문을 사용하십시오 ( 예 :

ServerName owncloud.masi

Apache를 다시 시작한 다음 DNS를 구성하거나 각 클라이언트 /etc/hosts에 올바른 IP 주소를 가리 키도록 항목을 추가 하십시오 (예 :

192.168.1.107   owncloud.masi

내 자신의 클라우드 액세스는 192.168.1.107입니다. 다른 스레드는 하위 도메인을 포함해야한다고 말합니다. 나는 그것이 의미한다고 생각한다 192.168.1.107/owncloud. 그러나 나는 틀릴 수 있습니다.
Léo Léopold Hertz 준영

ServerName owncloud.masi에서 사용한다고 가정합니다 .../sites-enabled/000-default.conf. 는 IS 으로 commonname SSL 키는 owncloud.masi ?
Léo Léopold Hertz 준영

IP 주소가 작동하지 않습니까? 마찬가지로 당신이 사용 ServerAlias?
Léo Léopold Hertz 준영

1
IP 주소를 통한 액세스는 HTTP에서 계속 작동해야합니다. BTW, 의견 한도에 도달 했으므로 (귀하의 질문에 대한 이전 답변을 삭제했습니다) 곧 오프라인 상태로 전환해야합니다.
Anthony G-

1
"CommonName은 HTTP 요청에서 Host : 헤더로 전송 된 모든 항목과 일치해야합니다 . " -잘못되었습니다. 호스트 이름을 공통 이름으로 지정하는 것은 IETF 및 CA / B 포럼에서 더 이상 사용되지 않습니다. 서버 이름과 IP 주소는 항상 IETF 및 CA / B 포럼에 따라 주제 대체 이름에 있습니다. 인증 기관에 인증서 서명 요청에 서명 하는 방법
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.