Sertifika Yetkilinizle Sertifika İmzalama İsteğini nasıl imzalarsınız?


197

Arama sırasında bir SSL Sertifikası İmzalama İsteği imzalamanın birkaç yolunu buldum:

  1. x509Modülü kullanma :

    openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    
  2. caModülü kullanma :

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

Not: Bunun için doğru parametrelerin kullanılmasından emin değilim. Kullanacaksam lütfen doğru kullanımı tavsiye edin.

Sertifika Yetkilinizle sertifika isteklerini imzalamak için hangi yolu kullanmalısınız? Bir yöntem diğerinden daha iyi mi (örneğin, bir tanesi kullanımdan kaldırılıyor)?



1
Bir CA kurar ve imzalı "alt" sertifikalar oluşturmak için izin veren bu küçük komut dosyası gibi . Sisteminizin sertifikalar hakkında mutlu olmasını istiyorsanız (S / MIME veya benzeri olmayan), CA sertifikasını "güvenilir kök" olarak eklemeniz gerekir.
kavanoz

Görebildiğim kadarıyla caCA olma konusunda daha ciddi olduğunuz durumlar için.
x-yuri

Cevabımı ilginç bulabilirsiniz .
x-yuri

Stack Overflow, programlama ve geliştirme soruları için bir sitedir. Bu soru konu dışı gibi görünüyor çünkü programlama veya geliştirme ile ilgili değil. Yardım Merkezi'nde hangi konular hakkında soru sorabilirim konusuna bakın . Belki Süper Kullanıcı veya Unix & Linux Stack Exchange sormak için daha iyi bir yer olurdu.
jww

Yanıtlar:


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

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

Bu komutların girişini kaçırıyorsunuz.

Bu iki aşamalı bir süreçtir. İlk önce CA'nızı ayarladıktan sonra bir son varlık sertifikası (sunucu veya kullanıcı olarak da bilinir) imzalarsınız. İki komutun her ikisi de iki adımı bire ayırır. Her ikisi de, CA'lar ve Sunucu (son varlık) sertifikaları için önceden ayarlanmış bir OpenSSL yapılandırma dosyanız olduğunu varsayar.


İlk olarak, temel bir yapılandırma dosyası oluşturun :

$ touch openssl-ca.cnf

Ardından, aşağıdakileri ekleyin:

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

Yukarıdaki alanlar daha karmaşık openssl.cnf(alınabilir /usr/lib/openssl.cnf), ancak CA sertifikası ve özel anahtar oluşturmak için gerekli olduğunu düşünüyorum.

Zevkinize uyacak şekilde yukarıdaki alanları değiştirin. Varsayılanlar, yapılandırma dosyasını ve komut seçeneklerini denerken aynı bilgileri girmeniz için size zaman kazandırır.

CRL ile ilgili şeyleri atladım, ancak CA işlemleriniz bunlara sahip olmalıdır. Bkz. openssl.cnfVe ilgili crl_extbölüm.

Ardından, aşağıdakileri yürütün. -nodesSertifikayı incelemek böylece parola veya anahtar atlar. Bu bir var gerçekten kötü şifreyi ihmal veya parolayı için fikir.

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

Komut yürütüldükten sonra cacert.pemCA işlemleri için sertifikanız cakey.pemolacak ve özel anahtar olacaktır. Özel anahtarın bir parolası veya parolası olmadığını hatırlayın .

Sertifikayı aşağıdakilerle birlikte dökebilirsiniz.

$ 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

Ve amacını aşağıdakilerle test edin (endişelenmeyin Any Purpose: Yes; bkz. "Kritik, CA: YANLIŞ" ancak "Herhangi Bir Amaç CA: Evet" ).

$ 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-----

İkinci bölüm için, kolayca sindirilebilen başka bir yapılandırma dosyası oluşturacağım. İlk olarak, (eğer kullanıcı sertifikaları da Bunlardan birini yapabilirsiniz).touchopenssl-server.cnf

$ touch openssl-server.cnf

Ardından açın ve aşağıdakileri ekleyin.

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

İş istasyonunuzu geliştiriyor ve sunucu olarak kullanmanız gerekiyorsa, Chrome için aşağıdakileri yapmanız gerekebilir. Aksi takdirde Chrome, Ortak Adın geçersiz olduğundan şikayet edebilir ( ERR_CERT_COMMON_NAME_INVALID) . Bu örnekte SAN'daki bir IP adresi ile bir CN arasındaki ilişkinin ne olduğundan emin değilim.

# IPv4 localhost
IP.1     = 127.0.0.1

# IPv6 localhost
IP.2     = ::1

Ardından, sunucu sertifikası isteğini oluşturun. Atladığınızdan emin olun -x509*. Ekleme -x509bir istek değil bir sertifika oluşturur.

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

Bu komut yürütüldükten sonra, bir isteğiniz servercert.csrve bir özel anahtarınız olur serverkey.pem.

Ve tekrar inceleyebilirsiniz.

$ 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

Ardından, CA'nızla imzalamanız gerekir.


Sunucunuzun sertifikasını CA'nız tarafından imzalamaya neredeyse hazırsınız. CA'nın openssl-ca.cnfihtiyaçları komutunu vermeden önce iki tane daha bölümleri.

