*.local SSL 인증서 만들기

*.local SSL 인증서 만들기

모든 *.local 웹사이트가 https를 통해 실행될 수 있도록 SSL 인증서를 설정하려고 합니다. 내 모든 .local 도메인은 내 로컬 컴퓨터를 가리킵니다. 나는 웹사이트를 개발할 때 이것을 사용합니다. 많은 새로운 기능(지리적 위치, 서비스 워커 등)에는 SSL이 필요합니다.

최신 버전의 Chrome/Firefox에서는 이전 자체 서명 인증서가 더 이상 작동하지 않는 것 같습니다.

다음은 이러한 지침을 조합한 후 취한 단계입니다. https://deliciousbrains.com/https-locally-without-browser-privacy-errors/

https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/

https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo

이것은 내 구성 파일입니다.

#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName       = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = *.local

먼저 새 인증 기관을 만듭니다.

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf

여기서는 일반 이름을 내 이름으로 지정했습니다.

Common Name (hostname, IP, or your name) []:Jonathan Hodgson

그런 다음 해당 파일을 크롬의 권위 있는 파일로 가져왔고 certs/cacert.pem제대로 작동했습니다.

그런 다음 인증서 요청을 생성합니다.

openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf

여기서는 일반 이름을 *.local로 지정합니다.

Common Name (hostname, IP, or your name) []:*.local

그런 다음 요청에 서명합니다.

openssl ca -out certs/local.cert.pem  -config conf/caconfig.cnf -infiles local.req.pem

내 http 구성에 다음 파일을 추가했습니다.

<VirtualHost *:80>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
    SSLEngine On
    SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
    SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>

아파치를 다시 시작했지만 여전히NET::ERR_CERT_COMMON_NAME_INVALID

나는 이미 수행한 구성 파일에 subjectAltName을 추가해야 하기 때문이라고 생각합니다.

어떻게 다르게 해야 하는지 알려주세요.

도움을 주셔서 미리 감사드립니다.

편집하다

문제는 와일드 카드와 관련이 있다고 생각합니다. Alternate_names를 example.local로 설정하고 요청된 일반 이름을 example.local로 설정하면 example.local은 Chrome과 Firefox 모두에서 안전한 것으로 나타납니다.

localDNS.1을 로 설정 하고 DNS.2를 로 설정한 다음 크롬과 파이어폭스 *.local에 들어갔습니다 . 인증서를 생성하기 전에 반드시 직렬 및 인덱스 파일을 재설정했습니다.ERR_SSL_SERVER_CERT_BAD_FORMATSEC_ERROR_REUSED_ISSUER_AND_SERIAL

답변1

다음에 SAN을 추가합니다.기업의 사회적 책임하지만 넌 그러지 않았어caCSR을 포함한 Tell 확장인증서에서. 바라보다 https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate또는 매뉴얼 페이지ca 웹에서도존재하다copy_extensions

편집자: 당신반품구성 또는 동일하지만 덜 편리한 명령줄 옵션 x509_extensions에서 지정 해야 합니다 . 두 경우 모두 존재하는 섹션을 가리키지만 CA에서 요구하는 확장이 필요하지 않은 경우 비어 있을 수 있습니다. CSR 확장 사례를 한번도 시도한 적이 없기 때문에 처음에는 이것을 눈치 채지 못했습니다.ca-extensions오직대부분의 CA에서는 실용적이지 않은 구성입니다. copy_extensions다른 것을 지정했지만 none(CSR에 일부가 있음) 지정 x509_extensions하지 않은 경우ca 하다인증서에 확장자를 넣지만확실히확장이 있는 경우 표준(예: rfc5280)에서 요구하는 대로 인증서 버전을 v3으로 설정합니다.

이것이 버그인지 여부는 논쟁의 여지가 있습니다. 맨페이지에는 x509_extensions/extensionsv3 설정을 제어하라고 나와 있습니다.아니요그런 말을 하면 copy_extensions그렇지 않다는 것을 의미할 수 있지만 IMHO는 확실히 매우 차선책인 기능입니다. 편집: 이것은 버그이며 수정될 예정이지만 그때까지는 해결 방법을 사용하십시오.https://unix.stackexchange.com/a/394465/59699

하지만 내 테스트에서는 실제로 문제가 해결되지 않았습니다. 인증서가 이미 *.localSAN에 있는 경우에도그리고CN 및 (현재) 다른 방법으로는 작동하지만 내 Firefox(53.0.2) 및 Chrome(59.0.3071.109)은 각각 SSL_ERROR_CERT_DOMAIN_ERROR 및 ERR_CERT_COMMON_NAME_INVALID를 사용하여 이를 거부합니다. 나는 그들이 local일반적인 레벨 2+ 논리를 제외하지 않고 시도해 볼 것이라고 추측합니다 *.example.local. Chrome은 이것을 허용하지만 Firefox는 그렇지 않습니다. 저도 사용해봤는데 *.example.orgChrome과 IE11 모두 좋아요저것그러나 여전히 Firefox는 아닙니다(물론 실제 TLD에서 자신에게 이름을 할당하는 것은 .orgDNS가 작동하는 방식이 아닙니다).

