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 = test@example.com
####################################################################
[ 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.cnf
dan bagian terkait crl_ext
.
Kemudian, jalankan yang berikut ini. The -nodes
menghilangkan 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.pem
akan menjadi sertifikat Anda untuk operasi CA, dan cakey.pem
akan 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/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
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, touch
yang 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 = 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
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 -x509
akan 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.csr
dan 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/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
Selanjutnya, Anda harus menandatanganinya dengan CA Anda.
Anda hampir siap untuk menandatangani sertifikat server oleh CA Anda. CA openssl-ca.cnf
membutuhkan dua bagian lagi sebelum mengeluarkan perintah.
Pertama, buka openssl-ca.cnf
dan 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.txt
dan 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:'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
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/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
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.com
dan 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 -verify
sebelum 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 = no
sangat 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.