Bagaimana Anda menandatangani Permintaan Penandatanganan Sertifikat dengan Otoritas Sertifikasi Anda?

195

Selama pencarian saya, saya menemukan beberapa cara menandatangani Permintaan Penandatanganan Sertifikat SSL:

  1. Menggunakan x509modul:

    openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    
  2. Menggunakan camodul:

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

Catatan: Saya tidak yakin tentang penggunaan parameter yang tepat untuk ini. Mohon saran penggunaan yang benar jika saya menggunakannya.

Cara apa yang harus digunakan seseorang untuk menandatangani permintaan sertifikat dengan Otoritas Sertifikasi Anda? Apakah satu metode lebih baik dari yang lain (misalnya, satu tidak digunakan lagi)?

Bernard Rosset
sumber
1
Saya suka skrip kecil ini yang mengatur CA dan memungkinkan Anda untuk menghasilkan sertifikat "bawahan" yang ditandatangani. Catatan, jika Anda ingin sistem Anda senang dengan sertifikat (seperti untuk S / MIME atau yang lainnya), Anda perlu menambahkan sertifikat CA sebagai "root tepercaya".
guci
Dari apa yang saya lihat, caadalah untuk kasus-kasus ketika Anda lebih serius menjadi seorang CA.
x-yuri
Anda mungkin menemukan jawaban saya menarik.
x-yuri
Stack Overflow adalah situs untuk pertanyaan pemrograman dan pengembangan. Pertanyaan ini tampaknya di luar topik karena ini bukan tentang pemrograman atau pengembangan. Lihat Topik apa yang bisa saya tanyakan di sini di Pusat Bantuan. Mungkin Super User atau Unix & Linux Stack Exchange akan menjadi tempat yang lebih baik untuk bertanya.
jww

Jawaban:

458
1. Using the x509 module
openssl x509 ...
...

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

Anda melewatkan pengantar untuk perintah-perintah itu.

Ini adalah proses dua langkah. Pertama, Anda mengatur CA Anda, dan kemudian Anda menandatangani sertifikat entitas akhir (alias server atau pengguna). Kedua perintah ini menghilangkan dua langkah menjadi satu. Dan keduanya menganggap Anda memiliki file konfigurasi OpenSSL yang sudah disiapkan untuk CA dan sertifikat Server (entitas akhir).


Pertama, buat file konfigurasi dasar :

$ touch openssl-ca.cnf

Kemudian, tambahkan yang berikut ini:

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 = [email protected]

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

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

Kolom di atas diambil dari yang lebih kompleks openssl.cnf(Anda dapat menemukannya di /usr/lib/openssl.cnf), tetapi saya pikir itu adalah hal yang penting untuk membuat sertifikat CA dan kunci pribadi.

Tweak bidang di atas sesuai dengan selera Anda. Defaultnya menghemat waktu Anda dari memasukkan informasi yang sama saat bereksperimen dengan file konfigurasi dan opsi perintah.

Saya menghilangkan hal-hal yang relevan dengan CRL, tetapi operasi CA Anda harus memilikinya. Lihat openssl.cnfdan bagian terkait crl_ext.

Kemudian, jalankan yang berikut ini. The -nodesmenghilangkan password atau passphrase sehingga Anda dapat memeriksa sertifikat. Merupakan ide yang sangat buruk untuk menghilangkan kata sandi atau frasa sandi.

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

Setelah perintah dijalankan, cacert.pemakan menjadi sertifikat Anda untuk operasi CA, dan cakey.pemakan menjadi kunci pribadi. Ingat kunci pribadi tidak memiliki kata sandi atau frasa sandi.

Anda dapat membuang sertifikat dengan yang berikut ini.

$ 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/[email protected]
        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/[email protected]
        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

