작동하는 자체 서명 SSL 인증서를 만드는 악몽

작동하는 자체 서명 SSL 인증서를 만드는 악몽

SSL을 설치해야 하는 인트라넷 서버가 있습니다.

이것이openssl.cnf

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
attributes              = req_attributes
req_extensions          = req_ext
#prompt = no

[ req_distinguished_name ]
countryName                     = US
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = CHICAGO
localityName                    = CHICAGO
0.organizationName              = MY COMPANY
organizationalUnitName          = IOS DEVELOPMENT
commonName                      = server2.myserver.local
commonName_max                  = 64
emailAddress                    = [email protected]
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = password
challengePassword_min           = 4
challengePassword_max           = 20

[ req_ext ]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = server2.myserver.local
DNS.2   = myserver.local

이것이 내가 그것을 만드는 데 사용하는 명령입니다.

  1. 루트 CA 키 생성

    openssl genrsa -des3 -out rootCA.key 4096
    

2. 루트 CA 인증서를 생성하는 중입니다.

openssl req \
    -x509 -new -nodes \
    -key rootCA.key -sha256 \
    -days 825 \
    -out rootCA.crt \
    -subj /CN=server2.myserver.local \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat ./openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:server2.myserver.local')) \
    -extensions 'req_ext'
  1. 인증서 키 생성

    openssl genrsa -out mydomain.com.key 4096
    
  2. 인증서 생성

    openssl req -new -sha256 -key  mydomain.com.key \
     -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=server2.myserver.local" \
     -reqexts SAN \
     -config <(cat ./openssl.cnf \
         <(printf "\n[SAN]\nsubjectAltName=DNS:server2.myserver.local,DNS:myserver.local")) \
     -out mydomain.com.csr
    
  3. CA 인증서를 p12로 변환

    openssl pkcs12 -export -out ca.p12 -inkey rootCA.key -in rootCA.crt  
    
  4. 인증서를 p12로 변환

    openssl pkcs12 -export -out certificate.p12 -inkey mydomain.com.key -in mydomain.com.crt
    

그런 다음 IIS 서버와 장치에 ca.p12및를 설치합니다 .certificate.p12

방문하려고 하면server2.myserver.local

나는 얻다

여기에 이미지 설명을 입력하세요

어떻게 성자 인증서의 이름으로 그런 일을 할 수 있나요?

답변1

루트 CA 인증서가 완전히 잘못되었다고 말하고 싶습니다. CA 인증서는 최종 호스트 TLS 인증서와 매우 다릅니다. 둘 다에 동일한 구성을 사용할 수 없습니다.

  • 제목에 서버의 도메인을 넣지 마세요. 그건 쓸모가 없습니다. CA라면, CN=My internal CA그런 것이 있어야 합니다.

  • 확장 을 추가합니다 basicConstraints. 인증서가 CA라고 명시되어 있어야 합니다.

  • 올바른 keyUsage. 'keyCertSign' 및 (완전성을 위해) 'cRLSign'이 필요합니다.

  • 추가하지 마십시오 subjectAltName. 인증서는 기관/발급자를 위한 것이지 서버용이 아닙니다!

  • 추가하지 마십시오 extendedKeyUsage. 때로는 CA가 발급할 수 있는 인증서를 제한하는 데 사용되지만 이러한 복잡성 없이 시작하는 것이 더 좋습니다.

  • subjectKeyIdentifier나중에 동일한 주체 DN을 가진 여러 내부 CA가 생길 경우를 대비해 을 추가하는 것이 좋습니다 . (일반적으로 CA DN은 고유해야 하지만 SKI/AKI를 사용하면 이 문제가 좀 더 완화됩니다.)

따라서 다음과 유사한 "CA" 구성 파일이 있어야 합니다(그리고 명령줄을 통해 SAN 및 기타 항목을 추가하는 것을 중지합니다. 이것이 바로 구성의 목적입니다).

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
req_extensions          = req_ext

[ req_dn ]
countryName             = US
stateOrProvinceName     = Chicago
organizationName        = Company Name
organizationalUnitName  = iOS development
commonName              = Internal development CA

[ req_ext ]
basicConstraints        = critical, CA:TRUE
keyUsage                = keyCertSign, cRLSign
subjectKeyIdentifier    = hash

반면 최종 엔터티 인증서(TLS 서버)에는 다음 확장이 있어야 합니다.

...
[ req_ext ]
basicConstraints        = CA:FALSE
keyUsage                = digitalSignature, keyEncipherment
extendedKeyUsage        = serverAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid, issuer
subjectAltName          = DNS:server2.myserver.local

그런 다음 IIS 서버와 장치에 ca.p12 및 Certificate.p12를 설치합니다.

귀하의 장치에 CA의 개인 키를 설치하지 마십시오!서버에도 설치하지 마세요. 설치해야합니다오직CA 인증서 rootCA.crt(공개 부분) 외에는 아무것도 없습니다.


나의 최종 추천: 원시 openssl. 대신 사용쉬운-RSA(OpenVPN과 함께 제공되는 것) 또는 사용XCA(그래픽 Linux 앱) 또는 다음 중 하나를 사용하세요.아마도 수십이미 작성되고 테스트된 프로그램.

관련 정보