GNU/Linux >> Belajar Linux >  >> Linux

Otoritas Sertifikat dengan OpenSSL

Artikel ini akan menunjukkan kepada Anda cara mengatur Otoritas Sertifikat dengan OpenSSL. Sertifikat digital adalah dokumen yang digunakan untuk membuktikan kepemilikan kunci publik. Misalnya, sertifikat digital digunakan untuk mengautentikasi situs web yang diakses melalui HTPS. Contoh lain dari penggunaan umum adalah penandatanganan dokumen.

Sertifikat mencakup informasi tentang kunci, identitas pemiliknya, dan tanda tangan digital dari suatu entitas yang telah memverifikasi isinya. Otoritas sertifikat (CA) adalah organisasi yang menerbitkan sertifikat digital.

Artikel ini juga akan menunjukkan cara memberitahu host lain untuk mempercayai sertifikat yang dikeluarkan.

Peringatan :ini seharusnya hanya untuk tujuan pengujian atau bukti konsep. Untuk penggunaan di kehidupan nyata, Anda harus memperoleh sertifikat asli dari otoritas sertifikat yang sebenarnya. Misalnya jika Anda hanya ingin HTTPS dan ingin sertifikat gratis, buka saja https://letsencrypt.org/

Instal OpenSSL

OS utama saya adalah FreeBSD, dan saya suka menggunakan pohon port, untuk menginstalnya jalankan saja:

# cd /usr/ports/security/openssl
# make install clean

Dan tunggu sampai kompilasi dan instalasi port siap. Perhatikan bahwa Anda mungkin sudah memiliki executable openssl (di bawah /usr/bin path) dan jika Anda tetap menginstalnya, biner 'port' akan berada di /usr/local /bin/openssl.

Pertama kali saya berurusan dengan OpenSSL, biner yang disediakan tidak berfungsi untuk saya tetapi portnya berfungsi.

File konfigurasi

Meskipun OS utama saya adalah FreeBSD, mulai sekarang, langkahnya harus sama pada OS apa pun yang mendukung OpenSSL. Mungkin Anda perlu menyesuaikan beberapa jalur, tetapi itu saja.

Anda akan menemukan (sekali lagi, di FreeBSD) sebuah contoh dan file konfigurasi komentar yang baik di /usr/local/openssl/openssl.conf. Ini milik saya setelah beberapa pembersihan, saya telah menyoroti pengaturan yang paling penting:

#OpenSSL Home current directory
HOME                    = /var/openssl #choose any reasonable location
#RANDFILE                = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
oid_section             = new_oids