Dan uji tujuannya dengan yang berikut (jangan khawatir tentang Any Purpose: Yes; lihat "critical, CA: FALSE" tetapi "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-----

Untuk bagian dua, saya akan membuat file konfigurasi lain yang mudah dicerna. Pertama, touchyang openssl-server.cnf(Anda dapat membuat salah satu dari ini untuk sertifikat pengguna juga).

$ touch openssl-server.cnf

Kemudian buka, dan tambahkan yang berikut ini.

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 = [email protected]

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

Jika Anda sedang mengembangkan dan perlu menggunakan workstation Anda sebagai server, maka Anda mungkin perlu melakukan yang berikut untuk Chrome. Kalau tidak, Chrome dapat mengeluh Nama Biasa tidak valid ( ERR_CERT_COMMON_NAME_INVALID) . Saya tidak yakin apa hubungan antara alamat IP di SAN dan CN dalam hal ini.

# IPv4 localhost
IP.1     = 127.0.0.1

# IPv6 localhost
IP.2     = ::1

Kemudian, buat permintaan sertifikat server. Pastikan untuk menghilangkan -x509 *. Menambahkan -x509akan membuat sertifikat, dan bukan permintaan.

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

Setelah perintah ini dijalankan, Anda akan memiliki permintaan servercert.csrdan kunci pribadi serverkey.pem.

Dan Anda bisa memeriksanya lagi.

$ 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/[email protected]
        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

Selanjutnya, Anda harus menandatanganinya dengan CA Anda.


Anda hampir siap untuk menandatangani sertifikat server oleh CA Anda. CA openssl-ca.cnfmembutuhkan dua bagian lagi sebelum mengeluarkan perintah.

Pertama, buka openssl-ca.cnfdan tambahkan dua bagian berikut.

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

Kedua, tambahkan berikut ini ke [ CA_default ]bagian openssl-ca.cnf. Saya meninggalkan mereka sebelumnya, karena mereka dapat memperumit masalah (mereka tidak digunakan pada saat itu). Sekarang Anda akan melihat bagaimana mereka digunakan, jadi semoga mereka masuk akal.

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.

Ketiga, sentuh index.txtdan serial.txt:

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

Kemudian, lakukan hal berikut:

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

Anda harus melihat yang serupa dengan yang berikut ini:

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:'[email protected]'
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

Setelah perintah dijalankan, Anda akan memiliki sertifikat server yang baru dicetak servercert.pem. Kunci pribadi dibuat sebelumnya dan tersedia di serverkey.pem.

Akhirnya, Anda dapat memeriksa sertifikat yang baru dicetak dengan yang berikut:

$ 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/[email protected]
        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

Sebelumnya, Anda menambahkan berikut ke CA_default: copy_extensions = copy. Ekstensi salinan ini disediakan oleh orang yang mengajukan permintaan.

Jika Anda menghilangkan copy_extensions = copy, maka sertifikat server Anda tidak memiliki Nama Alternatif Subjek (SAN) seperti www.example.comdan mail.example.com.

Jika Anda menggunakan copy_extensions = copy, tetapi jangan melihat permintaan, maka pemohon mungkin bisa menipu Anda untuk menandatangani sesuatu seperti root bawahan (bukan server atau sertifikat pengguna). Yang berarti dia akan dapat mencetak sertifikat yang rantai kembali ke akar tepercaya Anda. Pastikan untuk memverifikasi permintaan dengan openssl req -verifysebelum menandatangani.


Jika Anda menghilangkan unique_subject atau mengaturnya yes, maka Anda hanya akan diizinkan untuk membuat satu sertifikat dengan nama subjek yang dibedakan.

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

Mencoba membuat sertifikat kedua saat bereksperimen akan menghasilkan yang berikut saat menandatangani sertifikat server Anda dengan kunci pribadi CA:

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

Jadi unique_subject = nosangat cocok untuk pengujian.


Jika Anda ingin memastikan Nama Organisasi konsisten antara CA yang ditandatangani sendiri, CA bawahan dan sertifikat Entitas Akhir , kemudian tambahkan yang berikut ke file konfigurasi CA Anda:

[ policy_match ]
organizationName = match

Jika Anda ingin mengizinkan Nama Organisasi berubah, gunakan:

[ policy_match ]
organizationName = supplied

Ada aturan lain tentang penanganan nama DNS di sertifikat X.509 / PKIX. Lihat dokumen ini untuk aturan:

RFC 6797 dan RFC 7469 terdaftar, karena lebih membatasi daripada RFC lain dan dokumen CA / B. RFC's 6797 dan 7469 juga tidak mengizinkan alamat IP.

jww
sumber
4
Terima kasih atas jawaban yang luas itu ... Namun, saya agak bingung di sini. Apa yang saya mengerti dari apa yang Anda tulis: openssl reqdigunakan untuk menghasilkan CSR, openssl req -x509digunakan untuk menghasilkan sertifikat CA (saya melihat di beberapa tempat Anda juga dapat membuat sertifikat yang ditandatangani sendiri), openssl cadigunakan untuk menandatangani CSR dengan sertifikat CA. Baik? Yang membingungkan saya juga adalah bahwa bagian yang sama dari file openssl.cnf digunakan dengan nilai yang berbeda tergantung pada perintah ... Saya pikir saya benar-benar hilang sekarang.
Bernard Rosset
27
Pertama, openssl req -x509digunakan untuk membuat CA. Kedua, openssl reqdigunakan untuk membuat CSR server. Ketiga, openssl cadigunakan untuk membuat sertifikat server dan mengesahkannya dengan tanda tangan CA.
jww
1
"Yang membingungkanku juga adalah bagian yang sama dari openssl.cnf ..." - Benar. Itu sebabnya saya membagi mereka untuk Anda openssl-ca.cnfdan openssl-server.cnf. Setelah Anda terbiasa dengan mereka dan bagaimana bagian-bagian itu dipanggil, Anda dapat menggabungkannya menjadi seperti monster openssl.cnf.
jww
1
@ JeffPuckettII - Ini bagian yang umum. Ini digunakan oleh utilitas CA dan utilitas Req. Itu harus ekstensi v3.
jww
5
@ahnkle Gunakan opsi -hari untuk hal yang berbeda dari 30 hari default. OpenSSL docs
george
14

Selain menjawab @jww, saya ingin mengatakan bahwa konfigurasi di openssl-ca.cnf,

default_days     = 1000         # How long to certify for

mendefinisikan jumlah hari standar sertifikat yang ditandatangani oleh root-ca ini akan valid. Untuk mengatur validitas root-ca itu sendiri, Anda harus menggunakan opsi '-days n' di:

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

Gagal melakukannya, root-ca Anda hanya akan berlaku untuk standar satu bulan dan sertifikat apa pun yang ditandatangani oleh root ini CA juga akan memiliki validitas satu bulan.

humble_wolf
sumber