Transport layer security (TLS) adalah bagian penting dari strategi keamanan apa pun, dan aplikasi di luar server web semakin memanfaatkan perlindungan yang ditawarkan oleh kriptografi kunci publik. Toolkit OpenSSL adalah utilitas dasar yang harus diketahui oleh administrator sistem mana pun jika mereka bertanggung jawab untuk memelihara aplikasi yang dilindungi TLS. Dalam artikel ini, saya menunjukkan beberapa perintah paling umum yang saya gunakan setiap hari. Meskipun banyak artikel berfokus pada pembuatan permintaan penandatanganan sertifikat (CSR) atau sertifikat yang ditandatangani sendiri, artikel ini akan meluangkan waktu untuk meninjau perintah OpenSSL dan satu baris di luar proses pembuatan sertifikat.
[ Anda mungkin juga menikmati: Menyediakan sertifikat CA untuk alat baris perintah Linux ]
Memeriksa validitas sertifikat
Salah satu langkah pemecahan masalah paling umum yang akan Anda lakukan adalah memeriksa validitas dasar dari rantai sertifikat yang dikirim oleh server, yang dapat dilakukan dengan openssl s_client
memerintah. Contoh di bawah ini menunjukkan rantai sertifikat yang berhasil diverifikasi yang dikirim oleh server (redhat.com) setelah koneksi pada port 443. -brief
flag mengecualikan beberapa keluaran yang lebih bertele-tele yang biasanya ditampilkan oleh OpenSSL. Perhatikan bahwa "Verifikasi" dihasilkan sebagai "Oke".
Secara default, openssl s_client
akan membaca dari input standar untuk data yang akan dikirim ke server jauh. Menambahkan echo
ke one-liner mengirim baris baru dan segera mengakhiri koneksi. Tanpa ini, Anda perlu menekan Ctrl+C untuk keluar dari koneksi.
$ echo | openssl s_client -connect redhat.com:443 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = North Carolina, L = Raleigh, O = "Red Hat, Inc.", OU = Information Technology, CN = *.redhat.com
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed
Server Temp Key: ECDH, P-256, 256 bits
DONE
Bandingkan output di atas dengan contoh di bawah ini. Dalam keluaran ini, Anda dapat dengan jelas melihat bahwa verifikasi gagal dengan kesalahan:“sertifikat yang ditandatangani sendiri.”
$ echo | openssl s_client -connect self-signed.badssl.com:443 -brief
depth=0 C = US, ST = California, L = San Francisco, O = BadSSL, CN = *.badssl.com
verify error:num=18:self signed certificate
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = California, L = San Francisco, O = BadSSL, CN = *.badssl.com
Hash used: SHA512
Signature type: RSA
Verification error: self signed certificate
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits
DONE
Menentukan kapan sertifikat kedaluwarsa
Setiap sysadmin telah mengalami rasa malu yang mengikuti dari membiarkan sertifikat untuk situs web yang menghadap publik kedaluwarsa. Ada banyak alat pemantauan untuk mengawasi hal ini dan memastikan bahwa itu tidak terjadi pada Anda, tetapi bagaimana jika Anda hanya ingin cepat memeriksa tanggal kedaluwarsa sertifikat dari baris perintah? OpenSSL telah membantu Anda.
Memeriksa tanggal kedaluwarsa sertifikat melibatkan satu baris yang terdiri dari dua perintah OpenSSL:s_client
dan x509
. Anda sudah melihat bagaimana s_client
membuat koneksi ke server dalam contoh sebelumnya. Dengan menyalurkan output ke x509
, Anda dapat memperoleh masa berlaku sertifikat dengan menggunakan -dates
bendera. Di bawah ini adalah contoh untuk sertifikat yang valid dan yang kedaluwarsa.
# A valid certificate that hasn’t expired yet
$ echo | openssl s_client -connect redhat.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Jul 9 00:00:00 2019 GMT
notAfter=Aug 2 12:00:00 2021 GMT
# A certificate that expired in 2015
$ echo | openssl s_client -connect expired.badssl.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Apr 9 00:00:00 2015 GMT
notAfter=Apr 12 23:59:59 2015 GMT
Catatan :Jika Anda menerima sertifikat SSL default sebagai pengganti sertifikat server, lihat penjelasan SNI (Indikasi Nama Server) ini.
Memeriksa ekstensi sertifikat
Ekstensi X509 memungkinkan bidang tambahan ditambahkan ke sertifikat. Salah satu yang paling umum adalah nama alternatif subjek (SAN). SAN sertifikat memungkinkan beberapa nilai (misalnya, beberapa FQDN) untuk dikaitkan dengan satu sertifikat. SAN bahkan digunakan saat tidak ada banyak nilai karena penggunaan nama umum sertifikat untuk verifikasi tidak digunakan lagi.
Mirip dengan one-liner sebelumnya, output perpipaan antara beberapa perintah OpenSSL memudahkan untuk memeriksa ekstensi sertifikat tertentu dan memungkinkan Anda untuk melihat SAN yang terkait dengan sertifikat:
$ echo | openssl s_client -connect redhat.com:443 2>/dev/null | openssl x509 -noout -ext subjectAltName
X509v3 Subject Alternative Name:
DNS:*.redhat.com, DNS:redhat.com
Kumpulan ekstensi umum lainnya termasuk batasan dasar dan penggunaan kunci sertifikat. Secara khusus, Anda mungkin ingin memeriksa apakah sertifikat diizinkan untuk digunakan sebagai otoritas sertifikat. Sekali lagi, ini dapat dilakukan dengan cara yang sama seperti Anda memeriksa SAN:
$ openssl x509 -ext basicConstraints,keyUsage -noout -in /usr/share/ca-certificates/mozilla/VeriSign_Universal_Root_Certification_Authority.crt
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
Memeriksa cipher atau versi TLS yang tidak digunakan lagi
Alat berbasis web yang sangat baik, seperti Qualys SSL Lab, hadir untuk memberi Anda laporan lengkap tentang keamanan konfigurasi TLS Anda. Ini termasuk memperingatkan Anda tentang penggunaan rangkaian sandi yang tidak aman dan parameter konfigurasi lainnya yang dapat melemahkan postur keamanan sumber daya yang dilindungi TLS. Namun, Anda mungkin hanya ingin menjalankan tes cepat dari baris perintah, dan OpenSSL membuatnya mudah.
Pertama, Anda dapat membuat daftar cipher yang didukung untuk versi SSL/TLS tertentu menggunakan openssl ciphers
memerintah. Di bawah ini, Anda dapat melihat bahwa saya telah mencantumkan cipher yang didukung untuk TLS 1.3. -s
flag memberitahu perintah cipher untuk hanya mencetak cipher yang didukung oleh versi TLS yang ditentukan (-tls1_3
):
$ openssl ciphers -s -tls1_3
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
s_client
perintah kemudian dapat digunakan untuk menguji versi TLS dan rangkaian sandi yang berbeda. Situs web Ciphersuites.info adalah gudang informasi yang berguna tentang kekuatan berbagai suite sandi. Sebagai contoh, mencoba menggunakan rangkaian TLS_PSK_WITH_AES_128_CBC_SHA yang lemah terhadap server yang tidak mendukungnya akan mengakibatkan kesalahan:
openssl s_client -connect redhat.com:443 -cipher PSK-AES128-CBC-SHA -quiet -no_tls1_3
139963477378368:error:141A90B5:SSL routines:ssl_cipher_list_to_bytes:no ciphers available:../ssl/statem/statem_clnt.c:3794:No ciphers enabled for max supported SSL/TLS version
Demikian pula, Anda dapat menentukan versi protokol TLS yang digunakan dalam koneksi. Contoh di bawah ini menunjukkan bahwa TLS 1.1 tidak didukung oleh server. Pastikan untuk meninjau halaman manual untuk melihat daftar lengkap opsi.
$ openssl s_client -connect redhat.com:443 -tls1_1 -quiet
139890998576448:error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available:../ssl/statem/statem_clnt.c:1112:
Memeriksa sertifikat
Saya telah membahas bagian tertentu dari sertifikat, seperti tanggal validitas atau ekstensi X509. Terkadang, Anda hanya ingin melihat segala sesuatu tentang sertifikat tertentu. Utilitas X509 dapat digunakan dengan -noout
(untuk menekan pencetakan sertifikat yang disandikan), -text
(untuk mencetak informasi teks tentang sertifikat), dan -in
(untuk menentukan file input) bendera untuk mencetak semua yang ingin Anda ketahui tentang sertifikat tertentu. Contoh di bawah ini menggunakan file sertifikat pada sistem lokal saya, tetapi Anda dapat dengan mudah menyalurkan output dari openssl s_client
, seperti yang terlihat pada contoh sebelumnya.
$ openssl x509 -text -noout -in /usr/share/ca-certificates/mozilla/VeriSign_Universal_Root_Certification_Authority.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
40:1a:c4:64:21:b3:13:21:03:0e:bb:e4:12:1a:c5:1d
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2008 VeriSign, Inc. - For authorized use only", CN = VeriSign Universal Root Certification Authority
Validity
Not Before: Apr 2 00:00:00 2008 GMT
Not After : Dec 1 23:59:59 2037 GMT
Subject: C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2008 VeriSign, Inc. - For authorized use only", CN = VeriSign Universal Root Certification Authority
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:c7:61:37:5e:b1:01:34:db:62:d7:15:9b:ff:58:
5a:8c:23:23:d6:60:8e:91:d7:90:98:83:7a:e6:58:
19:38:8c:c5:f6:e5:64:85:b4:a2:71:fb:ed:bd:b9:
da:cd:4d:00:b4:c8:2d:73:a5:c7:69:71:95:1f:39:
3c:b2:44:07:9c:e8:0e:fa:4d:4a:c4:21:df:29:61:
8f:32:22:61:82:c5:87:1f:6e:8c:7c:5f:16:20:51:
44:d1:70:4f:57:ea:e3:1c:e3:cc:79:ee:58:d8:0e:
c2:b3:45:93:c0:2c:e7:9a:17:2b:7b:00:37:7a:41:
33:78:e1:33:e2:f3:10:1a:7f:87:2c:be:f6:f5:f7:
42:e2:e5:bf:87:62:89:5f:00:4b:df:c5:dd:e4:75:
44:32:41:3a:1e:71:6e:69:cb:0b:75:46:08:d1:ca:
d2:2b:95:d0:cf:fb:b9:40:6b:64:8c:57:4d:fc:13:
11:79:84:ed:5e:54:f6:34:9f:08:01:f3:10:25:06:
17:4a:da:f1:1d:7a:66:6b:98:60:66:a4:d9:ef:d2:
2e:82:f1:f0:ef:09:ea:44:c9:15:6a:e2:03:6e:33:
d3:ac:9f:55:00:c7:f6:08:6a:94:b9:5f:dc:e0:33:
f1:84:60:f9:5b:27:11:b4:fc:16:f2:bb:56:6a:80:
25:8d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
1.3.6.1.5.5.7.1.12:
0_.].[0Y0W0U..image/gif0!0.0...+..............k...j.H.,{..0%.#http://logo.verisign.com/vslogo.gif
X509v3 Subject Key Identifier:
B6:77:FA:69:48:47:9F:53:12:D5:C2:EA:07:32:76:07:D1:97:07:19
Signature Algorithm: sha256WithRSAEncryption
4a:f8:f8:b0:03:e6:2c:67:7b:e4:94:77:63:cc:6e:4c:f9:7d:
0e:0d:dc:c8:b9:35:b9:70:4f:63:fa:24:fa:6c:83:8c:47:9d:
3b:63:f3:9a:f9:76:32:95:91:b1:77:bc:ac:9a:be:b1:e4:31:
21:c6:81:95:56:5a:0e:b1:c2:d4:b1:a6:59:ac:f1:63:cb:b8:
4c:1d:59:90:4a:ef:90:16:28:1f:5a:ae:10:fb:81:50:38:0c:
6c:cc:f1:3d:c3:f5:63:e3:b3:e3:21:c9:24:39:e9:fd:15:66:
46:f4:1b:11:d0:4d:73:a3:7d:46:f9:3d:ed:a8:5f:62:d4:f1:
3f:f8:e0:74:57:2b:18:9d:81:b4:c4:28:da:94:97:a5:70:eb:
ac:1d:be:07:11:f0:d5:db:dd:e5:8c:f0:d5:32:b0:83:e6:57:
e2:8f:bf:be:a1:aa:bf:3d:1d:b5:d4:38:ea:d7:b0:5c:3a:4f:
6a:3f:8f:c0:66:6c:63:aa:e9:d9:a4:16:f4:81:d1:95:14:0e:
7d:cd:95:34:d9:d2:8f:70:73:81:7b:9c:7e:bd:98:61:d8:45:
87:98:90:c5:eb:86:30:c6:35:bf:f0:ff:c3:55:88:83:4b:ef:
05:92:06:71:f2:b8:98:93:b7:ec:cd:82:61:f1:38:e6:4f:97:
98:2a:5a:8d
Menghasilkan beberapa data acak
Pada titik ini, Anda merasa nyaman dengan menghubungkan ke server dan memeriksa sertifikat. Saya akan mengakhiri dengan satu trik terakhir yang sering berguna bagi saya. openssl rand
perintah dapat digunakan untuk menghasilkan byte pseudo-acak. -base64
flag akan base64 mengkodekan output, memberi Anda string acak yang dapat digunakan sebagai kata sandi atau untuk aplikasi lain yang memerlukan string acak. Pastikan saja jumlah byte habis dibagi tiga untuk menghindari padding.
$ openssl rand -base64 9
Emo+xQINmYoU
[ Dapatkan buku gratis ini dari Red Hat dan O'Reilly - Operator Kubernetes:Mengotomatiskan Platform Orkestrasi Kontainer. ]
Menutup
Dalam artikel ini, Anda mempelajari beberapa perintah OpenSSL dasar yang dapat membuat kehidupan sehari-hari Anda sebagai administrator sistem menjadi lebih mudah. OpenSSL adalah seperangkat alat (dan perpustakaan perangkat lunak) yang sangat kuat, dan artikel ini hanya menyentuh permukaan fungsinya. Namun, perintah ini merupakan titik awal yang baik untuk mengembangkan pengetahuan OpenSSL lebih lanjut dan seperangkat alat yang berguna untuk dimiliki di kotak alat sysadmin mana pun yang secara teratur bekerja dengan server yang dilindungi TLS.