[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7

[ ca ]
default_ca      = YourCA              # The default Certificate Authority section

[ YourCA ] #most important section of your file
dir             = /var/openssl/yourCA           # Where everything is kept
                                                              # choose any reasonable location
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/newcerts         # default place for new certs.
certificate     = $dir/CA/yourCA.crt  # The CA certificate
serial          = $dir/serial           # The current serial number
#crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/CA/yourCA.crl  # The current CRL
private_key     = $dir/CA/yourCA.key  # The private key
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = supplied
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
localityName            = supplied

# For the 'anything' policy. At this point in time, you must list all 
# acceptable 'object' types.
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

############################################################
[ req ]
default_bits            = 2048
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AR #I'm on ARgentina
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Salta # i.e. the province I live on

localityName                    = Locality Name (eg, city)

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Your company name

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Section Name. # eg. IT
commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name

[ usr_cert ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true

[ crl_ext ]
authorityKeyIdentifier=keyid:always

[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo

[ tsa ]
default_tsa = tsa_config1       # the default TSA section

[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir             = ./demoCA              # TSA root directory
serial          = $dir/tsaserial        # The current serial number (mandatory)
crypto_device   = builtin               # OpenSSL engine to use for signing
signer_cert     = $dir/tsacert.pem      # The TSA signing certificate
                                        # (optional)
certs           = $dir/cacert.pem       # Certificate chain to include in reply
                                        # (optional)
signer_key      = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy  = tsa_policy1           # Policy if request did not specify it
                                        # (optional)
other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional)
digests         = md5, sha1             # Acceptable message digests (mandatory)
accuracy        = secs:1, millisecs:500, microsecs:100  # (optional)
clock_precision_digits  = 0     # number of digits after dot. (optional)
ordering                = yes   # Is ordering defined for timestamps?
                                # (optional, default: no)
tsa_name                = yes   # Must the TSA name be included in the reply?
                                # (optional, default: no)
ess_cert_id_chain       = no    # Must the ESS cert id chain be included?
                                # (optional, default: no)

Glosarium

Sebelum kita melanjutkan sedikit glosarium singkatan yang digunakan dalam file:

  • CA:singkatan dari Otoritas Sertifikat
  • CRL:singkatan dari Daftar Pencabutan Sertifikat
  • CSR:singkatan dari Permintaan Penandatanganan Sertifikat
  • MD:singkatan dari Intisari Pesan
  • TSA:singkatan dari Time Stamping Authority

Repositori sertifikat

Selanjutnya, buat direktori dan (untuk saat ini kosong) file untuk menyimpan kunci dan sertifikat kami:

# cd /var/openssl
# mkdir -p yourCA/CA
# mkdir -p yourCA/newcerts
# mkdir -p yourCA/certs/keys
# mkdir -p yourCA/certs/requests
# mkdir -p yourCA/certs/certificates
# cd yourCA
# touch index.txt
# echo 01 > serial

Sertifikat CA

Sekarang Anda dapat membuat sertifikat Otoritas Sertifikat dan menandatanganinya. Tapi pertama-tama, kita perlu membuat kunci pribadi dengan perintah berikut:

# /usr/local/bin/openssl genrsa -out yourCA/CA/yourCA.key 2048

Kedua, buat CSR dengan menjalankan:

# /usr/local/bin/openssl req -new -key ./yourCA/CA/yourCA.key -out yourCA/CA/yourCA.csr

Ikuti petunjuk di layar, perhatikan untuk mengisi informasi yang benar. Terakhir, tanda tangani sendiri sertifikat Anda:

# /usr/local/bin/openssl x509 -req -days 365 \
> -in yourCA/CA/yourCA.csr -out yourCA/CA/yourCA.crt \
> -signkey yourCA/CA/yourCA.key

Dan ini dia:sekarang Anda dapat mulai menandatangani klien dan atau sertifikat web Anda

Sertifikat klien

Prosesnya sangat mirip dengan yang sebelumnya. Tapi kami menggunakan sertifikat CA kami untuk menandatangani sertifikat klien. Dan, idealnya, klien akan membuat kunci pribadinya sendiri dan CSR.

Bagaimanapun, kami hanya menguji hal-hal, jadi saya melakukan setiap langkah dan kemudian mendistribusikan sertifikat yang dihasilkan ke pengguna saya. Perintah berikut dapat dijalankan di mana saja, tetapi hanya untuk menjaga ketertiban, saya menggunakan folder yang dibuat sebelumnya (di bawah /var/openssl/yourCA/certs ). Pengguna kami, John Doe, memerlukan kunci pribadi terlebih dahulu:

# cd /var/openssl/yourCA/certs
# /usr/local/bin/openssl genrsa -des3 -out keys/johndoe.key 2048

Jangan lupa kata sandi yang akan ditanyakan beberapa kali; selanjutnya buat permintaan penandatanganan sertifikat:

# /usr/local/bin/openssl req -new -key keys/johndoe.key -out requests/johndoe.csr

Selanjutnya, tanda tangani sertifikat dengan perintah ini:

# /usr/local/bin/openssl ca -in requests/johndoe.csr -cert ../CA/yourCA.crt -keyfile ../CA/yourCA.key -out certificates/johndoe.crt

Terakhir, ekspor sertifikat ke format PKCS12, Anda akan dimintai kata sandi PK:

# /usr/local/bin/openssl pkcs12 -export -clcerts -in certificates/johndoe.crt -inkey keys/johndoe.key -out certificates/johndoe.p12

Memasang sertifikat

Sekarang Anda dapat memancarkan sertifikat Anda sendiri yang dibutuhkan pengguna untuk menginstalnya agar dapat menggunakannya. Anda perlu mengirimkan dua file:yourCA.crt dan personal johndoe.p12.

Untuk menginstalnya di windows gunakan Alat Manajer Sertifikat. Saya tidak mengunggah beberapa tangkapan layar karena, karena windows saya dalam bahasa Spanyol, saya tidak akan menganggapnya terlalu berguna. Klik start menu lalu jalankan “certmgr.msc”, akan muncul tampilan berikut:

Klik kanan pada folder Root Certification Authority dan pilih "Impor". Mulailah dengan CA.crt Anda dan pilih Otoritas Sertifikasi Akar toko, ikuti wizard.

Sekarang klik kanan pada folder Personal dan ulangi wizard dengan file johndoe.p12. Anda akan dimintai kata sandi. Ketika wizard selesai, Anda dapat melihat sertifikat valid yang diinstal dan detailnya:

Ingat, ini hanya untuk tujuan pembelajaran. Tapi ini juga soal kepercayaan. Jika organisasi Anda cukup kecil dan ada kepercayaan, Anda harus dapat bekerja dengan sertifikat DIY ini.


Linux
  1. Gagal Menandatangani Csr Dengan Kunci Root Ca?

  2. Buat permintaan penandatanganan sertifikat

  3. Openssl :kesalahan sertifikat yang ditandatangani sendiri dalam rantai sertifikat

  1. Menguji Koneksi SSL dengan SSLyze, Nmap atau OpenSSL

  2. Hasilkan Sidik Jari Hpkp Untuk Semua Rantai Sertifikat?

  3. Bagaimana Cara Menghasilkan Permintaan Penandatanganan Sertifikat (CSR) dengan OpenSSL?

  1. Bagaimana cara mengkompilasi file .c dengan menyertakan OpenSSL?

  2. Menggunakan openssl untuk mendapatkan sertifikat dari server

  3. Bagaimana cara menyiapkan otoritas sertifikat berfitur lengkap saya sendiri?