İlk olarak, openssl-ca.cnfaşağıdaki iki bölümü açın ve ekleyin.

####################################################################
[ 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

İkincisi, aşağıdakileri ekleyin [ CA_default ]bölümünde openssl-ca.cnf. Onları daha önce dışarıda bıraktım, çünkü işleri karmaşıklaştırabilirler (o sırada kullanılmamışlardı). Şimdi nasıl kullanıldıklarını göreceksiniz, umarım anlamlı olurlar.

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.

Üçüncü olarak, dokunun index.txtve serial.txt:

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

Ardından, aşağıdakileri yapın:

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

Aşağıdakine benzer bir şey görmelisiniz:

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

Komut yürütüldükten sonra, yeni basılmış bir sunucu sertifikanız olur servercert.pem. Özel anahtar daha önce oluşturuldu ve içinde kullanılabilir serverkey.pem.

Son olarak, yeni basılmış sertifikanızı aşağıdakilerle inceleyebilirsiniz:

$ 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

Daha önce aşağıdakileri eklediniz: CA_default : copy_extensions = copy. Bu, isteği yapan kişi tarafından sağlanan uzantıyı kopyalar.

Atlarsanız copy_extensions = copy, sunucu sertifikanızda aşağıdaki Konu Alternatif Adları (SAN'lar) bulunmazwww.example.com ve mail.example.com.

Kullanır copy_extensions = copy, ancak isteği gözden geçirmezseniz, istekte bulunan kişi sizi bir alt kök (sunucu veya kullanıcı sertifikası yerine) gibi bir şey imzalamanız için kandırabilir. Bu da güvenilir kök dizinize geri dönen sertifikaları bastırabileceği anlamına gelir. İsteği ile doğruladığınızdan emin olun.openssl req -verifyİmzalamadan önce .


Bunu atlar unique_subject veya ayarlarsanız , konunun ayırt edici adı altında yesyalnızca bir sertifika oluşturmanıza izin verilir .

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

Deneme sırasında ikinci bir sertifika oluşturmaya çalışmak, sunucunuzun sertifikasını CA'nın özel anahtarıyla imzalarken aşağıdakilerle sonuçlanır:

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

Yani unique_subject = no test etmek için idealdir.


Kuruluş Adının kendinden imzalı CA'lar, Alt CA ve Son Varlık sertifikaları arasında tutarlı olmasını sağlamak istiyorsanız , CA yapılandırma dosyalarınıza aşağıdakileri ekleyin:

[ policy_match ]
organizationName = match

Kuruluş Adının değişmesine izin vermek istiyorsanız , şunu kullanın:

[ policy_match ]
organizationName = supplied

X.509 / PKIX sertifikalarında DNS adlarının işlenmesine ilişkin başka kurallar da vardır. Kurallar için bu belgelere bakın:

RFC 6797 ve RFC 7469 listelenmiştir, çünkü bunlar diğer RFC ve CA / B belgelerinden daha kısıtlayıcıdır. RFC 6797 ve 7469 da bir IP adresine izin vermez.


4
Bu kapsamlı cevap için teşekkürler ... Ancak burada biraz kayboldum. Ne yazdığınızı anladım: openssl reqCSR oluşturmak openssl req -x509için kullanılır, CA sertifikası oluşturmak için kullanılır (kendinden imzalı sertifika oluşturabileceğiniz başka bir yerde gördüm), openssl cabir CA sertifikası ile CSR imzalamak için kullanılır. Sağ? Beni de şaşırtan şey, openssl.cnf dosyasının aynı bölümlerinin komuta bağlı olarak farklı değerlerle kullanılmasıdır ... Sanırım şimdi tamamen kayboldum.
Bernard Rosset

27
İlk olarak, openssl req -x509CA oluşturmak için kullanılır. İkincisi, openssl reqsunucunun CSR'sini oluşturmak için kullanılır. Üçüncü olarak, openssl casunucu sertifikasını oluşturmak ve CA'nın imzasıyla onaylamak için kullanılır.
jww

1
"Beni de şaşırtan şey openssl.cnf aynı bölümleri ..." - Doğru. Bu yüzden onları senin için patlattım openssl-ca.cnfve openssl-server.cnf. Onlara alıştıktan sonra ve bölümlerin nasıl çağrıldığından sonra, bunları gibi bir canavarlıkla birleştirebilirsiniz openssl.cnf.
jww

1
@JeffPuckettII - Bu ortak bir bölüm. Hem CA yardımcı programı hem de Req yardımcı programı tarafından kullanılır. Bunlar v3 uzantıları olmalıdır.
jww

5
@ahnkle Varsayılan 30 günden farklı bir şey için -days seçeneğini kullanın. OpenSSL belgeleri
george

14

@Jww cevabına ek olarak, openssl-ca.cnf içindeki konfigürasyonun,

default_days     = 1000         # How long to certify for

bu root-ca ile imzalanan sertifikanın geçerli olacağı varsayılan gün sayısını tanımlar. Root-ca'nın geçerliliğini ayarlamak için şu öğelerde '-days n' seçeneğini kullanmalısınız:

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

Bunu yapmazsanız, root-ca'niz yalnızca varsayılan bir ay boyunca geçerli olur ve bu kök CA tarafından imzalanan sertifikaların da bir ay geçerliliği olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.