인증 기관에 인증서 서명 요청에 어떻게 서명합니까?


197

검색하는 동안 SSL 인증서 서명 요청에 서명하는 몇 가지 방법을 찾았습니다.

  1. x509모듈 사용 :

    openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    
  2. ca모듈 사용 :

    openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
    

참고 :이 매개 변수를 올바르게 사용하는지 확실하지 않습니다. 사용하려면 올바른 사용법을 알려주십시오.

인증 기관에 인증서 요청에 서명하려면 어떤 방법을 사용해야합니까? 한 방법이 다른 방법보다 낫습니까 (예 : 더 이상 사용되지 않음)?



1
나는 같은 이 작은 스크립트 CA를 설정하고 "하위"서명 된 인증서를 생성 할 수 있습니다. 시스템이 S / MIME 등의 인증서에 만족하게하려면 CA 인증서를 "신뢰할 수있는 루트"로 추가해야합니다.
jar

내가 볼 수 있듯이 caCA가되는 것이 더 진지한 경우입니다.
x-yuri

당신은 찾을 수 내 대답에 흥미를.
x-yuri

스택 오버플로는 프로그래밍 및 개발 질문을위한 사이트입니다. 이 질문은 프로그래밍이나 개발에 관한 것이 아니기 때문에 주제가 아닌 것 같습니다. 참조 내가 여기에 대해 요청할 수 있습니다 어떤 주제 도움말 센터에서. 아마도 Super User 또는 Unix & Linux Stack Exchange 가 더 좋은 곳일 것입니다.
jww

답변:


459
1. Using the x509 module
openssl x509 ...
...

2 Using the ca module
openssl ca ...
...

해당 명령에 대한 서문이 없습니다.

이것은 2 단계 프로세스입니다. 먼저 CA를 설정 한 다음 최종 엔터티 인증서 (일명 서버 또는 사용자)에 서명합니다. 두 명령 모두 두 단계를 하나로 묶습니다. 그리고 둘 다 CA와 서버 (엔드 엔터티) 인증서 모두에 대해 OpenSSL 구성 파일이 이미 설정되어 있다고 가정합니다.


먼저 기본 구성 파일을 작성 하십시오 .

$ touch openssl-ca.cnf

그런 다음 다음을 추가하십시오.

HOME            = .
RANDFILE        = $ENV::HOME/.rnd

####################################################################
[ ca ]
default_ca    = CA_default      # The default ca section

[ CA_default ]

default_days     = 1000         # How long to certify for
default_crl_days = 30           # How long before next CRL
default_md       = sha256       # Use public key default MD
preserve         = no           # Keep passed DN ordering

x509_extensions = ca_extensions # The extensions to add to the cert

email_in_dn     = no            # Don't concat the email in the DN
copy_extensions = copy          # Required to copy SANs from CSR to cert

####################################################################
[ req ]
default_bits       = 4096
default_keyfile    = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions    = ca_extensions
string_mask        = utf8only