이것이 나를 딜레마에 빠뜨린다. 일부 작업을 통해 OpenSSL은 사용자가 원하는 거의 모든 것을 포함하는 인증서를 생성할 수 있지만 Firefox와 Chrome은수용하다나는 모른다. 이 문제를 조사해보고 뭔가 발견하면 업데이트하도록 노력하겠습니다.


*.localCA(자체 서명) 인증서가 아닌 서버 CSR에 CommonName만 제공한다는 뜻 이기를 바랍니다 . CA와 리프 인증서의 주체 이름이 동일하면 아무 것도 안정적으로 작동하지 않습니다. 편집: 편집된 질문에 따르면 질문이 올바르게 다른 것으로 확인되었습니다. ca사용 중인 정책에서 요구하는 국가, 주, 조직 지정은 언급되어 있지 않습니다 .

"자체 서명"은 동일한 서명을 의미하는 용어입니다.열쇠. CA 인증서는 자체 서명되었습니다. 귀하의 서버 인증서는 귀하 자신의 키로 귀하가 직접 서명하지만아니요자체 서명됨. 자체 서명된 인증서에 대한 지침을 자체 서명되지 않은 인증서에 적용하려고 시도하는 것도 문제의 일부입니다.

Gilles는 md5 서명 알고리즘에 대해서도 옳습니다.

편집: CA 인증서를 영구적으로 삭제하지 않는 한 설정의 일련 번호(및 색인)를 "재설정"하는 openssl ca것은 좋지 않습니다.그리고 이름그들은 사용됩니다. 표준에는 특정 CA가 동일한 시퀀스 값을 가진 여러 인증서를 발급해서는 안 되며 시퀀스 파일이 이를 달성하는 방법이라고 명시되어 openssl ca있습니다 x509 -req. 오늘날 "실제"(공용) CA는 더 이상 단순한 카운터를 사용하지 않고 PKI(google hashclash)에 대한 충돌 공격을 방지하기 위해 엔트로피를 포함하지만 이는 귀하와 같은 개인 CA에는 문제가 되지 않습니다. 브라우저(또는 다른 신뢰자)가 동일한 시퀀스와 CA 이름을 가진 여러 인증서를 보면 만족스럽지 않을 것이라고 쉽게 믿을 수 있습니다. 하지만 브라우저가 리프 인증서를 유지하는 것을 원하지 않으므로 이전 인증서도 동시에 볼 수 있습니다. 오랫동안 실행되지 않는 한 프로세스의 시간 및 새 인증서 - 영구 "예외"로 설정한 경우 Firefox를 포함하여 해당 저장소로 가져오지 않는 한.

답변2

와일드카드 인증서는 최상위 도메인(예: .local또는 ) 에는 허용되지 않으며 .comFirefox 또는 IE에서는 와일드카드 인증서가 허용되지 않습니다.https://crbug.com/736715.

답변3

적어도 하나의 명백한 문제는 서명된 인증서를 생성한다는 것입니다.MD5. MD5는 한동안 더 이상 사용되지 않았으며 2012년부터 인증서가 손상되었습니다. 한동안 평판이 좋은 서버가 이를 지원하지 않았습니다.

로 변경 .default_md md5default_md sha256

MD5를 권장하는 튜토리얼을 따르고 있다면 폐기하십시오. 너무 오래되어 아무 쓸모가 없습니다.

다른 문제가 있는지 검토하지 않았음을 양해해 주시기 바랍니다. 서버 로그가 도움이 될 것입니다.

답변4

두 답변 모두 나에게 도움이 되지 않았지만 향후 요구 사항에 맞는 Powershell 스크립트를 생각해 냈습니다.

#openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout localhost-CA.pem -out localhost-CA.crt -subj '/emailAddress=<redacted>/O=<redacted>/CN=<redacted>/C=US' -extensions v3_ca -addext 'nsCertType=sslCA' # uncomment to generate a root CA cert.
'basicConstraints=CA:FALSE`
extendedKeyUsage=serverAuth`
subjectAltName=IP.1:127.0.0.1,IP.2:::1,DNS:localhost' | Set-Content sign.conf
Invoke-Expression "openssl req -new -sha256 -key localhost.pem -out localhost.csr -subj '/emailAddress=<redacted>/O=<redacted>/CN=<redacted>/C=US' $((Get-Content sign.conf | ForEach-Object { "-addext '$_'" }) -join ' ')"
openssl x509 -req -in localhost.csr -CA localhost-CA.crt -CAkey localhost-CA.pem -CAcreateserial -out localhost.crt -days 3650 -sha256 -extfile sign.conf -extensions default
Remove-Item sign.conf

구성 파일을 망칠 필요 없이 CSR을 생성하는 데 사용된 새 인증서 생성 유틸리티에 동일한 확장자를 전달합니다. 이는 너무 작은 것에 대한 내 취향에 비해 너무 많은 것입니다. 생성된 인증서는 V3입니다.

관련 정보