####################################################################
[ ca_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default = US

stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = Maryland

localityName                = Locality Name (eg, city)
localityName_default        = Baltimore

organizationName            = Organization Name (eg, company)
organizationName_default    = Test CA, Limited

organizationalUnitName         = Organizational Unit (eg, division)
organizationalUnitName_default = Server Research Department

commonName         = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test CA

emailAddress         = Email Address
emailAddress_default = test@example.com

####################################################################
[ ca_extensions ]

subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints       = critical, CA:true
keyUsage               = keyCertSign, cRLSign

위의 필드는 더 복잡한 필드에서 가져 왔지만 ( openssl.cnf에서 찾을 수 있음 /usr/lib/openssl.cnf) CA 인증서 및 개인 키를 만드는 데 필수적이라고 생각합니다.

취향에 맞게 위의 필드를 조정하십시오. 기본값은 구성 파일 및 명령 옵션을 실험하는 동안 동일한 정보를 입력하는 시간을 절약합니다.

CRL 관련 항목을 생략했지만 CA 작업에 있어야합니다. 참조 openssl.cnf및 관련crl_ext 섹션을 .

그런 다음 다음을 실행하십시오. 는 -nodes인증서를 검사 할 수 있도록 암호 또는 암호를 생략합니다. 암호 나 암호를 생략 하는 것은 정말 나쁜 생각입니다.

$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

명령이 실행되면 cacert.pemCA 작업을위한 인증서 cakey.pem가되고 개인 키가됩니다. 개인 키 에는 비밀번호 나 비밀번호 문구 가 없습니다 .

다음과 같이 인증서를 덤프 할 수 있습니다.

$ openssl x509 -in cacert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
        Validity
            Not Before: Jan 24 14:24:11 2014 GMT
            Not After : Feb 23 14:24:11 2014 GMT
        Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d:
                    ...
                    39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b:
                    59:05:9f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
            X509v3 Authority Key Identifier:
                keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage:
                Certificate Sign, CRL Sign
    Signature Algorithm: sha256WithRSAEncryption
         4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7:
         ...
         cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5:
         38:ff:fd:55:68:2c:3e:37

그리고 다음을 사용하여 목적을 테스트하십시오 ( Any Purpose: Yes; "critical, CA : FALSE"그러나 "Any Purpose CA : Yes"참조 ).

$ openssl x509 -purpose -in cacert.pem -inform PEM
Certificate purposes:
SSL client : No
SSL client CA : Yes
SSL server : No
SSL server CA : Yes
Netscape SSL server : No
Netscape SSL server CA : Yes
S/MIME signing : No
S/MIME signing CA : Yes
S/MIME encryption : No
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes
Time Stamp signing : No
Time Stamp signing CA : Yes
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
...
aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP
tTj//VVoLD43
-----END CERTIFICATE-----

2 부에서는 쉽게 소화 할 수있는 다른 구성 파일을 작성하겠습니다. 첫째, touchopenssl-server.cnf(당신은 사용자 인증서도 이러한 중 하나를 만들 수 있습니다.)

$ touch openssl-server.cnf

그런 다음 열어서 다음을 추가하십시오.

HOME            = .
RANDFILE        = $ENV::HOME/.rnd

####################################################################
[ req ]
default_bits       = 2048
default_keyfile    = serverkey.pem
distinguished_name = server_distinguished_name
req_extensions     = server_req_extensions
string_mask        = utf8only

####################################################################
[ server_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default = US

stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = MD

localityName         = Locality Name (eg, city)
localityName_default = Baltimore

organizationName            = Organization Name (eg, company)
organizationName_default    = Test Server, Limited

commonName           = Common Name (e.g. server FQDN or YOUR name)
commonName_default   = Test Server

emailAddress         = Email Address
emailAddress_default = test@example.com

####################################################################
[ server_req_extensions ]

subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

####################################################################
[ alternate_names ]

DNS.1  = example.com
DNS.2  = www.example.com
DNS.3  = mail.example.com
DNS.4  = ftp.example.com

워크 스테이션을 서버로 개발하고 사용해야하는 경우 Chrome에 대해 다음을 수행해야합니다. 그렇지 않으면 Chrome에서 일반 이름 이 잘못 되었다고 불평 할 수 있습니다 ( ERR_CERT_COMMON_NAME_INVALID) . SAN의 IP 주소와이 인스턴스의 CN 사이의 관계가 무엇인지 잘 모르겠습니다.

# IPv4 localhost
IP.1     = 127.0.0.1

# IPv6 localhost
IP.2     = ::1

그런 다음 서버 인증서 요청을 작성하십시오. * 를 생략 하십시오 -x509. 추가 -x509하면 요청이 아닌 인증서가 생성됩니다.

$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM

이 명령이 실행되면에 요청 servercert.csr하고에 개인 키를 갖게 됩니다 serverkey.pem.

다시 검사 할 수 있습니다.

$ openssl req -text -noout -verify -in servercert.csr
Certificate:
    verify OK
    Certificate Request:
        Version: 0 (0x0)
        Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/emailAddress=test@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
                    ...
                    f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
                    86:e1
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Subject Key Identifier:
                1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
            Netscape Comment:
                OpenSSL Generated Certificate
    Signature Algorithm: sha256WithRSAEncryption
         6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81:
         ...
         76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88:
         a9:63:d0:a7

다음으로 CA에 서명해야합니다.


CA에서 서버 인증서에 서명 할 준비가 거의되었습니다. CA openssl-ca.cnf는 명령을 발행하기 전에 두 개의 섹션이 더 필요합니다.

먼저 openssl-ca.cnf다음 두 섹션을 열고 추가하십시오.

####################################################################
[ signing_policy ]
countryName            = optional
stateOrProvinceName    = optional
localityName           = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional

####################################################################
[ signing_req ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment

둘째,의 [ CA_default ]섹션에 다음을 추가하십시오 openssl-ca.cnf. 나는 그것들을 복잡하게 만들 수 있기 때문에 더 일찍 나갔습니다 (그 당시에는 사용되지 않았습니다). 이제 어떻게 사용되는지 알 수 있기를 바랍니다.

base_dir      = .
certificate   = $base_dir/cacert.pem   # The CA certifcate
private_key   = $base_dir/cakey.pem    # The CA private key
new_certs_dir = $base_dir              # Location for new certs after signing
database      = $base_dir/index.txt    # Database index file
serial        = $base_dir/serial.txt   # The current serial number

unique_subject = no  # Set to 'no' to allow creation of
                     # several certificates with same subject.

셋째, 터치 index.txtserial.txt:

$ touch index.txt
$ echo '01' > serial.txt

그런 다음 다음을 수행하십시오.

$ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr

다음과 유사하게 보일 것입니다.

Using configuration from openssl-ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'MD'
localityName          :ASN.1 12:'Baltimore'
commonName            :ASN.1 12:'Test CA'
emailAddress          :IA5STRING:'test@example.com'
Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days)
Sign the certificate? [y/n]:Y

1 out of 1 certificate requests certified, commit? [y/n]Y
Write out database with 1 new entries
Data Base Updated

명령이 실행되면에 서버 인증서가 새로 생성됩니다 servercert.pem. 개인 키는 이전에 생성되었으며에서 사용할 수 있습니다 serverkey.pem.

마지막으로 다음과 같이 새로 발행 된 인증서를 검사 할 수 있습니다.

$ openssl x509 -in servercert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 9 (0x9)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
        Validity
            Not Before: Jan 24 19:07:36 2014 GMT
            Not After : Oct 20 19:07:36 2016 GMT
        Subject: C=US, ST=MD, L=Baltimore, CN=Test Server
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
                    ...
                    f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
                    86:e1
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
            X509v3 Authority Key Identifier:
                keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E

            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
            Netscape Comment:
                OpenSSL Generated Certificate
    Signature Algorithm: sha256WithRSAEncryption
         b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a:
         ...
         45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c:
         56:a5:eb:c8:7e:9f:6b:7a

이전, 당신은에 다음을 추가 CA_default: copy_extensions = copy. 요청한 사람이 제공 한 내선 번호를 복사합니다.

생략하면 copy_extensions = copy, 다음 서버 인증서는 주체 대체 이름 (SAN을)처럼 부족한 것 www.example.com등을 mail.example.com.

을 사용 copy_extensions = copy하지만 요청을 살펴 보지 않으면 요청자는 서버 나 사용자 인증서가 아닌 하위 루트와 같은 서명을하도록 속일 수 있습니다. 즉, 신뢰할 수있는 루트에 연결되는 인증서를 작성할 수 있습니다. openssl req -verify서명하기 전에 요청을 확인하십시오 .


당신이 경우 생략 unique_subject 또는로 설정 yes, 당신은 만들 수됩니다 주체의 고유 이름으로 인증서를.

unique_subject = yes            # Set to 'no' to allow creation of
                                # several ctificates with same subject.

실험하는 동안 두 번째 인증서를 만들려고하면 CA의 개인 키로 서버 인증서에 서명 할 때 다음이 발생합니다.

Sign the certificate? [y/n]:Y
failed to update database
TXT_DB error number 2

그래서 unique_subject = no테스트에 적합합니다.


당신은 확인하려면 조직 이름 자체 서명 된 CA 사이의 일치 하위 CA최종 엔티티 인증서, 다음, 당신의 CA 구성 파일에 다음을 추가 :

[ policy_match ]
organizationName = match

당신이 허용 할 경우 조직 이름 변화를, 다음 사용 :

[ policy_match ]
organizationName = supplied

X.509 / PKIX 인증서의 DNS 이름 처리에 관한 다른 규칙이 있습니다. 규칙은 다음 문서를 참조하십시오.

RFC 6797 및 RFC 7469는 다른 RFC 및 CA / B 문서보다 제한적이므로 나열되어 있습니다. RFC의 6797 및 7469 IP 주소도 허용 하지 않습니다 .


4
그 광범위한 답변에 감사드립니다 ... 그러나 나는 여기서 길을 잃었습니다. 내가 작성한 것에서 이해 한 것 : openssl reqCSR을 생성 openssl req -x509하는 데 사용되고 CA 인증서를 생성하는 데 사용됩니다 (자체 서명 된 인증서를 만들 수도 있음을 보았습니다) openssl ca.CA 인증서로 CSR에 서명하는 데 사용됩니다. 권리? 나를 혼란스럽게하는 것은 openssl.cnf 파일의 동일한 부분이 명령에 따라 다른 값으로 사용된다는 것입니다 ... 지금 완전히 잃어 버린 것 같습니다.
Bernard Rosset

27
먼저 openssl req -x509CA를 만드는 데 사용됩니다. 둘째, openssl req서버의 CSR을 작성하는 데 사용됩니다. 셋째, openssl ca서버 인증서를 작성하고 CA의 서명으로 인증하는 데 사용됩니다.
jww

1
"나를 혼동하는 것은 openssl.cnf의 동일한 부분이라는 것입니다 ..."-맞습니다. 나는에 당신을 위해 그들을 발발 이유 openssl-ca.cnfopenssl-server.cnf. 당신이 그들에 익숙해지고 섹션이 어떻게 호출되는지, 당신은 같은 괴물로 결합 할 수 있습니다 openssl.cnf.
jww

1
@JeffPuckettII-일반적인 섹션입니다. CA 유틸리티와 Req 유틸리티가 모두 사용합니다. v3 확장자 여야합니다.
jww

5
@ahnkle 기본 30 일이 아닌 다른 옵션에는 -days 옵션을 사용하십시오. OpenSSL 문서
George

14

@jww의 답변 외에도 openssl-ca.cnf의 구성에 대해 말하고 싶습니다.

default_days     = 1000         # How long to certify for

이 루트 CA가 서명 한 인증서가 유효한 기본 일 수를 정의합니다. root-ca 자체의 유효성을 설정하려면 다음에 '-days n'옵션을 사용해야합니다.

openssl req -x509 -days 3000 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

그렇게하지 않으면 루트 CA는 기본 1 개월 동안 만 유효하며이 루트 CA가 서명 한 인증서도 1 개월의 유효 기간을 갖습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.